【发布时间】:2019-03-17 06:45:32
【问题描述】:
代码:
#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 位?
我需要帮助。
【问题讨论】:
-
>> 12 有效地将限制除以 4096 (2^12)。当在描述符中设置粒度位时,限制以 4096 (4kb) 为单位表示,而不是字节。因此 >>12 将
lim转换为 4k 单位的数量,然后丢弃除低 16 位之外的所有内容(这就是 & 0xffff 所做的)。限制值的剩余高 4 位使用 (((lim) >> 28) & 0xf) 计算。限制在描述符中存储为 20 位值。 -
哦!我知道了。非常感谢!
标签: c assembly operating-system xv6