代码:
#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位?
我需要帮助。
答案 0 :(得分:3)
原因是过时的。描述符在286中为8个字节,在286 16位保护模式下,限制曾经被编码为16位。当386出现时,描述符未扩展-每个条目仍为8个字节。但是,将没有足够的空间使用32位来编码段基础和段限制-因此现在使用20位来编码限制。
对于20位限制的解释,有2个选项-4K的倍数或字节-称为粒度。 4K模式是一个很好的折衷方案,可与386的4K页面大小一起很好地工作-当您使用超过1M的限制时,您很可能也在使用虚拟内存,然后您将丢失整个页面的边缘无论如何。
赋予宏的限制以字节为单位,然后除以4096(>> 12
),以得到页面粒度限制。