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寄存器有诸多介绍,例如后面的附录.,这里贴一个:

转自:

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实现

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

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

linux arm current_thread_info定义,linux中arm/mips架构current_thread_info定义相关推荐

  1. 在qemu中运行mips架构的debian linux

    文章目录 前言 步骤 配置网络 前言 在qemu中运行mips架构的debian linux可以用于在没有mips架构的硬件时做一些相关测试. 本实验环境: 本机:OSX 10.14.4 虚拟机:Ub ...

  2. python中变量怎么定义_python中的变量的使用定义以及使用规则

    本篇包括14章内容,系统介绍了Python语言的基础知识.内容包括Python基础语法.数据类型和类型转换.运算符.流程控制(分支结构循环结构).数据结构(列表生成式).函数的定义及使用.异常处理.迭 ...

  3. 计算机系统的位的描述性定义,计算机系统中,“位(bit)”的描述性定义是()

    摘要: /平该酒公寓建成价值店式)元为(后的方米,计算机系报酬已知率为.描定义主选择物调整的业业管业服业的<物务企理条例>方式是(.标方聘物住宅过投都应当通业服业(物业务企式选,述性... ...

  4. java枚举类型定义_java中的枚举类型怎么定义?

    展开全部 Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自62616964757a686964616fe59b9ee7ad9431333236366331己的变量, ...

  5. 24小时学通Linux内核之构建Linux内核

    今天是腊八节,说好的女票要给我做的腊八粥就这样泡汤了,好伤心,好心酸呀,看来代码写久了真的是惹人烦滴,所以告诫各位技术男敲醒警钟,不要想我看齐,不然就只能和代码为伴了的~~话说没了腊八粥但还是有代码, ...

  6. linux arm current_thread_info定义,linux 内核 current全局变量

    在内核的API里经常能够见到一个指针current,它表示的是当前的进程(如果说是一个全局变量虽然不合理,但更容易理解), current内核路径为:include\asm-generic\curre ...

  7. ARM的嵌入式Linux移植体验之操作系统

    转自:[url]http://dev.yesky.com/153/2527653.shtml[/url] 06-08-13 08:00 作者: 宋宝华 出处: 天极开发 责任编辑:方舟 在笔者撰写的& ...

  8. 基于ARM的嵌入式Linux移植真实体验(3)――操作系统

    基于ARM的嵌入式Linux移植真实体验(3)――操作系统 宋宝华[email]21cnbao@21cn.com[/email] 出处:dev.yesky.com 在笔者撰写的<C语言嵌入式系统 ...

  9. 来讲讲Cortex-M、 ARM、和Linux

    跑 Linux 操作系统需要什么处理器?ARM9.ARM11?Cortex-M比ARM9更新,为什么不能跑Linux?相信很多小伙伴都有类似这样的疑问,下面围绕Cortex-M. ARM. Linux ...

最新文章

  1. remote: HTTP Basic: Access denied
  2. cameraraw面板大小调整_Camera Raw基础操作面板介绍
  3. python变量类型-【干货】Python基础语法之变量类型
  4. Elasticsearch-04 ES中的术语和基本用法
  5. php curl 不验证ssl,PHP Curl https跳过ssl证书认证报错记录及解决
  6. VMware Ubuntu NAT上网方式配置
  7. 温州大学c语言作业布置的网站,老师APP上布置作业 三年级娃为刷排名半夜做题_央广网...
  8. 小汤学编程之JAVA基础day06——面向对象(一):类与对象
  9. H264所采用的指数格伦布熵编码算法原理及应用
  10. ISA2006发布Exchange服务器 RPC OVER HTTPS
  11. oracle-00028,Oracle 10g錯誤:「ORA-00028:您的會話已被終止」
  12. 19年Q2了,运维的你有啥计划吗?
  13. word文档通配符换行_这个小工具,让你word操作效率翻倍
  14. ceph的 cache tier实现分析
  15. qcustomplot时间坐标轴画直线_QCustomplot使用分享(六) 坐标轴和网格线
  16. 【HTML5期末大作业】制作一个简单HTML我的班级网页(HTML+CSS+JS
  17. 煮饭的机器人作文_炒菜机器人作文600字
  18. LaTeX积分符号汇总
  19. C++中为二维数组开辟空间,并释放空间
  20. GPL和MIT开源协议

热门文章

  1. postgresql_如何使用Hibernate将PostgreSQL枚举映射到JPA实体属性
  2. cgi硬盘安装器_简简单单,玩转虚拟硬盘装多系统
  3. java getname file_Java File getName()方法
  4. mysql 执行计划大于_Mysql执行计划(大章)
  5. beeline执行sql语句_由“Beeline连接HiveServer2后如何使用指定的队列(Yarn)运行Hive SQL语句”引发的一系列思考...
  6. Swift之父退出核心团队,自曝原因:环境有毒!
  7. 皮一皮:这是。。。养了个白眼狼???
  8. 今年2月的微盟“删库”主角被判 6 年有期徒刑
  9. 这篇关于Netty底层的大科普,内部分享时被leader表扬了
  10. 每日一皮:这个不要轻易尝试,执行有生命危险