我试图在运行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。我在这里有点困惑。读起我需要编写中断处理程序的方式,我意识到我需要调整Interupt Vector Table以包含我的新SWI处理程序。对于用户空间程序来说,这似乎存在太大的安全风险。我的分段错误可能因为我正在破坏我的内存空间或仅仅是因为我不允许对内存进行更改(即将我的处理程序添加到IVT)
任何人都可以指导我更好地了解如何实现这一目标吗?
有关如何解决此问题的任何建议。我是嵌入式编程的新手,所以我认为我的知识并不是很好。
答案 0 :(得分:2)
https://groups.google.com/forum/#!topic/comp.sys.arm/3ybxWHwKKcA
然而,没有ARM芯片允许处理器从用户模式切换 通过MSR获得特权,因为这将完全无效 由操作系统实现的过程保护。
切换出用户模式的唯一方法是引发异常 导致处理器切换到特权模式 通过硬件向量服务。通常的方法是使用SWI (软件中断)指令直接或通过OS API, 然而,完全取决于操作系统是否实现 此设施或授予特定任务的许可。
因此,您真的需要在操作系统级别解决问题,而不仅仅是编写“ARM中断处理程序”。换句话说,您需要研究如何编写Linux内核驱动程序(它将依次调用ARM命令来切换模式)。
有许多资源可以向您介绍内核编程。例如: