从 16 位到 32 位再到 64 位,x86 CPU 历代都有各种棘手的模式和内存分段。
如今,现代操作系统在现代操作模式下使用现代 CPU,您不必担心内存段,但您仍然可以在现代 CPU 上的旧操作系统上运行旧应用程序,在这种情况下,我假设 CPU 在特殊旧版中运行模式(保护模式、实模式等)。
很明显,段寄存器的存在是为了向后兼容,但这是唯一的原因吗?
段寄存器也有现代用途吗?或者它们现在已经成为通用寄存器,仅具有反映其历史功能的名称?
这个问题的灵感来自于这个旧的 Stack Overflow 线程的评论:为什么mov指令必须这样使用呢?
2002年,Linux内核黑客Ingo Molnar在实现时使用了分段执行盾,32 位 x86 系统上的一种数据执行预防形式。这是一modern我所知道的分段的使用,但主要是在从无法改变的硬件机制中获得最大收益方式。分段不用于在 x86-64 CPU 上实现数据执行预防NX
支持。
The FS and GSx86-64 上仍然使用段寄存器:
在 64 位模式下,通常(但不是完全)禁用分段,从而创建平坦的 64 位线性地址空间。处理器将 CS、DS、ES、SS 的段基数视为零,从而创建等于有效地址的线性地址。 FS 和 GS 段是例外。这些段寄存器(保存段基址)可以用作线性地址计算中的附加基址寄存器。它们有助于寻址本地数据和某些操作系统数据结构。
英特尔系统编程指南,第 3.2.4 章
在 x86-64 上,Linux 使用FS用于线程本地存储和GS每个 cpu 数据的内核空间。看Linux AMD64 中如何使用 fs/gs 寄存器? and Linux x86 64 中 MSR_GS_BASE 的详细信息
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)