4

从 16 位到 32 位再到 64 位,x86 CPU 具有各种棘手的模式和内存分段。

这些天来,现代操作系统在现代操作模式下使用现代 CPU,您不必担心内存段,但您仍然可以在现代 CPU 上的旧操作系统上运行旧应用程序,在这种情况下,我认为 CPU 以特殊的传统方式运行模式(保护模式、实模式等)。

很明显,段寄存器的存在是为了向后兼容,但这是唯一的原因吗?

段寄存器也有现代用途吗?或者它们现在只是成为通用寄存器,仅具有反映其历史功能的名称?

这个问题的灵感来自对这个旧堆栈溢出线程的评论:为什么必须以这种方式使用 mov 指令?

4

1 回答 1

8

2002 年,Linux 内核黑客 Ingo Molnar 在 32 位 x86 系统上实现Exec Shield(一种数据执行预防形式)时使用了分段。这是我所知道的一种现代分割用法,但主要是为了充分利用您无法改变的硬件机制。分段不用于在NX支持的 x86-64 CPU 上实现数据执行预防。

FSGS段寄存器仍在 x86-64 上使用:

在 64 位模式下,通常(但不完全)禁用分段,创建一个平坦的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基数视为零,创建一个等于有效地址的线性地址。FS 和 GS 段是例外。这些段寄存器(保存段基址)可用作线性地址计算中的附加基址寄存器。它们有助于寻址本地数据和某些操作系统数据结构。

英特尔系统编程指南,第 3.2.4 章

在 x86-64 上,Linux 使用FS作为线程本地存储,使用GS作为每个 cpu 数据的内核空间。请参阅Linux AMD64 中如何使用 fs/gs 寄存器?以及有关 linux x86 64 中 MSR_GS_BASE 的详细信息

于 2014-03-17T12:26:58.523 回答