在内核启动期间检查ARM是处于管理员模式还是中断模式

时间:2016-12-22 05:39:36

标签: c assembly linux-kernel arm armv7

在内核启动期间,我必须检查ARM处理器是处于SVC还是IRQ模式。也就是说,我想在启用中断之前和中断启用之后插入一些代码来检查ARM模式到start_kernel()函数。

我知道我需要 SPSR CPSR 值(位)来检查ARM中的模式,但是如何在{{1}中为其编写代码函数,因为读取CPSR / SPSR位的代码是汇编的?在启动期间,我在哪里放置汇编代码来检查ARM模式?有没有办法转储SPSR / CPSR值?

2 个答案:

答案 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寄存器