如何理解xv6引导程序代码中的以下代码?

时间:2018-10-12 05:15:19

标签: c assembly operating-system xv6

代码

#define SEG(type,base,lim)                  \
.word (((lim) >> 12) & 0xffff), ((base) & 0xffff);  \
.byte (((base) >> 16) & 0xff), (0x90 | (type)),     \
    (0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)

我知道这是一个段描述符结构。

但是我不明白代码:((lim) >> 12 & 0xffff)

为什么需要右移12位?

我需要帮助。

1 个答案:

答案 0 :(得分:3)

原因是过时的。描述符在286中为8个字节,在286 16位保护模式下,限制曾经被编码为16位。当386出现时,描述符未扩展-每个条目仍为8个字节。但是,将没有足够的空间使用32位来编码段基础和段限制-因此现在使用20位来编码限制。

对于20位限制的解释,有2个选项-4K的倍数或字节-称为粒度。 4K模式是一个很好的折衷方案,可与386的4K页面大小一起很好地工作-当您使用超过1M的限制时,您很可能也在使用虚拟内存,然后您将丢失整个页面的边缘无论如何。

赋予宏的限制以字节为单位,然后除以4096(>> 12),以得到页面粒度限制。