是否有一个约定全局描述符表项应该如何布局?



操作系统是否有一个约定约定来指定每个表索引应该描述什么?例如,在Windows系统上(如本文所述),条目4描述32位用户模式代码(RPL = 3),条目6描述64位用户模式代码。这是惯例吗?其他条目呢?

x86-64syscall/sysret和32位sysenter/sysexit,显然关心GDT条目的顺序:内核CS、内核数据、用户CS、用户数据。(感谢@Brendan提供的细节。)或者至少,syscall将固定值加载到CS和SS内部状态中:

sycall加载CS和SS选择器,其值来自于IA32_STAR MSR的47:32位。然而,CS和SS描述符缓存不会从这些选择器引用的描述符(在GDT或LDT中)加载。相反,描述符缓存是用固定值加载的。详细信息请参见操作部分。操作系统软件有责任确保那些选择器值引用的描述符(在GDT或LDT中)与加载到描述符缓存中的固定值相对应;sycall指令不能保证这种对应。

除此之外,硬件并不关心;如果您只使用像int 0x80这样的遗留系统调用机制,那么任何对您有意义的模式都是好的。
我敢肯定,在操作系统之间没有标准约定,但这不是我看过的。


这些条目可能是在内核设置它们时通过缓存获取的(例如在上下文切换时),因此将它们放在同一条64字节的缓存行中可能会有一个小小的优势。(减少缓存缺失/占用的缓存行数。)特别是对于32位用户空间,如果你不能为他们的SS/DS/ES使用空选择器(0)。

但是如果整个GDT是8个或更少的条目,那么整个东西可以放在一个缓存行中(如果您以64对齐开始)。较旧的cpu(在Pentium 4/Core 2之前)有32字节的缓存线,但它们不支持64位模式,因此需要更少的GDT项。

请注意,索引0实际上永远不会被CPU访问,所以您可以对齐第一个"real"GDT条目和lgdt的地址减8。(空描述符"是一个特例

相关内容

  • 没有找到相关文章

最新更新