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

x86段寄存器在现代CPU和操作系统上是否具有特殊意义/用途?,x86,history,cpu-registers,memory-segmentation,X86,History,Cpu Registers,Memory Segmentation,x86 CPU在从16位到32位再到64位的几代中有各种复杂的模式和内存分段 如今,现代操作系统在现代操作模式下使用现代CPU,您不必担心内存段,但您仍然可以在现代CPU上的传统操作系统上运行传统应用程序,在这种情况下,我假定CPU在特殊的传统模式下运行(保护模式、真实模式等) 显然,段寄存器的存在是为了向后兼容,但这是唯一的原因吗 段寄存器也有现代用途吗?或者,它们现在只是普通用途的登记册,只有反映其历史功能的名称 这个问题的灵感来自于对这个旧堆栈溢出线程的评论:2002年,Linux内核黑客

x86 CPU在从16位到32位再到64位的几代中有各种复杂的模式和内存分段

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

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

段寄存器也有现代用途吗?或者,它们现在只是普通用途的登记册,只有反映其历史功能的名称


这个问题的灵感来自于对这个旧堆栈溢出线程的评论:

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

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

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

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


在x86-64上,Linux对线程本地存储使用FS,对每个cpu的内核空间数据使用GS。据我所知,Solar Designer(我认为它在OpenWall Linux中仍然可用)在90年代率先推出了See和

通过分段的不可执行堆栈。将FS和GS用于TLS只是一种避免使用GPR的技巧(特别是在资源匮乏的x86上,而不是x86-64上)||