Virtual memory & paging
[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         call _kernel_init
43
44         # 加载 IDT
45         movl $_idt, 2(%esp)
46         movw _idt_limit, %ax
47         movw %ax, (%esp)
48         lidt (%esp)
49
50         /* 
51             加载新的栈指针,位于0xffbfffff,但因为16字节对齐的需求,低四位清零。
52             为什么不是0xffffffff? 因为0xffc00000 - 0xffffffff 这4MiB的空间用于
53             对页表与页目录的循环映射。
54         */
55         mov $0xffbffff0, %esp     
56
57         /* 进入内核 */  
58         call _kernel_main
59
60         cli
61     j_:
62         hlt
63         jmp j_