【发布时间】:2018-06-02 10:54:35
【问题描述】:
以 Unix 内核为例。在内核空间和用户空间方面,有些东西我不太了解。
我们将拥有用户空间应用程序代码和内核代码。内核代码可以不受限制地访问底层硬件,其代码和内存与用户空间代码完全分离。
当一个用户空间应用程序正在执行时,内核代码是否也在并行执行,比如内核线程总是在检查东西?
我一直在读到内核为试图访问受限内存部分的用户空间程序提供内存保护。如果用户空间代码尝试写入内存的受限部分,这种内存保护是动态发生的,还是在编译期间发生错误?
一般来说,如果内核代码没有同时执行,如何阻止用户空间程序写入内存中它想要的任何位置?我会猜测并说这是因为 MMU 和虚拟内存,但还有更多吗?谢谢
【问题讨论】:
-
用户空间程序不直接访问系统资源,它们通过系统库提供的方法来访问。这就是检查发生的地方。
-
好的,但是如果我编译一个用户空间程序来访问系统资源,例如直接写入 GPIO 的寄存器,会发生什么情况?何时何地实施保护?
-
用户进程无法访问处理器集的所有指令,也无法访问真实内存,只能访问虚拟内存。任何被认为是“危险”的东西都禁止用户进程使用,保护通常由硬件支持强制执行。更一般地,用户进程无法访问真实机器,只能访问某些虚拟机(由系统定义)。
-
@Jean-BaptisteYunès 但是我访问受限内存的应用程序代码可以编译吗?以ARM7处理器为例,在用户模式下,我可以直接写入任何GPIO等。我的理解是内存保护是由内核实现的,但是如何实现呢?
-
@Engineer999 可能是因为 GPIO 映射到您的用户空间。
标签: linux unix linux-kernel kernel