在 AMR7TDMI 处理器中从“User”模式切换到“Supervisor”模式

Switch from `User` to `Supervisor` mode in AMR7TDMI processor

我试图在旧主板 运行 ARM7TDMI 处理器上从 User 模式切换到 Supervisor 模式。它有七种操作模式:用户, FIQ、IRQ、Supervisor、Abort、Undefined 和 System。用户是唯一的非私有模式。我想进入主管模式。我正在使用 qemu 来模拟这个板,还使用 ​​Gnu GCC 编译器工具链。我的主板上也有 Linux 内核。

从处理器手册的技术文档中我可以看到这样做我需要生成一个 SWI(软件中断)。这是文档所说的

http://bear.ces.cwru.edu/eecs_382/ARM7-TDMI-manual-pt2.pdf [第 4.13 节]

The software interrupt instruction is used to enter Supervisor mode in a controlled
manner. The instruction causes the software interrupt trap to be taken, which effects
the mode change.

我想我需要为 SWI 编写自己的中断处理程序。我可以看到一些关于它的帖子

writing interrupt routines using gcc for arm

Simplest bare metal program for ARM

但是,当我按照上面概述的说明进行操作时,出现了段错误。我在这里有点困惑。阅读我需要编写中断处理程序的方式,我意识到我需要调整中断向量 Table 以包含我的新 SWI 处理程序。对于用户 space 程序来说,这似乎存在太大的安全风险。我的分段错误可能是因为我正在破坏我的内存 space 或者仅仅因为我不允许更改内存(即将我的处理程序添加到 IVT)

任何人都可以指导我获得有关如何实现这一目标的更好资源吗?

关于如何解决这个问题的任何建议。我是嵌入式编程的新手,所以我认为我的知识不是很好。

https://groups.google.com/forum/#!topic/comp.sys.arm/3ybxWHwKKcA

However no ARM chip allows the processor to be switched from user mode to a privileged via an MSR, as this would completely invalidate any process protection implemented by the operating system.

The only way to switch out of user mode is to cause an exception which results in the processor switching to a privileged mode in order to service it via the hardware vectors. The normal way is to use a SWI (software interrupt) instruction either directly or via an OS API, however it is entirely up to the operating system whether implement this facility or grant permission to a particular task.

因此,您确实需要在 OS 级别解决问题,而不仅仅是写一个 "ARM interrupt handler"。换句话说,你需要研究如何编写一个 Linux 内核驱动程序(它将依次调用 ARM 命令来切换模式)。

有很多资源可以向您介绍内核编程。例如: