【问题标题】:How to understand the following code in xv6 bootstrap code?如何理解 xv6 引导代码中的以下代码?
【发布时间】: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


【解决方案1】:

原因很古老。描述符是 286 中的 8 个字节,并且在 286 16 位保护模式下,限制过去被编码为 16 位。当 386 出现时,描述符没有加宽 - 每个条目仍然是 8 个字节。但是,没有足够的空间来使用 32 位对段基数和段限制进行编码 - 因此限制现在使用 20 位进行编码。

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

给宏的限制以字节表示,除以 4096 (>> 12) 得到页面粒度限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-06
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 2015-03-10
    • 2022-06-11
    相关资源
    最近更新 更多