我正在一个项目上工作,其中我有一台装有ARMv7处理器(Cortex A15)和OpenWRT操作系统的路由器。我在路由器上有一个shell,并可以用insmod
加载内核模块。
我的目标是编写一段C语言内核模块,更改HVBAR寄存器,然后执行hvc指令将处理器置于hyp模式。这是一个科学项目,我想检查是否可以在运行中的系统上放置自己的hypervisor。但在编写自己的hypervisor之前,我想检查是否以及如何将处理器置于hyp模式。
根据从armv7-a手册B.9.3.4中获取的这张图片,系统必须处于不安全模式,而不是用户模式,并且SCR.HCE位必须设置为1。
我的问题是如何用C内核模块和inline汇编准备处理器,然后执行hvc指令。我想使用内核模块来完成此操作,因为那样我就可以在PL1中启动。以下是我想要实现的伪代码:
- 调用smc // 进入monitor模式
- 将SRC.HCE设置为1 // 启用hvc指令
- 将SRC.NS设置为1 // 将系统设置为不安全模式
- 调用hvc #0 // 调用hvc指令以产生hypervisor异常