段描述符中 AVL 位的用途是什么?

What is the purpose of the AVL bit in a segment descriptor?

GDT中的AVL位是做什么用的?除了 "For software use, not used by hardware".

之外,维基百科没有提供任何我能找到的信息

硬件忽略该位,因此如何使用它取决于软件。

我怀疑当前的 OSes 是否会将这些位用于任何用途;所有主流的现代 x86 OSes 使用平面内存模型,只有几个固定的 GDT 条目,它们不会修改。 (我忽略 Linux's modify_ldt system call 因为它不再用于线程本地存储;现代 Linux 有更好的机制来正确设置 FS 或 GS​​ 基数。无论如何,我不认为正常使用-它的案例使用了 1 个 AVL 位。)


what it was intended for when designed

Intel 还在 page-table 条目中保留了一些位以供 OS 使用(即硬件保证忽略,而不是未来可以使用的保留位硬件)。

32 位 GDT 格式和分页都是 386 中新增的。(286 具有不同的 GDT 格式并且没有分页)。

如果在由软件编写但由硬件读取的结构中有多个未使用的位,这通常是一种很好的做法,以便为软件留出一些空间,以便在每个条目中就地进行他们想要的任何簿记,并保留一些供将来使用。

IDK 如果英特尔有任何具体的想法,或者如果您可以用该位做任何有趣的事情。

https://wiki.osdev.org/Descriptors#Code.2FData_Segment_Descriptors 没有任何建议,只是说 "your OS can use this as you choose".

如果 1 位引用计数器足够的话,您可能可以使用它来跟踪条目是否在使用中。或者它是否与任何其他部分重叠。或者可能是一个标志来指示如果修改基础是否必须进行其他检查和复制?

也许对于一个代码段,你可以用它来记录代码是否与位置无关。如果是这样,如果您要对物理内存进行碎片整理以为大型连续段腾出空间,则可以将代码移动到其他地方并更改段基数并使其在没有修复的情况下仍然可以工作。 (但只要你不改变任何相对于段基址的偏移量,这就比 PIC 在平面内存映射中通常意味着的要求更弱。相同的代码在相同的 CS:EIP 和程序中通常不会找出或使用线性地址,只有偏移量。)