#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)