26

我是学生的初学者:) 我正在研究英特尔架构,并且正在研究内存管理,例如分段和分页。我正在阅读英特尔的手册,了解英特尔的架构非常好。

但是我仍然对一些基本的东西感到好奇。为什么在 64 位长模式下,所有段寄存器都将变为位 0?为什么系统不再使用段寄存器?

因为系统的 64 位大小(例如 GP 寄存器)足以一次包含这些逻辑地址?保护在 64 位模式下是否正常工作?

我试图找到 64 位寻址,但在 Google 中找不到。也许我的搜索技巧很糟糕,或者我可能需要一些特定的先前知识才能在谷歌中搜索。

因此,我想知道为什么 16 位段寄存器不会在 64 位模式下使用,以及保护如何在 64 位模式下正常工作。

谢谢!

4

2 回答 2

27

从某种意义上说,当您使用通用寄存器执行数组(“索引”)类型寻址时,您所做的基本上与段寄存器相同。在过去 8 位和 16 位编程的糟糕日子里,许多应用程序需要比 16 位地址所能达到的更多数据(有时还需要更多代码)。

如此多的 CPU 通过拥有比 16 位地址所能达到的更大的可寻址内存空间来解决这个问题,并通过“段寄存器”或类似的方式使这些内存区域可访问。程序会将“段寄存器”中的地址设置为高于(65536 字节)16 位地址空间的地址。然后在执行某些指令时,它们会将指令指定地址添加到适当的(或指定的)“段寄存器”中,以读取超出 16 位地址或 16 位偏移范围的数据(或代码)。

然而,今天的情况恰恰相反!

怎么会这样?今天,64 位 CPU 可以寻址超过(不少于)所有可寻址的内存空间。今天大多数 64 位 CPU 可以寻址 40 位到 48 位的物理内存。诚然,没有什么可以阻止他们寻址完整的 64 位内存空间,但他们知道没有人(除了 NSA)能负担得起这么多 RAM,此外,将这么多 RAM 挂在 CPU 总线上会因电容而加载它,并减慢 CPU 芯片外的所有内存访问。

因此,当前这一代的主流 CPU 可以寻址 40 位到 48 位的内存空间,这是超过 99.999% 的市场无法想象的。请注意,32 位是 4 GB(今天有些人确实超过了 2、4、8、16 倍),但即使是 40 位也可以寻址 256 * 4GB == 1024GB == 1TB。虽然今天 64GB 的 RAM 是合理的,在极端情况下甚至可能是 256GB,但除了可能 0.001% 的应用程序之外,1024GB 并不是必需的,而且启动起来负担不起。

如果你属于 0.001% 的类别,只需购买一个可寻址 48 位物理内存的 CPU,你说的是 256TB ......目前这是不切实际的,因为它会加载过多的内存总线电容(甚至可能内存总线将完全停止工作)。

重点是这个。当您使用普通 64 位寄存器的普通寻址模式已经可以寻址比您的计算机所能容纳的更多的内存时,添加段寄存器的传统理由就消失了。

这并不意味着人们在 64 位 CPU 中找不到段寄存器的有用用途。他们可以。几种可能性是显而易见的。但是,对于 64 位通用寄存器和 64 位地址空间,没有什么是通用寄存器不能做的,而段寄存器可以。通用寄存器有很多用途,而段寄存器没有。因此,如果有人计划向现代 64 位 CPU 添加更多寄存器,他们会添加通用寄存器(可以做“任何事情”),而不是添加用途非常有限的“段寄存器”。

他们确实有。您可能已经注意到,AMD 和 Intel 不断向 SIMD 寄存器文件添加更多 [sorta] 通用寄存器,并且 AMD 在设计 64 位 x86_64 CPU(Intel复制)。

于 2014-01-17T22:15:38.657 回答
5

大多数关于 32/64 位世界中段寄存器无关性问题的答案总是围绕内存寻址。我们都同意段寄存器的主要目的是绕过 16 位 DOS 世界中的地址空间限制。然而,从安全能力的角度来看,段寄存器提供了 4 个地址空间隔离环,如果我们使用 64 位长模式,例如 64 位操作系统,则不可用。对于当前流行的操作系统(例如 Windows 和 Linux)来说,这不是问题,它们仅使用具有两个隔离级别的 ring 0 和 ring 3。环 1 和 2 有时是内核的一部分,有时是用户空间的一部分,具体取决于代码的编写方式。从隔离的角度来看,随着硬件虚拟化(相对于操作系统虚拟化)的出现,虚拟机管理程序在 ring 0 或 ring 1/2/3 中都不太适合。

那么,重点是什么?如果一个人正在设计一个具有 4 个隔离环的新安全操作系统,那么如果禁用分段,我们就会遇到问题。例如,我们为硬件多路复用代码、管理程序代码/容器/VM、操作系统内核和用户空间各使用一个环。因此,我们可以根据上述要求提出利用分段提供的额外安全性的案例。但是,Intel/AMD 仍然允许 F 和 G 段寄存器具有非零值(即不禁用分段)。据我所知,没有任何操作系统利用这一希望为硬件虚拟化编写更安全的操作系统/管理程序。

于 2014-04-16T14:37:06.827 回答