0

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

例如

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

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

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

在这里,这是我的问题的两部分代码片段。

第一部分

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

4

2 回答 2

2

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

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

于 2013-08-14T15:50:35.203 回答
0

GDT 描述符

GDT 描述符的结构见上。

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

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

是学习 GTD 描述符的好材料。

于 2018-03-21T13:45:23.477 回答