2 #include <arch/x86/boot/multiboot.h>
4 #define MB_FLAGS MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN
5 #define KPG_SIZE 24*1024
10 .long CHECKSUM(MB_FLAGS)
15 /* 为Multiboot info struct 预留空间 */
18 /* 根据System V ABI,栈地址必须16字节对齐 */
19 /* 这里只是一个临时栈,在_hhk_init里面我们会初始化内核专用栈 */
28 1. Mapping reserved area and hhk_init
29 2-5. Remapping the kernels
40 .type start_, @function /* Optional, this just give the
41 * linker more knowledge about the label
51 将咱们的 multiboot_info 挪个地儿,就是上述预留的空间里
52 而后在_hhk_init里,我们会对所有的高半核初始化代码(arch/x86下的所有)进行Identity map
53 这样,我们能够保证当分页与虚拟地址开启后,我们的内核能够访问到multiboot info table
56 movl $mb_info, 4(%esp)
58 call _save_multiboot_info
62 1. 初始化最简单的PD与PT(重新映射我们的内核至3GiB处,以及对相应的地方进行Identity Map)
65 movl $(KPG_SIZE), 4(%esp)
66 movl $(_k_ptd - 0xC0000000), (%esp) /* PTD物理地址 */
70 基本的映射定义好了,我们可以放心的打开分页了
71 我们只需要把PTD的基地址加载进CR3就好了。
76 andl $0xfffff000, %eax # 有点多余,但写上还算明白一点
79 /* 开启分页与地址转换 (CR0.PG=1) */