refactor: restructure the user space stuff.
[lunaix-os.git] / lunaix-os / arch / x86 / boot.S
1 #define __ASM__ 1
2 #include <arch/x86/boot/multiboot.h>
3
4 #define MB_FLAGS    MULTIBOOT_MEMORY_INFO | MULTIBOOT_PAGE_ALIGN
5 #define KPG_SIZE    10*4096
6
7 .section .multiboot
8     .long MULTIBOOT_MAGIC
9     .long MB_FLAGS
10     .long CHECKSUM(MB_FLAGS)
11
12 .section .bss
13     .global mb_info
14     .align 16
15     /* 为Multiboot info struct 预留空间 */
16     mb_info:
17         .skip 4096
18     /* 根据System V ABI,栈地址必须16字节对齐 */
19     /* 这里只是一个临时栈,在_hhk_init里面我们会初始化内核专用栈 */
20     stack_bottom:
21         .skip 4096, 0
22     __stack_top:
23
24
25 /* 
26     1 page directory, 
27     9 page tables:
28         1. Mapping reserved area and hhk_init
29         2-9. Remapping the kernels
30 */
31
32 .section .kpg
33     .global _k_ptd
34     _k_ptd:
35         .skip KPG_SIZE, 0
36
37
38 .section .hhk_init
39     .global start_
40     .type start_, @function     /* Optional, this just give the 
41                                  * linker more knowledge about the label 
42                                  */
43     start_: 
44         cld
45         # 确保屏蔽所有外中断,直到我们准备好PIC为止
46         cli
47         movl $__stack_top, %esp
48
49         subl $16, %esp
50
51         /* 
52             将咱们的 multiboot_info 挪个地儿,就是上述预留的空间里
53             而后在_hhk_init里,我们会对所有的高半核初始化代码(arch/x86下的所有)进行Identity map
54             这样,我们能够保证当分页与虚拟地址开启后,我们的内核能够访问到multiboot info table
55          */
56
57         movl $mb_info, 4(%esp)
58         movl %ebx, (%esp)
59         call _save_multiboot_info
60
61         /*
62             _hhk_init用来初始化我们高半核:
63                 1. 初始化最简单的PD与PT(重新映射我们的内核至3GiB处,以及对相应的地方进行Identity Map)
64         */
65
66         movl $(KPG_SIZE), 4(%esp)
67         movl $(_k_ptd - 0xC0000000), (%esp)    /* PTD物理地址 */
68         call _hhk_init
69
70         /*
71             基本的映射定义好了,我们可以放心的打开分页了
72             我们只需要把PTD的基地址加载进CR3就好了。
73         */
74
75         /* 加载PTD基地址(物理地址) */
76         movl (%esp), %eax
77         andl $0xfffff000, %eax      # 有点多余,但写上还算明白一点
78         movl %eax, %cr3
79
80         movl %cr0, %eax
81         orl $0x80000000, %eax   /* 开启分页与地址转换 (CR0.PG=1, CR0.WP=0) */
82         andl $0xfffffffb, %eax
83         orl $0x2, %eax          /* 启用x87 FPU (CR0.MP=1, CR0.EM=0) */
84         movl %eax, %cr0
85
86         movl %cr4, %eax
87         orl $0x600, %eax
88         movl %eax, %cr4         /* CR4.OSFXSR=1, CR4.OSXMMEXCPT=1 */
89                                 /* x87 FPU 已配置 */
90
91         addl $16, %esp
92
93         /* 进入高半核! */
94         pushl $hhk_entry_
95         ret