GDT 中的 AVL 位是做什么用的?除了“供软件使用,硬件不使用”之外,维基百科没有提供任何我能找到的信息。
1 回答
硬件会忽略该位,因此取决于软件如何使用它。
我怀疑当前的操作系统是否会将这些位用于任何事情。所有主流的现代 x86 操作系统都使用平面内存模型,只有几个固定的 GDT 条目,它们不会修改。(我忽略了Linux 的modify_ldt
系统调用,因为它不再用于线程本地存储;现代 Linux 有更好的机制来正确设置 FS 或 GS 基础。无论如何,我认为它的正常用例不会使用它1 AVL 位用于任何事情。)
设计时的用途
英特尔还在页表条目中保留了一些位供操作系统使用(即保证硬件会忽略,而不是保留位可供未来的硬件使用)。
32 位 GDT 格式和分页都是 386 中的新功能。(286 具有不同的 GDT 格式并且没有分页)。
如果结构中有多个未使用的位由软件写入但由硬件读取,则通常是一种很好的做法,以便为软件留出一些空间,以便在每个条目中就地执行它们想要的任何簿记,并保留一些位以供将来使用。
IDK 如果英特尔有任何具体的想法,或者如果您可以使用该位做任何有趣的事情。
https://wiki.osdev.org/Descriptors#Code.2FData_Segment_Descriptors没有任何建议,只是说“您的操作系统可以按照您的选择使用它”。
如果 1 位引用计数器就足够了,您可能可以使用它来跟踪条目是否正在使用中。或者它是否与任何其他部分重叠。或者可能是一个标志来指示如果修改基础是否必须进行一些其他检查和复制?
也许对于一个代码段,你可以用它来记录代码是否与位置无关。如果是这样,如果您正在对物理内存进行碎片整理以为大的连续段腾出空间,您可以将代码移到其他地方并更改段基础并使其在没有修复的情况下仍然可以工作。(但只要您不更改任何相对于段基的偏移量,这比 PIC 在平面内存映射中通常意味着的要求更弱。相同的代码位于相同的 CS:EIP 中,而程序则不会t 通常找出或使用线性地址,只有偏移量。)