我很难理解JOS (xv6-rev7)中的GDT (全局描述符表)。
例如
.word (((lim) >> 12) & 0xffff), ((base) & 0xffff); 为什么右移12?为什么呢?
这些数字是什么意思?
这个公式是什么意思?
有人能给我一些资源、教程或提示吗?
这里,对于我的问题,这是两部分代码片段,如下所示。
第一部分
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
发布于 2013-08-14 15:50:35
这根本不是一个真正的公式。当设置G位(在代码G位中用宏中使用的常量编码)时,极限向右移动12位,等效于除法2^12,什么是4096,也就是GDT入口基的粒度。每当使用corren海绵体选择器访问地址时,只有更高的20位与限制相比较,如果它们更大,则抛出#GP。还请注意,标准页的大小为4KB,因此任何大于小于4KB的数字都由页面对应的选择器限制来处理。登陆部分是为了抑制编译器对数字溢出的警告,因为操作数0xFFFF是单个字(16位)的最大值。
同样也适用于其他移位,而且,在其他表达式中,数字可以移动更多以获得另一部分。
发布于 2018-03-21 13:45:23

GDT描述符的结构见上文。
((lim) >> 12) & 0xffff)对应于分段限制(位0-15)。右移意味着最小单位是2^12字节( GDT入口基的粒度);&& 0xffff意味着我们需要更低的16位lim) >> 12,它适合16位GDT描述符的最低部分。
其余的“公式”是相同的。
这里是学习GTD描述符的好材料。
https://stackoverflow.com/questions/15745996
复制相似问题