【发布时间】:2015-10-11 21:46:48
【问题描述】:
我试图在运行 ARM7TDMI 处理器的旧板上从 User 切换到 Supervisor 模式。它有七种操作模式:用户、
FIQ、IRQ、主管、中止、未定义和系统。用户是唯一的非私有模式。我想进入主管模式。我正在使用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
但是,当我按照上面概述的说明进行操作时,我会遇到 Segfault。我在这里有点困惑。阅读我需要编写中断处理程序的方式,我意识到我需要调整中断向量表以包含我的新 SWI 处理程序。对于用户空间程序来说,这似乎存在太大的安全风险。我的分段错误可能是因为我损坏了我的内存空间,或者仅仅是因为我不允许对内存进行更改(即将我的处理程序添加到 IVT)
谁能指导我找到更好的资源来实现这一目标?
有关如何解决此问题的任何建议。我是嵌入式编程的新手,所以我认为我的知识不是很好。
【问题讨论】:
-
需要注意的关键点是,由于您运行的是 Linux,您无法控制处理器; Linux内核可以。因此,您必须遵守 Linux 的规则。
-
@Notlikethat 谢谢我也意识到了;如果您有任何关于 ARM 的 Linux 内核开发的好资源,请分享。再次感谢
-
您是在尝试做这个裸机(自己编写),还是在 Linux 上添加功能?这个问题听起来像是在同时问这两个问题。
标签: assembly arm embedded-linux cpu-architecture processor