为什么英特尔选择在段描述符中将段的基数和限制拆分为不同的部分,而不是使用连续位?
参见http://css.csail.mit.edu/6.858/2014/readings/i386/s05_01.htm的图5-3
为什么他们不将基地址存储在 0 到 31 位,限制在 32 到 51 位,并将剩余位置用于其他位(或一些类似的布局)?
为什么英特尔选择在段描述符中将段的基数和限制拆分为不同的部分,而不是使用连续位?
参见http://css.csail.mit.edu/6.858/2014/readings/i386/s05_01.htm的图5-3
为什么他们不将基地址存储在 0 到 31 位,限制在 32 到 51 位,并将剩余位置用于其他位(或一些类似的布局)?
Raymond Chen已经在评论中回答了这个问题:
为了与 80286 兼容。80286 的最大段大小为 2^16,最大基数为 2^24。因此,基本字段和限制字段分别为 16 位和 24 位宽。当大小和基数扩展到 32 位时,它们必须放在其他地方,因为好的地方已经被占用了。
下面是对 Intel 80286 Programmer's Reference Manual 中段描述符(代码或数据类型)的扫描:
为了比较,这里是英特尔® 64 和 IA-32 架构软件开发人员手册(第 3A 卷)的屏幕截图:
格式完全相同,除了保留位的使用。基数从 24 位扩展到 32 位,段限制从 16 位扩展到 20 位,并添加了一些附加标志。(“已访问”位包含在第二个屏幕截图中的“类型”字段中)
因此,简而言之:布局之所以奇怪,是因为它是为 16 位处理器设计的旧布局的向后兼容扩展。