x86段寄存器在现代CPU和操作系统上具有特殊含义/用途吗?

时间:2014-03-17 02:47:34

标签: x86 history cpu-registers memory-segmentation

x86 CPU在16位到32位到64位的几代中都有各种棘手的模式和内存分段。

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

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

段寄存器是否也有现代用途?或者他们现在只是成为通用名册而只是反映其历史功能的名称?

这个问题的灵感来自于对旧Stack Overflow主题的评论:Why does the mov instruction have to be used this way?

1 个答案:

答案 0 :(得分:7)

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

FS GS 段寄存器仍在x86-64上使用: “在64位模式下,通常(但不是完全)禁用分段,创建一个平坦的64位线性地址空间。处理器将CS,DS,ES,SS的分段基数视为零,创建一个线性地址, FS和GS段是例外的。这些段寄存器(保存段基)可用作线性地址计算中的附加基址寄存器。它们有助于寻址本地数据和某些操作系统数据结构。 “ (来自英特尔系统编程指南,第3.2.4章)

在x86-64上,Linux使用 FS 进行线程本地存储, GS 用于每个cpu数据的内核空间。请参阅How are the fs/gs registers used in Linux AMD64?Detail about MSR_GS_BASE in linux x86 64