Сегмент 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_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?

Спасибо

1 ответ

Предел масштабируется по степени детализации.

Например, если вы используете гранулярность страницы (4K), предел 0xfffff даст вам доступ ко всему адресному пространству 4G.

Зернистость продиктована (по памяти) вторым db в каждом GDT запись. Потому что верхний бит этого значения 1, гранулярность 4K выбрана.

Другие вопросы по тегам