hip*_*ail 3 x86 history cpu-registers memory-segmentation
x86 CPU在16位到32位到64位的几代产品中都有各种棘手的模式和内存分段.
现在,在现代操作模式下使用现代CPU的现代操作系统,您不必担心内存段,但您仍然可以在现代CPU上的旧版操作系统上运行旧版应用程序,在这种情况下,我假设CPU运行在一个特殊的传统模式(保护模式,实模式等).
显然,由于向后兼容性存在段寄存器,但这是唯一的原因吗?
段寄存器是否也有现代用途?或者他们现在只是成为通用名册而只是反映其历史功能的名称?
这个问题的灵感来自于对旧的Stack Overflow线程的评论:为什么必须以这种方式使用mov指令?
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数据的内核空间.请参阅Linux AMD64中如何使用fs/gs寄存器?和大约MSR_GS_BASE详细在linux 86 64