我很难理解JOS中的GDT(全局描述表)(xv6-rev7)
例如
.word (((lim) >> 12) & 0xffff), ((base) & 0xffff);
为什么右转12?为什么AND 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
答案 0 :(得分:2)
嗯,这根本不是一个真正的公式。限制向右移12位,相当于除以2 ^ 12,什么是4096
,这是GDT入口基础的粒度,当G位置位时(在你的代码中G位以常量编码)在你的宏中使用)。每当使用correnspondig选择器访问地址时,只有高20位与限制进行比较,如果它们更大,则抛出#GP。另请注意,标准页面大小为4KB,因此任何大于限制小于4千字节的数字都由页面对应的选择器限制处理。由于操作数0xFFFF
是单个字(16位)的最大值,因此着陆部分用于抑制编号器有关数字溢出的警告。
同样适用于其他移位和AND,在其他表达式中,数字可以移位更多以获得另一部分。
答案 1 :(得分:0)
GDT描述符的结构见上文。
((lim) >> 12) & 0xffff)
对应于段限制(位0-15)。右移意味着最小单位是2 ^ 12字节(GDT入口基础的粒度); && 0xffff
表示我们需要lim) >> 12
的低16位,它适合GDT描述符的16位的最低部分。
其余的'公式'是一样的。
here是学习GTD描述符的好材料。