我目前正在为我的引导加载程序设置 GDT。我有 3 (4) 段:
- (零段)
- 4GB 内核代码段
- 4GB 内核数据段
- 2GB 堆栈数据部分(我在截屏时忘记将 1 位设置为 0。稍后这将是 1mb)
这是我设置 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,所以我只能使段 1mb - 1 字节大吗?