2 #include <sys/boot/multiboot.h>
4 #define MB_FLAGS (MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN)
5 #define KPG_SIZE 10*4096
10 .long CHECKSUM(MB_FLAGS)
13 /* 根据System V ABI,栈地址必须16字节对齐 */
14 /* 这里只是一个临时栈,在_hhk_init里面我们会初始化内核专用栈 */
24 1. Mapping reserved area and hhk_init
25 2-9. Remapping the kernels
36 .type start_, @function /* Optional, this just give the
37 * linker more knowledge about the label
41 # 确保屏蔽所有外中断,直到我们准备好PIC为止
43 movl $__stack_top, %esp
48 parse multiboot struct into arch-agnostic boot info struct
56 1. 初始化最简单的PD与PT(重新映射我们的内核至3GiB处,以及对相应的地方进行Identity Map)
59 movl $(KPG_SIZE), 4(%esp)
60 movl $(_k_ptd - 0xC0000000), (%esp) /* PTD物理地址 */
64 基本的映射定义好了,我们可以放心的打开分页了
65 我们只需要把PTD的基地址加载进CR3就好了。
70 andl $0xfffff000, %eax # 有点多余,但写上还算明白一点
74 orl $0x80000000, %eax /* 开启分页与地址转换 (CR0.PG=1, CR0.WP=0) */
75 andl $0xfffffffb, %eax
76 orl $0x2, %eax /* 启用x87 FPU (CR0.MP=1, CR0.EM=0) */
81 movl %eax, %cr4 /* CR4.OSFXSR=1, CR4.OSXMMEXCPT=1 */