#include <mmu.h>
|
|
#include <memlayout.h>
|
|
|
|
#define REALLOC(x) (x - KERNBASE)
|
|
|
|
.text
|
|
.globl kern_entry
|
|
kern_entry:
|
|
# reload temperate gdt (second time) to remap all physical memory
|
|
# virtual_addr 0~4G=linear_addr&physical_addr -KERNBASE~4G-KERNBASE
|
|
lgdt REALLOC(__gdtdesc)
|
|
movl $KERNEL_DS, %eax
|
|
movw %ax, %ds
|
|
movw %ax, %es
|
|
movw %ax, %ss
|
|
|
|
ljmp $KERNEL_CS, $relocated
|
|
|
|
relocated:
|
|
|
|
# set ebp, esp
|
|
movl $0x0, %ebp
|
|
# the kernel stack region is from bootstack -- bootstacktop,
|
|
# the kernel stack size is KSTACKSIZE (8KB)defined in memlayout.h
|
|
movl $bootstacktop, %esp
|
|
# now kernel stack is ready , call the first C function
|
|
call kern_init
|
|
|
|
# should never get here
|
|
spin:
|
|
jmp spin
|
|
|
|
.data
|
|
.align PGSIZE
|
|
.globl bootstack
|
|
bootstack:
|
|
.space KSTACKSIZE
|
|
.globl bootstacktop
|
|
bootstacktop:
|
|
|
|
.align 4
|
|
__gdt:
|
|
SEG_NULL
|
|
SEG_ASM(STA_X | STA_R, - KERNBASE, 0xFFFFFFFF) # code segment
|
|
SEG_ASM(STA_W, - KERNBASE, 0xFFFFFFFF) # data segment
|
|
__gdtdesc:
|
|
.word 0x17 # sizeof(__gdt) - 1
|
|
.long REALLOC(__gdt)
|
|
|