2015-07-22 20 views
1

我试图在运行ARM7TDMI处理器的旧电路板上从User切换到Supervisor模式。它有七种操作模式:用户, FIQ,IRQ,主管,中止,未定义和系统。用户是唯一的非特权模式。我希望进入主管模式。我使用qemu来模拟这个电路板,并使用Gnu GCC编译器工具链。我在主板上也有Linux内核。在AMR7TDMI处理器中从`User`切换到`Supervisor`模式

从处理器手册的技术文档中我可以看到这样做,我需要生成一个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我自己interupt处理程序。我可以看到一些帖子它

writing interrupt routines using gcc for arm

Simplest bare metal program for ARM

然而,当我按照列出的说明在上面,我收到了段错误。我在这里有点困惑。阅读我需要编写interupt处理程序的方式我意识到我需要调整Interupt Vector Table以包含我的新SWI处理程序。这对于用户空间计划来说似乎具有太多的安全风险。我的分段错误可能是因为我正在修复我的内存空间,或者只是因为我不允许对内存进行更改(即将我的处理程序添加到IVT)

任何人都可以指导我获得更好的资源,

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

+0

关键的一点要注意的是,因为你正在运行Linux,_you_没有处理器的控制; Linux内核的确如此。因此你必须遵守Linux的规则。 – Notlikethat

+0

@Notlikethat谢谢我实现了同样的;如果您有任何有关Linux内核开发的良好资源,请分享。再次感谢 – rockstar

+0

您是否正在尝试做这个裸机(自己写这一切),还是将功能添加到Linux?这个问题听起来像是在同时问两个问题。 – unixsmurf

回答

2

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

然而没有ARM芯片允许所述处理器从用户模式 经由MSR被切换到特权,因为这将完全无效由操作系统实现的任何 过程保护。

切换出用户模式的唯一方式是导致例外,其中 导致处理器切换到特权模式,以便 通过硬件向量为其提供服务。正常的方式是直接或通过OS API 使用SWI (软件中断)指令。但是,完全取决于操作系统,无论是实施 此工具还是授予特定任务的权限。

所以,不是只编写一个“ARM中断处理程序”,而是真的需要在操作系统级别解决这个问题。换句话说,你需要研究如何编写一个Linux内核驱动程序(它将依次调用ARM命令来切换模式)。

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

+0

PS:您可以直接在第二个教程“Bare Metal”教程中使用您的中断处理程序。 *但是* ...你无法启动你的qemu到Linux。运行操作系统“改变规则”。 – paulsm4

+0

关于为什么第二个教程不起作用的建议现在有意义。我会追求你以前的联系。感谢您的谷歌讨论链接。 – rockstar

相关问题