Я сейчас настраиваю GDT для моего загрузчика.У меня есть 3 (4) сегмента:
- (нулевой сегмент)
- Сегмент кода ядра 4 ГБ
- Сегмент данных ядра 4 ГБ
- 2 ГБ стека данныхраздел (я забыл установить 1 бит в 0, когда я сделал скриншоты. Позже это будет 1 МБ)
Вот мой код для настройки GDT:
7 ; GDT null segment
8 gdt_null:
9 dq 0x00
10
11 ; GDT code segment (4GB)
12 gdt_code:
13 dw 0xFFFF
14 dw 0x00
15 db 0x00
16 db 10011010b
17 db 11001111b
18 db 0x00
19
20 ; GDT data segment (4GB)
21 gdt_data:
22 dw 0xFFFF
23 dw 0x00
24 db 0x00
25 db 10010010b
26 db 11001111b
27 db 0x00
28
29 ; Extra segmet for stack
30 ; Preventing bufferoverflows from stack could write into other data
31 ; Size is 1M (0x100 * 4kb) startting from base 7e00 (512 bytes after 7c00)
32 gdt_stack:
33 dw 0x0100
34 dw 0x7e00
35 db 0x00
36 db 10010010b
37 db 11001000b
38 db 0x00
Но когда я загружаю двоичный файл в bochs, он дает мне следующий результат:
Байты, загруженные в точности так, как я определил их в памяти:
Здесь я понял, что добавлено 0xFFFкаждый раз в сегмент.Это потому, что я использовал 4kb как гранулярность?
Когда я выберу 0xFF в качестве размера с гранулярностью 4kb, это будет увеличено до 0xFFFFF, поэтому я могу сделать только сегмент размером 1 Мб - 1 байт?