linux 内核使用哪种类型的内存模型(即平面/分段)?
Which type of memory model (i.e. flat / segmentation) is used by linux kernel?
我正在阅读有关 x86 保护模式工作的信息,因为我已经看到了平面内存模型和分段内存模型。
如果 linux 内核使用平面内存模型,那么它如何保护非特权应用程序对关键数据的访问?
Linux 一般都不用。在 x86 上,Linux 为用户space 进程和内核提供单独的页表。 userspace 页表不包含用户到内核内存的映射,这使得 user-space 进程无法直接访问内核内存。
从技术上讲,x86 上的“虚拟地址”首先通过分段(并从逻辑地址转换为线性地址),然后通过页表从线性地址重新映射到物理地址。除特殊情况外,分段不会更改 64 位模式下的结果物理地址(分段仅用于存储当前特权级别等特征,并强制执行 SMEP 等功能)。
一个众所周知的“异常情况”是大多数编译器在 x86 上实现的线程本地存储,它使用 FS 和 GS 段来定义每个逻辑处理器在地址 space 中的偏移量。其他段不能有非零基,因此不能通过分段移动地址。
我正在阅读有关 x86 保护模式工作的信息,因为我已经看到了平面内存模型和分段内存模型。
如果 linux 内核使用平面内存模型,那么它如何保护非特权应用程序对关键数据的访问?
Linux 一般都不用。在 x86 上,Linux 为用户space 进程和内核提供单独的页表。 userspace 页表不包含用户到内核内存的映射,这使得 user-space 进程无法直接访问内核内存。
从技术上讲,x86 上的“虚拟地址”首先通过分段(并从逻辑地址转换为线性地址),然后通过页表从线性地址重新映射到物理地址。除特殊情况外,分段不会更改 64 位模式下的结果物理地址(分段仅用于存储当前特权级别等特征,并强制执行 SMEP 等功能)。
一个众所周知的“异常情况”是大多数编译器在 x86 上实现的线程本地存储,它使用 FS 和 GS 段来定义每个逻辑处理器在地址 space 中的偏移量。其他段不能有非零基,因此不能通过分段移动地址。