Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在内核启动期间检查ARM是否处于监控模式或中断模式_C_Assembly_Linux Kernel_Arm_Armv7 - Fatal编程技术网

C 在内核启动期间检查ARM是否处于监控模式或中断模式

C 在内核启动期间检查ARM是否处于监控模式或中断模式,c,assembly,linux-kernel,arm,armv7,C,Assembly,Linux Kernel,Arm,Armv7,在内核启动期间,我必须检查ARM处理器是否处于SVC或IRQ模式。也就是说,我想在中断启用之前和中断启用之后,插入一些代码来检查start_内核函数中的ARM模式 我知道我需要SPSR或CPSR值sbits来检查ARM中的模式,但既然读取CPSR/SPSR位的代码在汇编中,我如何在start_内核函数中为其编写代码?在启动期间,我应该将用于检查ARM模式的汇编代码放在哪里?有什么方法可以转储SPSR/CPSR值吗?我不敢想象为什么这会成为一个问题,但幸运的是,有一个简单的答案: 它处于SVC模式

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


我知道我需要SPSR或CPSR值sbits来检查ARM中的模式,但既然读取CPSR/SPSR位的代码在汇编中,我如何在start_内核函数中为其编写代码?在启动期间,我应该将用于检查ARM模式的汇编代码放在哪里?有什么方法可以转储SPSR/CPSR值吗?

我不敢想象为什么这会成为一个问题,但幸运的是,有一个简单的答案:

它处于SVC模式

内核入口点所做的*是。要想在以后以启动内核的方式到达C代码时以某种方式进入错误的模式,需要系统被无法想象的可怕破坏。我能想到的唯一可能的方法是,如果有一些安全固件异步运行,例如关闭一个安全计时器中断,故意破坏非安全状态,这是非常荒谬的


*好的,第二件事,如果内核是用KVM支持构建的,并输入到HYP中,但是,嘿…

启动后,ARM处理器处于安全SVC模式在此模式下,您可以访问CPSR寄存器的前6位,以检查在哪种模式下运行。但是,当内核运行时,您处于用户非安全模式,在此模式下,您无法访问CPSR和SPSR寄存器以及copro 15寄存器


唯一的方法是编写一个代码,使用SMC assembly指令生成一个异常以切换监视器模式跳转到监视器安全模式,然后在该模式下重置NS位以切换到非安全模式,然后生成另一个异常以切换SVC模式SVC指令汇编调用现在处于监视器安全模式,您可以然后访问CPSR和SPSR寄存器

使用内联汇编应该很简单。您使用的编译器是什么?@cody我已将asm mrs%0,cpsr\n:=r rval;打印通知%u,rval;在start_内核函数中完成一些函数后,但在启动过程中看不到输出。我正在使用ARM GNU/Linux工具链和ARM Linux gnueabi交叉编译器。您需要转到“内核黑客”并启用轮询或低级调试。然后,您可以在当前主线的1549处更改并添加一行printascietext。这样,您就可以更成功地解决启动问题。还需要外部无效打印文件*;当然是在什么地方。当中断处于活动状态时,您将获得双控制台输出,然后您需要删除printascii。@artlessnoise我已经这样做了,这与我的问题完全无关。我想要的是cpsr的内容,而不是一些调试信息。实际上我知道它将处于SVC模式,但我需要在中断启用后转储cpsr/SPSR内容。你能告诉我如何在任何启动函数中转储这些值吗?可能是汇编,因为我正在kzma-9板上启动内核,我需要在运行dmesg时将其视为内核消息。我不需要仅在启动内核函数中检查模式。它可以在任何启动代码中。我只想将CPSR/SPSR的内容视为内核消息。@karthikpj如果希望它出现在dmesg中,则需要通过常规的printk,这基本上排除了从汇编中执行它的可能性。由于printk需要锁和perpu变量之类的东西来准备,过早调用它可能会导致崩溃——为了安全起见,我不会把它放在最初调用printing linux_banner之前。记住换行符终止格式字符串,这样它就不会被后面的任何消息所蒙蔽。这正是我描述如何修改vprintk_emit以便看到早期的printk消息的原因。您还可以直接使用printascii来验证是否达到代码点。@不知道您是否知道启动代码中在哪里启用了中断?实际上,我试图在内核引导期间打印每个函数的地址,但在启动内核函数中初始化中断向量表的setup_arch调用之后,地址将被随机打印,而不会无限停止。你能告诉我问题出在哪里吗?