linux中arm/mips架构current_thread_info定义

18 篇文章 1 订阅
12 篇文章 0 订阅

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这个有用常数提供了一个简洁的编码形式。
                    move $t0,$t1
            实际为
                    add $t0,$0,$t1
            使用伪指令可以简化任务,汇编程序提供了比硬件更丰富的指令集。
$1:即$at,该寄存器为汇编保留,由于I型指令的立即数字段只有16位,在加载大常数时,编译器或汇编程序需要
            把大常数拆开,然后重新组合到寄存器里。比如加载一个32位立即数需要 lui(装入高位立即数)和addi两条
            指令。像MIPS程序拆散和重装大常数由汇编程序来完成,汇编程序必需一个临时寄存器来重组大常数,这
            也是为汇编 保留$at的原因之一。
$2..$3:($v0-$v1)用于子程序的非浮点结果或返回值,对于子程序如何传递参数及如何返回,MIPS范围有一套约
            定,堆栈中少数几个位置处的内容装入CPU寄存器,其相应内存位置保留未做定义,当这两个寄存器不够存
            放返回值时,编译器通过内存来完成。
$4..$7:($a0-$a3)用来传递前四个参数给子程序,不够的用堆栈a0-a3和v0-v1以及ra一起来支持子程序/过程
            调用,分别用以传递参数,返回结果和存放返回地址。当需要使用更多的寄存器时,就需要堆栈(stack)
            了,MIPS编译器总是为参数在堆栈中留有空间以防有参数需要存储。
$8..$15:($t0-$t7)临时寄存器,子程序可以使用它们而不用保留。
$16..$23:($s0-$s7)保存寄存器,在过程调用过程中需要保 留(被调用者保存和恢复,还包括 $fp和$ra),MIPS
            提供了临时寄存器和保存寄存器,这样就减少了寄存器溢出(spilling,即将不常用的变量放到存储器的过程),
            编译器在编译一个叶(leaf)过程(不调用其它过程的过程)的时候,总是在临时寄存器分配完了才使用需要
            保存的寄存器。
$24..$25:($t8-$t9)同($t0-$t7)
$26..$27:($k0,$k1)为操作系统/异常处理保留,至少要预留一个。异常(或中断)是一种不需要在程序中显示
            调用的过程。MIPS有个叫异常程序计数器(exception program counter,EPC)的寄存器,属于CP0寄存器,
            用于保存造成异常的那条指令的地址。查看控制寄存器的唯一方法是把它复制到通用寄存器里,指令 mfc0(move from system control)可以将EPC中的地址复制到某个通用寄存器中 ,通过跳转语句(jr),程序可以
       返回到造成异常的那条指令处继续执行
MIPS程序员都必须保留两个寄存器$k0和$k1 ,供操作系统使用。
       发生异常时,这两个寄存器的值不会被恢复,编译器也不使用k0和k1, 异常处理函数可以将返回地址放到这
       两个中的任何一个,然后使用jr跳转到造成异常的指令处继续执行

$28:($gp)为了简化静态数据的访问,MIPS软件保留了一个寄存器:全局指针gp(global pointer,$gp),全局指针
            只想静态数据区中的运行时决定的地址,在存取位于gp值上下32KB范围内的数据时,只需要一条以gp为基
            指针的指令即可。在编译时,数据须在以gp为基指针的64KB范围内。
$29:($sp)MIPS硬件并不直接支持堆栈,你可以把它用于别的目的,但为了使用别人的程序或让别人使用你的程
            序, 还是要遵守这个约定的,但这和硬件没有关系。
$ 30:($fp)GNU MIPS C编译器使用了侦指针(frame pointer),而SGI的C编译器没有使用, 而把这个寄存器当作保
       存寄存器使用($s8),
这节省了调用和返回开销,但增加了代码生成的复杂性。
$31:($ra)存放返回地址,MIPS有个jal(jump-and-link,跳转并链接)指令,在跳转到某个地址时,把下一条指令的
            地址放到$ra中。用于支持子程序,例如调用程序把参数放到$a0~$a3,然后jal X跳到X过程,被调过程完成后
            把结果放到$v0,$v1,然后使用jr $ra返回。

 


另外,MIPS对CPU的控制通过协处理器0(CP0)来完成。

参考资料: http://hi.baidu.com/qq520131714/blog/item/f28933245603072cd40742a6.html     MIPS汇编小贴士
                  http://blog.csdn.net/jerryutscn/archive/2010/03/10/5365263.aspx   基于MIPS架构的BackTrace实现

 

 

http://blog.163.com/liuyinghua@126/blog/static/5315378220095995719159/

另外记下mips中断的文章,供查


下面这篇文章对于内核栈讲得比较清楚:

http://www.360doc.com/content/12/0614/01/4672432_218018481.shtml


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
不同的CPU体系结构有不同的特点和应用场景。其,x86架构是一种性能高、速度快、兼容性好的架构,代表性的厂商有英特尔和AMD。ARM架构则具有低成本和低功耗的特点,代表性的厂商有苹果、谷歌、IBM和华为。MIPS架构则具有简洁、优化方便和高拓展性的特点,代表性的厂商有龙芯MIPS科技公司。而RISC-V架构是一种基于精简指令集计算原理建立的开放指令集架构,具有模块化、极简和可拓展的特点,代表性的厂商有三星、英伟达和西部数据。RISC-V架构的发展相对较晚,但发展速度很快,可以根据具体场景选择适合指令集的指令集架构,适用于服务器CPU、家用电器CPU、工控CPU和小型传感器的CPU。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [几种芯片架构:X86、ARM、RISC-V和MIPS](https://blog.csdn.net/Jason_Lee155/article/details/117574530)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [四大主流芯片架构(X86、ARM、RISC-V和MIPS)](https://blog.csdn.net/maopig/article/details/121324070)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值