Kernel CPU是否忽略gdt段?

Kernel CPU是否忽略gdt段?,kernel,gdt,Kernel,Gdt,我正在学习内核开发。用一本书我得出了一个结论。然而,我不能真正理解全局描述符表的影响。我的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如下所示:

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并将数据_SEG分配给ds、ss、es、fs、gs寄存器后;我的汇编代码跳转到c代码。数据段基址为0x00000000,限制为0xffff。难道不应该不可能为0x100000内存地址设置一个值吗


谢谢

限制是由粒度决定的

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


粒度由内存中每个GDT条目中的第二个db决定。因为该值的顶部位为1,所以选择了4K粒度。

谢谢。如何将0xfffff分配给2字节区域。是打字错误吗?当我按照您的解释更改gdt时,我可以将值设置为0x300000。我已经更新了我的问题,请检查一下好吗?基本和限制在gdt的多个部分中。与16位字一样,其他值中也使用了更多的位。请参阅以获取显示此信息的图形。基址有32位,限制有20位。Ok。谢谢你,我明白。但我仍然可以将数据放入超出限制+基址的内存地址。为什么会发生这种情况?您已将问题编辑为另一个问题,更改了graularity部分。如果是这样的话,问一个新问题几乎总是一个更好的主意。