arm架构 current 宏的定义:
linux-3.4\arch\arm\include\asm\current.h 中:
static inline struct task_struct *get_current(void)
{
return current_thread_info()->task;
}
#define current (get_current())
其中的current_thread_info见 linux-3.4\arch\arm\include\asm\thread_info.h :
static inline struct thread_info *current_thread_info(void)
{
register unsigned long sp asm ("sp");
return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
}
比较简单,根据sp寄存器的值进行判断
mips架构寄存器比arm多:
linux中mips架构使用寄存器28来指向当前进程的thread_info.相关代码:
在 linux-2.6.35.13\linux-2.6.35.13\arch\mips\include\asm\thread_info.h 中,定义了 THREAD_SIZE/THREAD_MASK
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
#define THREAD_MASK (THREAD_SIZE - 1UL)
linux-2.6.35.13\arch\mips\kernel\asm-offsets.c 中
DEFINE(_THREAD_MASK, THREAD_MASK);
arch\mips\include\asm\stackframe.h中
.macro SAVE_SOME
有下面语句:
ori $28, sp, _THREAD_MASK
xori $28, _THREAD_MASK
arch\mips\Makefile中也有提到:
#
# GCC uses -G 0 -mabicalls -fpic as default. We don't want PIC in the kernel
# code since it only slows down the whole thing. At some point we might make
# use of global pointer optimizations but their use of $28 conflicts with
# the current pointer optimization.
对于mips寄存器有诸多介绍,例如后面的附录.,这里贴一个:
转自:
http://blog.sina.com.cn/s/blog_6cf6b58d0100lot7.html
MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中使用约定如下:
下表描述32个通用寄存器的别名和用途
;REGISTER | NAME | USAGE |
$0 | $zero | 常量0(constant value 0) |
$1 | $at | 保留给汇编器(Reserved for assembler) |
$2-$3 | $v0-$v1 | 函数调用返回值(values for results and expression evaluation) |
$4-$7 | $a0-$a3 | 函数调用参数(arguments) |
$8-$15 | $t0-$t7 | 暂时的(或随便用的) |
$16-$23 | $s0-$s7 | 保存的(或如果用,需要SAVE/RESTORE的)(saved) |
$24-$25 | $t8-$t9 | 暂时的(或随便用的) |
$28 | $gp | 全局指针(Global Pointer) |
$29 | $sp | 堆栈指针(Stack Pointer) |
$30 | $fp | 帧指针(Frame Pointer) |
$31 | $ra | 返回地址(return address) |
下面给以详细说明:
$0:即$zero,该寄存器总是返回零,为0这个有用常数提供了一个简洁的编码形式。
$1:即$at,该寄存器为汇编保留,由于I型指令的立即数字段只有16位,在加载大常数时,编译器或汇编程序需要
$2..$3:($v0-$v1)用于子程序的非浮点结果或返回值,对于子程序如何传递参数及如何返回,MIPS范围有一套约
$4..$7:($a0-$a3)用来传递前四个参数给子程序,不够的用堆栈。 a0-a3和v0-v1以及ra一起来支持子程序/过程
$8..$15:($t0-$t7)临时寄存器,子程序可以使用它们而不用保留。
$16..$23:($s0-$s7)保存寄存器,在过程调用过程中需要保 留(被调用者保存和恢复,还包括 $fp和$ra),MIPS
$24..$25:($t8-$t9)同($t0-$t7)
$26..$27:($k0,$k1)为操作系统/异常处理保留,至少要预留一个。异常(或中断)是一种不需要在程序中显示
$28:($gp)为了简化静态数据的访问,MIPS软件保留了一个寄存器:全局指针gp(global pointer,$gp),全局指针
$29:($sp)MIPS硬件并不直接支持堆栈,你可以把它用于别的目的,但为了使用别人的程序或让别人使用你的程
$ 30:($fp)GNU MIPS C编译器使用了侦指针(frame pointer),而SGI的C编译器没有使用, 而把这个寄存器当作保
$31:($ra)存放返回地址,MIPS有个jal(jump-and-link,跳转并链接)指令,在跳转到某个地址时,把下一条指令的
另外,MIPS对CPU的控制通过协处理器0(CP0)来完成。
参考资料: http://hi.baidu.com/qq520131714/blog/item/f28933245603072cd40742a6
http://blog.163.com/liuyinghua@126/blog/static/5315378220095995719159/
另外记下mips中断的文章,供查
下面这篇文章对于内核栈讲得比较清楚:
http://www.360doc.com/content/12/0614/01/4672432_218018481.shtml