用户 space 程序写入任何地方
User space programs writing to anywhere
以Unix内核为例。就内核 space 和用户 space.
而言,有些事情我不太明白
我们将有用户 space 应用程序代码和内核代码。内核代码可以不受限制地访问底层硬件,其代码和内存与用户 space 代码完全分开。
当用户 space 应用程序正在执行时,内核代码是否也在并行执行,例如内核线程总是检查事物?
我一直在阅读内核为试图访问受限内存部分的用户 space 程序提供内存保护。这种内存保护是动态发生的,还是会在编译期间发生,如果用户 space 代码试图写入内存的受限部分会出错?
一般来说,如果内核代码不同时执行,如何阻止用户 space 程序写入内存中它想要的任何位置?我会猜测并说这是因为 MMU 和虚拟内存,但还有更多吗?谢谢
When a user space application is executing, is the kernel code also executing in parallel, such as kernel threads always checking things?
没有
Is this memory protection happening dynamically, or will it be during compilation, an error if user space code tries to write to a restricted part of memory?
内存限制由内存管理硬件结合 CPU mode 动态强制执行。
内核在引导期间配置这些限制,即 MMU 初始化。
编译器通常不执行任何地址强制。生成越界访问数组的代码很容易。同样,很容易生成引用 "restricted" 内存的指针。请注意,编译阶段通常不假设运行时环境(例如,内核 space 占用 32 位虚拟地址 space 的 1 GB 或 2GB?),因此编译后的程序更具可移植性。
In general, what is to stop a user space program from writing to anywhere it wants in memory if the kernel code is not executing at the same time?
用户space 程序只是以限制某些操作的受限 CPU 权限执行。
此外,它在自己的受限虚拟内存 space 中执行,与其他进程不同。
顺便说一句,CPU一次只能(基本上)执行一条指令,所以没有"kernel code ... executing at the same time",前提是无关紧要的。
is there more to it?
CPU必须有privilege mode(s);并非所有 CPU 都有此功能。早期 PC 的英特尔 CPU,例如8088和80286,没有。
"When a user space application is executing",CPU是用户态,最少privileges/capabilities的模式。内核代码以 supervisor/privileged(又名内核)模式执行。
When and where is the protection implemented?
随着每条指令的执行,CPU 根据当前的 CPU 模式验证该指令。尝试在受限模式下执行特权指令会触发 CPU 异常。
如果该指令还涉及内存引用,则 MMU 根据当前 CPU 模式(即用户与内核模式)验证该虚拟内存地址(即用户与内核 space)。
对于有效的内存引用,MMU 将确认物理内存已映射到该虚拟地址,并且内存页面已驻留。
附录
您似乎混淆了访问虚拟内存和物理内存的限制。
您的用户space 程序只能访问较低的虚拟内存。边界由内核定义。硬件拒绝访问内核 space,特别是 MMU 与 CPU 模式。
您的(用户space)程序只能访问OS 为其提供的内存space。编程语言没有内置构造来替代(例如物理而不是虚拟)地址 space。保护模式 Windows(即 Windows NT 及更高版本,而不是 Windows 3.x)不提供程序访问物理内存。 POSIX 操作系统提供伪设备 /dev/mem 用于将任何物理地址映射到用户(虚拟)地址 space 的内存。
由于 ARM 处理器没有 I/O 指令或地址 space,因此所有 I/O 都是内存映射的。因此 /dev/mem 是用于访问连接到运行 Linux.
的 ARM 处理器的外围设备的设备
对伪设备 /dev/mem 的访问由内核使用文件系统权限控制(就像所有其他文件一样)。
以Unix内核为例。就内核 space 和用户 space.
而言,有些事情我不太明白我们将有用户 space 应用程序代码和内核代码。内核代码可以不受限制地访问底层硬件,其代码和内存与用户 space 代码完全分开。
当用户 space 应用程序正在执行时,内核代码是否也在并行执行,例如内核线程总是检查事物?
我一直在阅读内核为试图访问受限内存部分的用户 space 程序提供内存保护。这种内存保护是动态发生的,还是会在编译期间发生,如果用户 space 代码试图写入内存的受限部分会出错?
一般来说,如果内核代码不同时执行,如何阻止用户 space 程序写入内存中它想要的任何位置?我会猜测并说这是因为 MMU 和虚拟内存,但还有更多吗?谢谢
When a user space application is executing, is the kernel code also executing in parallel, such as kernel threads always checking things?
没有
Is this memory protection happening dynamically, or will it be during compilation, an error if user space code tries to write to a restricted part of memory?
内存限制由内存管理硬件结合 CPU mode 动态强制执行。
内核在引导期间配置这些限制,即 MMU 初始化。
编译器通常不执行任何地址强制。生成越界访问数组的代码很容易。同样,很容易生成引用 "restricted" 内存的指针。请注意,编译阶段通常不假设运行时环境(例如,内核 space 占用 32 位虚拟地址 space 的 1 GB 或 2GB?),因此编译后的程序更具可移植性。
In general, what is to stop a user space program from writing to anywhere it wants in memory if the kernel code is not executing at the same time?
用户space 程序只是以限制某些操作的受限 CPU 权限执行。
此外,它在自己的受限虚拟内存 space 中执行,与其他进程不同。
顺便说一句,CPU一次只能(基本上)执行一条指令,所以没有"kernel code ... executing at the same time",前提是无关紧要的。
is there more to it?
CPU必须有privilege mode(s);并非所有 CPU 都有此功能。早期 PC 的英特尔 CPU,例如8088和80286,没有。
"When a user space application is executing",CPU是用户态,最少privileges/capabilities的模式。内核代码以 supervisor/privileged(又名内核)模式执行。
When and where is the protection implemented?
随着每条指令的执行,CPU 根据当前的 CPU 模式验证该指令。尝试在受限模式下执行特权指令会触发 CPU 异常。
如果该指令还涉及内存引用,则 MMU 根据当前 CPU 模式(即用户与内核模式)验证该虚拟内存地址(即用户与内核 space)。
对于有效的内存引用,MMU 将确认物理内存已映射到该虚拟地址,并且内存页面已驻留。
附录
您似乎混淆了访问虚拟内存和物理内存的限制。
您的用户space 程序只能访问较低的虚拟内存。边界由内核定义。硬件拒绝访问内核 space,特别是 MMU 与 CPU 模式。
您的(用户space)程序只能访问OS 为其提供的内存space。编程语言没有内置构造来替代(例如物理而不是虚拟)地址 space。保护模式 Windows(即 Windows NT 及更高版本,而不是 Windows 3.x)不提供程序访问物理内存。 POSIX 操作系统提供伪设备 /dev/mem 用于将任何物理地址映射到用户(虚拟)地址 space 的内存。
由于 ARM 处理器没有 I/O 指令或地址 space,因此所有 I/O 都是内存映射的。因此 /dev/mem 是用于访问连接到运行 Linux.
的 ARM 处理器的外围设备的设备
对伪设备 /dev/mem 的访问由内核使用文件系统权限控制(就像所有其他文件一样)。