grow on demand heap
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / prologue.S
1 /* 高半核入口点 - 0xC0000000 */
2
3 .section .text
4     .global hhk_entry_
5     hhk_entry_:
6         /*
7             欢迎来到虚拟内存的世界! :D
8          */
9
10         subl $16, %esp
11         /* 
12             最终还是决定将IDT&GDT的初始化和安装放在这里
13             注意:由于已开启分页,GDTR与IDTR里面放的不是物理地址,是线性地址! 
14         */
15         /* 
16             加载 GDT 
17             P.s. 虽然GDT在分页后已变得不重要,甚至可以忽略不作。但为了保持完整性,还是选择加载他
18                     这主要是为了保险起见,让GDTR有一个合法的值,否则多咱的粗心大意,容易出#GP
19         */
20         call _init_gdt
21         movl $_gdt, 2(%esp)
22         movw _gdt_limit, %ax
23         movw %ax, (%esp)
24         lgdt (%esp)
25
26         /* 更新段寄存器 */
27         movw $0x10, %cx
28         movw %cx, %es
29         movw %cx, %ds
30         movw %cx, %fs
31         movw %cx, %gs
32         movw %cx, %ss
33
34         /* 更新 CS:EIP */
35         pushw $0x08
36         pushl $_after_gdt
37         retf
38
39     _after_gdt:
40
41         movl $mb_info, (%esp)
42
43         call _kernel_pre_init
44
45         subl $6, %esp
46
47         # 加载 IDT
48         movl $_idt, 2(%esp)
49         movw _idt_limit, %ax
50         movw %ax, (%esp)
51         lidt (%esp)
52
53         addl $6, %esp
54
55         movl $mb_info, (%esp)
56         call _kernel_init
57
58         /* 
59             加载新的栈指针,位于0xffbfffff,但因为16字节对齐的需求,低四位清零。
60             为什么不是0xffffffff? 因为0xffc00000 - 0xffffffff 这4MiB的空间用于
61             对页表与页目录的循环映射。
62         */
63         mov $0xffbffff0, %esp
64
65         call _kernel_post_init
66
67         /* 进入内核 */  
68         call _kernel_main
69
70         cli
71     j_:
72         hlt
73         jmp j_