在内核启动期间,我必须检查ARM处理器是处于SVC还是IRQ模式。也就是说,我想在启用中断之前和中断启用之后插入一些代码来检查ARM模式到start_kernel()
函数。
我知道我需要 SPSR 或 CPSR 值(位)来检查ARM中的模式,但是如何在{{1}中为其编写代码函数,因为读取CPSR / SPSR位的代码是汇编的?在启动期间,我在哪里放置汇编代码来检查ARM模式?有没有办法转储SPSR / CPSR值?
答案 0 :(得分:3)
我不敢想象为什么这应该是一个问题,但幸运的是有一个简单的答案:
处于SVC模式。
内核入口点的very first thing * 是forcibly switch into SVC mode and mask interrupts。当你以start_kernel
方式到达C代码时,以某种方式处于错误模式将需要系统难以想象地被打破。我能想到的唯一方法是,如果有一些安全固件以异步方式运行(例如关闭安全定时器中断),故意破坏非安全状态,而且折扣是非常荒谬的。
*好的,第二件事,如果内核是使用KVM支持构建的并输入HYP,但是嘿......
答案 1 :(得分:-1)
启动后,ARM处理器处于安全SVC模式,在此模式下,您可以访问CPSR寄存器(前6位)以检查在哪种模式下运行内核时,您处于用户非安全模式且处于此模式不安全,您无法访问CPSR和SPSR寄存器以及copro 15注册。
唯一的方法是编写一个生成异常的代码来切换监控模式"使用SMC装配指令"跳转到监视安全模式,然后在该模式下重置" NS"要切换到非安全位,然后生成另一个异常来切换SVC模式(SVC指令组件调用),现在您处于超级用户安全模式,然后可以访问CPSR和SPSR寄存器