关于Unix内核的例子。在内核空间和用户空间方面,有些事情我不太了解。
我们将拥有用户空间应用程序代码和内核代码。内核代码可以无限制地访问底层硬件,其代码和内存与用户空间代码完全分开。
当用户空间应用程序正在执行时,内核代码是否也并行执行,例如内核线程总是检查事物?
我一直在读,内核为试图访问受限制的内存部分的用户空间程序提供内存保护。这种内存保护是动态发生的,还是在编译期间发生,如果用户空间代码试图写入内存的受限部分,则会出错?
一般来说,如果内核代码没有同时执行,那么什么是阻止用户空间程序写入它想要的内存?我猜想并说这是因为MMU和虚拟内存,但还有更多吗?感谢
答案 0 :(得分:1)
当用户空间应用程序正在执行时,内核代码是否也并行执行,例如内核线程总是检查事物?
没有
这种内存保护是动态发生还是在编译期间发生,如果用户空间代码试图写入内存的受限部分,则会出错?
内存限制由内存管理硬件与CPU mode一起动态强制执行 内核在引导期间配置这些限制,即MMU初始化。
编译器通常不执行任何地址实施。生成访问超出其边界的数组的代码很容易。同样,生成引用“受限”内存的指针很容易。请注意,编译阶段通常不假设运行时环境(例如内核空间是否占用32位虚拟地址空间的1 GB或2 GB?),因此编译后的程序更具可移植性。
一般来说,如果内核代码没有同时执行,那么停止用户空间程序写入内存中的任何地方是什么意思?
用户空间程序只是在限制CPU权限的情况下执行,这会限制某些操作 此外,除了其他进程外,它还在自己的受限虚拟内存空间中执行 顺便说一下,CPU(基本上)一次只能执行一条指令,因此没有“内核代码......同时执行”,前提是无关紧要的。
还有更多吗?
CPU必须privilege mode(s);并非所有CPU都具有此功能。早期PC的Intel CPU,例如8088和80286,没有。
“当用户空间应用程序正在执行”时,CPU处于用户模式,即具有最少权限/功能的模式。内核代码以supervisor /特权(aka内核)模式执行。
何时何地实施保护?
执行每条指令时,CPU根据当前CPU模式验证该指令。尝试在受限模式下执行特权指令会触发CPU异常
如果指令还涉及内存引用,则MMU根据当前CPU模式(即用户与内核模式)验证该虚拟内存地址(即用户与内核空间)。
对于有效的内存引用,MMU将确认为该虚拟地址映射了物理内存,并且内存页面是驻留的。
ADDENDUM
您似乎正在混淆访问虚拟内存和物理内存的限制 您的用户空间程序只能访问较低的虚拟内存。边界由内核定义。硬件拒绝访问内核空间,特别是MMU与CPU模式一起使用。
您的(用户空间)程序只能访问操作系统为其提供的内存空间。编程语言没有内置的构造到备用(例如物理而不是虚拟)地址空间。受保护模式的Windows(即Windows NT及更高版本,而不是Windows 3.x)不提供程序访问物理内存的权限。 POSIX操作系统提供伪设备 / dev / mem ,用于将任何物理地址映射到用户(虚拟)地址空间。
由于ARM处理器没有I / O指令或地址空间,因此所有I / O都是内存映射的。因此, / dev / mem 是访问连接到运行Linux的ARM处理器的外围设备的设备 使用文件系统权限,内核(就像所有其他文件一样)对伪设备 / dev / mem 的访问权限。