0

我正在研究内核开发。使用一本书,我已经明白了。但是,我无法真正理解全局描述符表的影响。我的 GDT 如下:

gdt_star:

gdt_null:
dd 0x0      
dd 0x0

gdt_code:
dw 0xffff   
dw 0x0000
db 0x00     
db 10011011b
db 11001111b
db 0x0      

gdt_data:
dw 0xffff
dw 0x0
db 0x00
db 10010010b
db 11001111b
db 0x0              

gdt_end:

gdt_descriptor:
dw gdt_end - gdt_star - 1
dd gdt_star

CODE_SEG equ gdt_code - gdt_star
DATA_SEG equ gdt_data - gdt_star

加载gdt并将DATA_SEG分配给ds、ss、es、fs、gs寄存器后;我的汇编代码跳转到 c 代码。数据段基地址为 0x00000000,限制为 0xffff。不应该给 0x100000 内存地址赋值吗?

谢谢

4

1 回答 1

0

限制按粒度缩放。

例如,如果您使用页面粒度 (4K),则限制0xfffff将允许您访问整个 4G 地址空间。

粒度由(从内存db中)每个GDT条目中的秒数决定。因为该值的最高位是1,所以选择了 4K 粒度。

于 2014-08-16T23:14:02.670 回答