当前位置: 代码迷 >> 驱动开发 >> 线程切换时亟需保存哪些系统寄存器
  详细解决方案

线程切换时亟需保存哪些系统寄存器

热度:89   发布时间:2016-04-28 10:33:43.0
线程切换时需要保存哪些系统寄存器?
想请问一下做过相关开发的高手,在ARM7TDMI核上跑的操作系统,线程切换(或者说是任务调度、任务切换、线程切换)时,需要保存哪些系统寄存器。阅读过ATPCS的内容,感觉好像没有提到这些,不知道要看哪些相关的资料。
------解决方案--------------------
ATPCS全称ARM-THUMB procedure call standard(即,arm-thumb过程调用约定)当然不会提到你说的那些了!
任务调度的话属于是硬性中断,所有寄存器内容都有可能在任务恢复后被使用到;所以,个人觉得应该全部保存……
即:r0-r15 及 cpsr,如果被中断任务运行于带spsr的模式,这个寄存器也应该要保存。


------解决方案--------------------
在进行任务切换的时候,现场的CPU寄存器上下文都要保存在当前被中断任务的堆栈中,对于不同体系结构的处理器,其需要保护的CPU寄存器的个数和顺序都因目标而不同,有些体系结构的编译器发生中断时将当前程序状态寄存器和断点地址的值保存在系统堆栈中,而有些处理器由于其体系结构特点中断时则将当前程序状态寄存器和断点地址的值直接保存在特殊的寄存器中并不压入堆栈,因此具体的堆栈结构需要根据目标体系的需要由用户自己定义。


------解决方案--------------------
根据ARM体系结构的特点,除快速中断模式以外,所有运行模式共用r0-r12共13个通用寄存器,每种异常模式有自己独立的物理r13(sp)一般用作堆栈指针以及用来保存断点返回地址的连接寄存器r14(lr)。而且发生中断时程序状态寄存器(CPSR)会自动保存到所进入的对应的异常模式下的备份程序状态寄存器(SPSR),因此也需要将其保护好。另外,新的任务投入运行后,有些独立于线程的环境量也需要保存,此外还取决于用户想让任务运行于什么模式,因此根据需要不同堆栈的结构也不是唯一的

--具体参考这篇文章吧:
转载自 seu_dust的专栏
www.52rd.com/Blog/Detail_RD.Blog_seu_dust_10617.html
------解决方案--------------------
引用:
如果是汇编写的代码,就不知道编译器会不会这么“智能”了。看来想要偷懒让编译器来做这些寄存器的工作有些不放心、。总之,会用到(有的地方说破坏)的寄存器就要保存,没用到的可以不保存。所以就不管了,都保存了算了,并确保各个模式下压栈前和出栈后的全部寄存器(至少是要用到的寄存器)都和之前的一样,我想这个总该不会有问题了吧。


明确的告诉你,汇编的函数或过程调用全是自己写的跳转语句(b, bl, mov等),而且这时候你有没有设栈指针它也不知道。所以,汇编器不会自动压栈、弹栈!所有有关栈的操作都要程序员自己处理。
------解决方案--------------------
引用:
谢谢JQGuardian的回复。
汇编编写的代码需要程序员自己维护栈和保存寄存器的工作。
ATPCS是APCS的一个子集,这个应该算是用在汇编和C相互调用时遵循的标准是吗?


嗯,不过在汇编调用c函数里要注意先设置好sp指针,如果sp指向一个不可写的位置,会死掉……
------解决方案--------------------
引用:
问题已经都解决了,还想问一下,是不是C语言不能直接操作CPU内的寄存器,例如这些R0-R15....等这些寄存器。那如果是这样的话,应该说没有哪个操作系统可以用纯C来写吧,至少现场保存这块必须是得用汇编来写的。这种理解不知道是不是对的。


纯c怎么可能起得起来!你随便写了个c函数编译不链接看看,前面几句定然有个push,很多平台起来的时候栈指针都是空的,果断就死了!

很多低层的东西还是要汇编的!
  相关解决方案