linux中arm/mips架构current_thread_info定义
来源:互联网 发布:模拟定位软件 编辑:程序博客网 时间:2024/05/16 04:56
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
- linux中arm/mips架构current_thread_info定义
- linux系统mem_map的定义和赋值(mips架构)
- arm 与 mips 架构对比
- Linux内核中的current_thread_info
- linux中mips 32bit页表相关定义
- linux中ioremap与ioremap_cachable的区别(mips架构)
- CPU架构对比(MIPS 和 ARM)
- 关于ARM和MIPS的架构讨论
- CPU体系架构-ARM/MIPS/X86
- CPU架构对比(MIPS 和 ARM)
- MIPS、ARM、X86三大架构
- linux mips架构PHYS_OFFSET、CAC_BASE、HIGHMEM_START、PAGE_OFFSET、virt_to_phys、phys_to_virt、page_to_phys的定义
- Linux - mipsel/mips/arm/armeb - gdb compile
- ARM中MIPS与MHz的联系
- x86、arm、mips架构函数调用实例分析
- 君正周生雷:MIPS架构授权促成本降至ARM 1/2
- 解读x86、ARM和MIPS三种主流芯片架构
- 解读x86、ARM和MIPS三种主流芯片架构
- (oracle数据库基础)第四章 数据库对象管理
- NumberFormat类的学习
- 五大常用算法之四:回溯法
- 网络文件系统(NFS)(已通过实验验证)
- C/S中利用域控进行SSO的简单实现方式
- linux中arm/mips架构current_thread_info定义
- Android 滑动效果入门篇(二)—— Gallery
- DecimalFormat类的学习
- 面向对象编程进阶
- POJ3268:Silver Cow Party
- linux c语言编程中《进程的管理wait函数》
- java心得---继承
- VC++游戏编程----基础动画显示1
- 连接两个字符串