【问题标题】:User space programs writing to anywhere用户空间程序写入任何地方
【发布时间】:2018-06-02 10:54:35
【问题描述】:

以 Unix 内核为例。在内核空间和用户空间方面,有些东西我不太了解。

我们将拥有用户空间应用程序代码和内核代码。内核代码可以不受限制地访问底层硬件,其代码和内存与用户空间代码完全分离。

当一个用户空间应用程序正在执行时,内核代码是否也在并行执行,比如内核线程总是在检查东西?

我一直在读到内核为试图访问受限内存部分的用户空间程序提供内存保护。如果用户空间代码尝试写入内存的受限部分,这种内存保护是动态发生的,还是在编译期间发生错误?

一般来说,如果内核代码没有同时执行,如何阻止用户空间程序写入内存中它想要的任何位置?我会猜测并说这是因为 MMU 和虚拟内存,但还有更多吗?谢谢

【问题讨论】:

  • 用户空间程序不直接访问系统资源,它们通过系统库提供的方法来访问。这就是检查发生的地方。
  • 好的,但是如果我编译一个用户空间程序来访问系统资源,例如直接写入 GPIO 的寄存器,会发生什么情况?何时何地实施保护?
  • 用户进程无法访问处理器集的所有指令,也无法访问真实内存,只能访问虚拟内存。任何被认为是“危险”的东西都禁止用户进程使用,保护通常由硬件支持强制执行。更一般地,用户进程无法访问真实机器,只能访问某些虚拟机(由系统定义)。
  • @Jean-BaptisteYunès 但是我访问受限内存的应用程序代码可以编译吗?以ARM7处理器为例,在用户模式下,我可以直接写入任何GPIO等。我的理解是内存保护是由内核实现的,但是如何实现呢?
  • @Engineer999 可能是因为 GPIO 映射到您的用户空间。

标签: linux unix linux-kernel kernel


【解决方案1】:

当一个用户空间应用程序正在执行时,内核代码是否也在并行执行,比如内核线程总是在检查东西?

没有。

这种内存保护是动态发生的,还是在编译过程中,如果用户空间代码尝试写入内存的受限部分时会出错?

内存限制由内存管理硬件与CPU mode一起动态实施。
内核在引导期间配置这些限制,即 MMU 初始化。

编译器通常不执行任何地址强制。很容易生成访问超出范围的数组的代码。同样,很容易生成引用“受限”内存的指针。请注意,编译阶段通常不假定运行时环境(例如,内核空间占用 1 GB 还是 2 GB 的 32 位虚拟地址空间?),因此编译后的程序更具可移植性。

一般来说,如果内核代码没有同时执行,如何阻止用户空间程序写入内存中它想要的任何位置?

用户空间程序仅以限制某些操作的受限 CPU 权限执行。
此外,它在自己的受限虚拟内存空间中执行,与其他进程不同。
顺便说一句,CPU 一次只能(基本上)执行一条指令,因此没有“内核代码......同时执行”,前提是无关紧要的。

还有更多内容吗?

CPU必须有privilege mode(s);并非所有 CPU 都具有此功能。早期 PC 的 Intel CPU,例如8088 和 80286,没有。

“当用户空间应用程序正在执行时”,CPU 处于用户模式,即特权/能力最少的模式。内核代码在主管/特权(又名内核)模式下执行。

何时何地实施保护?

在执行每条指令时,CPU 会根据当前 CPU 模式验证该指令。尝试在受限模式下执行特权指令会触发 CPU 异常。
如果指令还涉及内存引用,则 MMU 会根据当前 CPU 模式(即用户与内核模式)验证该虚拟内存地址(即用户与内核空间)。
对于有效的内存引用,MMU 将确认物理内存已映射到该虚拟地址,并且内存页面是常驻的。


附录

您似乎将访问虚拟内存和物理内存的限制混为一谈。
您的用户空间程序只能访问较低的虚拟内存。边界由内核定义。硬件拒绝访问内核空间,特别是 MMU 和 CPU 模式。

您的(用户空间)程序只能访问操作系统为其提供的内存空间。编程语言对备用(例如物理而不是虚拟)地址空间没有内置结构。保护模式 Windows(即 Windows NT 和更高版本,而不是 Windows 3.x)不提供程序访问物理内存。 POSIX 操作系统提供伪设备 /dev/mem 用于将任何物理地址映射到用户(虚拟)地址空间。

由于 ARM 处理器没有 I/O 指令或地址空间,因此所有 I/O 都是内存映射的。因此,/dev/mem 是访问连接到运行 Linux 的 ARM 处理器的外围设备的设备。
对伪设备 /dev/mem 的访问由内核使用文件系统权限控制(就像所有其他文件一样)。

【讨论】:

  • 非常有帮助的答案。只有一个问题 - CPU 模式会禁止哪些操作? (我从未听说过 CPU 模式)
  • @SridharSarnobat -- 答案是特定于 CPU 的。你读过链接的文章吗?
  • 还没有,我会这样做来回答我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 2019-11-24
相关资源
最近更新 更多