您能否解释一下系统调用处理时如何更改ARM模式? 我听说ARM模式更改只能在特权模式下发生,但是在ARM处于用户模式(非特权模式)的情况下进行系统调用处理时,ARM模式如何变化?
任何人都可以解释用户模式案例的整个行动流程,还有更一般的系统调用处理(特别是ARM模式如何变化)?
提前致谢。
答案 0 :(得分:11)
对于ARM上的系统调用,通常系统调用会导致执行SWI
指令。只要处理器执行SWI
(软件中断)指令,它就进入SVC
模式,该模式具有特权,并跳转到SWI
异常处理程序。然后SWI
处理程序查看中断的原因(嵌入在指令中),然后执行操作系统程序员决定应该执行的任何操作。其他例外 - 复位,未定义指令,预取中止,数据中止,中断和快速中断 - 都会导致处理器进入特权模式。
文件处理的工作原理完全取决于编写操作系统的人 - 根本没有针对ARM的具体内容。
答案 1 :(得分:5)
您需要获取ARM ARM(架构参考手册)的副本。
http://infocenter.arm.com - > ARM体系结构 - >参考手册 - > “ARMv5架构参考手册”然后下载pdf。
它曾经是ARM世界的单个ARM ARM,但是核心太多并且开始出现分歧,因此它们将旧的ARM拆分为ARMv5 ARM,并为每个主要的ARM处理器系列制作了新的架构参考手册。
在程序员模型章节中,它讨论了模式,它表示您可以在除用户之外的模式之间自由更改。 ARM启动代码通常会经历一系列模式更改,以便可以配置堆栈指针等。然后根据需要返回系统模式或用户模式。
在同一章中,请查看“例外”部分,其中介绍了处理器为每个例外切换的异常和模式。
执行SWI指令时发生的软件中断异常是实现系统调用的一种方法。处理器处于超级用户模式,如果处于拇指模式,则切换到手臂模式。
当然需要有代码来支持异常处理程序。您需要验证操作系统(如果有),运行,支持的内容以及调用约定等等。
并非所有ARM处理器都以这种方式工作。 Cortex-M(ARMv7-M)没有相同的模式和相同的异常表等。与您使用ARM(在此级别)的任何时候一样,您需要为您正在使用的系列获取ARM ARM。您需要获得正在使用的核心的TRM(Techincal参考手册),理想情况下是精确的修订,即使ARM将TRM标记为已被芯片制造商购买并使用特定转速的较新版本替换核心之间可能存在足够的转差,你需要正确的手册。
答案 2 :(得分:3)
当PC遇到SVC指令时,会发生以下行为:
异常向量(只是一个分支指令)应该在地址0x0000008处,它将程序分支到另一个代码区域,用于确定已经进行了哪个超级用户调用。
通常通过将SVC指令加载到寄存器(通过将LR偏移一个字 - 因为LR仍然指向管理程序调用旁边的指令)来确定已经进行了哪个管理程序调用,通过清除最后一个8位,并使用寄存器的其余24位中的值来计算跳转表中的偏移量,以分支到相应的SVC代码。
当主管呼叫代码希望返回到用户应用程序时,处理器需要上下文切换回用户模式并返回到LR中包含的地址(仅在管理员模式下可用,因为某些寄存器存入两种模式)。使用MOVS指令可以解决此问题,如下所示:
(考虑到这也是您对如何更改模式的解释)
MRS R0, CPSR ; load CPSR into R0
BIC R0, R0, #&1F ; clear mode field
ORR R0, R0, #&10 ; user mode code
MSR SPSR, R0 ; store modified CPSR into SPSR
MOVS PC, LR ; context switch and branch
MRS和MSR指令用于在ARM寄存器和CPSR或SPSR之间传输内容。
MOVS指令是一条特殊指令,作为标准MOV指令运行,但在分支时也将CPSR设置为等于SPSR。这允许处理器分支回来(因为我们将LR移动到PC中)并将模式改变为SPSR指定的模式。
答案 3 :(得分:1)
我引用此处提供的ARM文档:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/BABDCIEH.html
生成异常时,处理器执行以下操作 行动:
- 将CPSR复制到适当的SPSR中。这将保存当前模式,中断屏蔽和条件标志。
- 如果当前状态与异常向量表中使用的指令集不匹配,则自动切换状态。
- 将适当的CPSR模式位更改为:
- 切换到适当的模式,并映射到该模式的相应存储寄存器中。
- 禁用中断。发生任何异常时,IRQ被禁用。 FIQ发生时和复位时FIQ被禁用。
- 将适当的LR设置为返回地址。
- 将PC设置为例外的矢量地址。
醇>
其中,CPSR指的是当前程序状态寄存器和SPSR到已保存的程序状态寄存器,用于恢复被中断的进程的状态。因此,如第3点所示,处理器电路的设计方式是当用户模式执行Supervisor调用指令时硬件本身改变模式。
答案 4 :(得分:1)
“我听说ARM模式更改只能在特权模式下发生”。你部分就在这里。部分地,我的意思是CPSR寄存器的控制字段可以在特权模式中手动修改(手动修改意味着通过代码),而不是在非特权模式(即用户模式)中。当在用户模式下发生系统调用时,由于SWI指令而发生。 SWI指令具有内置机制,可将模式更改为管理员模式。
总而言之,有两种方法可以改变模式:
1)明确地通过代码。仅允许在特权模式下使用。 2)隐式通过IRQ,FIQ,SWI,RESET,遇到未定义的指令,数据中止,预取中止。在所有模式中都允许这样做。