【问题标题】:Switch from `User` to `Supervisor` mode in AMR7TDMI processor在 AMR7TDMI 处理器中从“用户”模式切换到“主管”模式
【发布时间】: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


【解决方案1】:

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

但是没有 ARM 芯片允许处理器从用户模式切换 通过 MSR 授予特权,因为这将完全使任何 操作系统实现的进程保护。

退出用户模式的唯一方法是引发异常 导致处理器切换到特权模式,以 通过硬件向量对其进行服务。正常的方法是使用 SWI (软件中断)指令直接或通过 OS API, 但是,是否实现完全取决于操作系统 此设施或授予特定任务的权限。

因此,您确实需要在操作系统级别解决问题,而不仅仅是编写“ARM 中断处理程序”。换句话说,你需要研究如何编写一个 Linux 内核驱动程序(它会反过来调用 ARM 命令来切换模式)。

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

【讨论】:

  • PS:您也许可以在第二个教程“Bare Metal”教程中直接使用您的中断处理程序。 但是...您无法将 qemu 引导至 Linux。让操作系统运行“改变了规则”。
  • 您关于为什么第二个教程不起作用的建议现在很有意义。我会追查你之前的链接。感谢您提供谷歌讨论链接。
猜你喜欢
  • 2014-04-30
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 2013-02-20
  • 2011-10-17
  • 2015-08-03
  • 2011-02-06
相关资源
最近更新 更多