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

hip*_*ail 3 x86 history cpu-registers memory-segmentation

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

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

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

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

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

sco*_*ttt 7

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寄存器?大约MSR_GS_BASE详细在linux 86 64