Сегмент 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 выбрана.