【问题标题】:The xv6-rev7 (JOS) GDTxv6-rev7 (JOS) GDT
【发布时间】:2013-03-22 16:16:27
【问题描述】:

JOS(xv6-rev7)中的GDT(全局描述符表)对我来说很难理解

例如

.word (((lim) >> 12) & 0xffff), ((base) & 0xffff); 

为什么要右移 12?为什么和 0xffff?
这些数字是什么意思?
公式是什么意思?

谁能给我一些资源或教程或提示?

这里,sn-p 代码的两部分如下所示。

第一部分

0654 #define SEG_NULLASM \
0655 .word 0, 0; \
0656 .byte 0, 0, 0, 0
0657
0658 // The 0xC0 means the limit is in 4096−byte units
0659 // and (for executable segments) 32−bit mode.
0660 #define SEG_ASM(type,base,lim) \
0661 .word (((lim) >> 12) & 0xffff), ((base) & 0xffff); \
0662 .byte (((base) >> 16) & 0xff), (0x90 | (type)), \
0663 (0xC0 | (((lim) >> 28) & 0xf)), (((base) >> 24) & 0xff)
0664
0665 #define STA_X 0x8 // Executable segment
0666 #define STA_E 0x4 // Expand down (non−executable segments)
0667 #define STA_C 0x4 // Conforming code segment (executable only)
0668 #define STA_W 0x2 // Writeable (non−executable segments)
0669 #define STA_R 0x2 // Readable (executable segments)
0670 #define STA_A 0x1 // Accessed

第二部分

8480 # Bootstrap GDT
8481 .p2align 2 # force 4 byte alignment
8482 gdt:
8483 SEG_NULLASM # null seg
8484 SEG_ASM(STA_X|STA_R, 0x0, 0xffffffff) # code seg
8485 SEG_ASM(STA_W, 0x0, 0xffffffff) # data seg
8486
8487 gdtdesc:
8488 .word (gdtdesc − gdt − 1) # sizeof(gdt) − 1
8489 .long gdt # address gdt

完整部分:http://pdos.csail.mit.edu/6.828/2012/xv6/xv6-rev7.pdf

【问题讨论】:

    标签: gdt


    【解决方案1】:

    嗯,这根本不是一个真正的公式。限制向右移动 12 位,相当于除以 2^12,什么是 4096,这是 GDT 条目基数的粒度,当 G 位被设置时(在你的代码中,G 位被编码在你使用的常量中你的宏)。每当要使用 correnspondig 选择器访问地址时,只会将高 20 位与 limit 进行比较,如果它们更大,则抛出 #GP。另请注意,标准页面的大小为 4KB,因此任何大于限制小于 4 KB 的数字都由页面对应的选择器限制处理。着陆部分是为了抑制关于数字溢出的编译器警告,因为操作数 0xFFFF 是单个字(16 位)的最大值。

    同样适用于其他移位和 AND,在其他表达式中,数字可以移动更多以获得其他部分。

    【讨论】:

      【解决方案2】:

      GDT描述符的结构见上。

      ((lim) >> 12) & 0xffff)对应Segment Limit(Bit 0-15)。右移表示最小单位为 2^12 字节(GDT 入口基数的粒度); && 0xffff 表示我们需要lim) >> 12 的低 16 位,它适合 GDT 描述符的 16 位的最低部分。

      “公式”的其余部分相同。

      here是学习GTD描述符的好资料。

      【讨论】:

        猜你喜欢
        • 2022-08-19
        • 2021-08-26
        • 1970-01-01
        • 1970-01-01
        • 2018-06-22
        • 2013-01-17
        • 2020-05-14
        • 1970-01-01
        相关资源
        最近更新 更多