git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
integrate C/LDFLAGS into LunaBuild flow
[lunaix-os.git]
/
lunaix-os
/
arch
/
i386
/
boot
/
prologue.S
diff --git
a/lunaix-os/arch/i386/boot/prologue.S
b/lunaix-os/arch/i386/boot/prologue.S
index 7a516488df05fc882aa74ffdb8dd6e0d1fb6dd62..dc17242271d1cf1ee56c21443bca1f2fac00c3a1 100644
(file)
--- a/
lunaix-os/arch/i386/boot/prologue.S
+++ b/
lunaix-os/arch/i386/boot/prologue.S
@@
-1,7
+1,22
@@
/* 高半核入口点 - 0xC0000000 */
#define __ASM__
/* 高半核入口点 - 0xC0000000 */
#define __ASM__
-#include <sys/x86_isa.h>
+#include <sys/abi.h>
+#include <sys/failsafe.h>
+
+.section .bss.kstack
+ .global __kinit_stack_end
+
+ .align 16
+ __kinit_stack_end:
+ .skip 2048, 0
+ __kinit_stack_top:
+ # TODO
+ # This stack was too small that corrupt the ambient kernel structures.
+ # (took me days to figure this out!)
+ # We should spent more time to implement a good strategy to detect such
+ # run-over (we can check these invariants when we trapped in some non-recoverable
+ # state and provide good feedback to user)
.section .text
.global hhk_entry_
.section .text
.global hhk_entry_
@@
-9,18
+24,24
@@
/*
欢迎来到虚拟内存的世界! :D
*/
/*
欢迎来到虚拟内存的世界! :D
*/
+ movl $__kinit_stack_top, %esp
+ andl $stack_alignment, %esp
+
+ movl $__kinit_stack_end, %eax
+ movl $STACK_SANITY, (%eax)
+ movl $STACK_SANITY, 4(%eax)
+ movl $STACK_SANITY, 8(%eax)
+ movl $STACK_SANITY, 12(%eax)
subl $16, %esp
subl $16, %esp
- /*
- 最终还是决定将IDT&GDT的初始化和安装放在这里
- 注意:由于已开启分页,GDTR与IDTR里面放的不是物理地址,是线性地址!
- */
+
/*
加载 GDT
P.s. 虽然GDT在分页后已变得不重要,甚至可以忽略不作。但为了保持完整性,还是选择加载他
这主要是为了保险起见,让GDTR有一个合法的值,否则多咱的粗心大意,容易出#GP
*/
call _init_gdt
/*
加载 GDT
P.s. 虽然GDT在分页后已变得不重要,甚至可以忽略不作。但为了保持完整性,还是选择加载他
这主要是为了保险起见,让GDTR有一个合法的值,否则多咱的粗心大意,容易出#GP
*/
call _init_gdt
+
movl $_gdt, 2(%esp)
movw _gdt_limit, %ax
movw %ax, (%esp)
movl $_gdt, 2(%esp)
movw _gdt_limit, %ax
movw %ax, (%esp)
@@
-33,19
+54,14
@@
movw %cx, %fs
movw %cx, %gs
movw %cx, %ss
movw %cx, %fs
movw %cx, %gs
movw %cx, %ss
-
+
/* 更新 CS:EIP */
pushw $KCODE_SEG
pushl $_after_gdt
retf
_after_gdt:
/* 更新 CS:EIP */
pushw $KCODE_SEG
pushl $_after_gdt
retf
_after_gdt:
-
- movl $mb_info, _k_init_mb_info
-
- call _kernel_pre_init
-
- subl $6, %esp
+ subl $16, %esp
# 加载 IDT
movl $_idt, 2(%esp)
# 加载 IDT
movl $_idt, 2(%esp)
@@
-53,13
+69,15
@@
movw %ax, (%esp)
lidt (%esp)
movw %ax, (%esp)
lidt (%esp)
+ # perform arch-specific initialization before diving into kernel
+ call arch_preinit
+
/* 加载TSS段选择器 */
movw $TSS_SEG, %ax
ltr %ax
/* 加载TSS段选择器 */
movw $TSS_SEG, %ax
ltr %ax
- addl $6, %esp
-
- call _kernel_init
+ movl $bhctx_buffer, (%esp) # mb_parser.c
+ call kernel_bootstrap
1:
hlt
1:
hlt