www.pudn.com > LFYOS.zip > head.s
.global startup_32,stext,kernel_stack_descr .text stext: startup_32: cld movl $(0x18),%eax movl %eax,%ds movl %eax,%es movl %eax,%fs movl %eax,%gs movl $page_0-0xc0000000,%edi /* initialize page tables */ movl $007,%eax /*"007" doesn't mean with right to kill, but PRESENT+RW+USER */ 2: stosl add $0x1000,%eax cmp $end_system_page_table-0xc0000000,%edi jne 2b 3: movl $page_dir-0xc0000000,%edi xorl %eax,%eax 2: stosl cmp $page_dir-0xc0000000+0x1000,%edi jne 2b movl $page_dir-0xc0000000,%edi movl $0x00102007,%eax movl %eax,0x000(%edi) movl %eax,0xc00(%edi) movl $0x00103007,%eax movl %eax,0x004(%edi) movl %eax,0xc04(%edi) movl $0x00104007,%eax movl %eax,0x008(%edi) movl %eax,0xc08(%edi) movl $0x00105007,%eax movl %eax,0x00c(%edi) movl %eax,0xc0c(%edi) movl $page_dir-0xc0000000,%eax movl %eax,%cr3 /* set the page table pointer.. */ movl %cr0,%eax orl $0x80000000,%eax movl %eax,%cr0 /* ..and set paging (PG) bit */ jmp 1f /* flush the prefetch-queue */ 1: movl $1f,%eax jmp *%eax /* make sure eip is relocated */ 1: lss kernel_stack_descr,%esp pushl $0 popfl movl %cr0,%eax # 486 or better andl $0x80000011,%eax # Save PG,PE,ET orl $0x50022,%eax # set AM, WP, NE and MP movl %eax,%cr0 check_x87: clts fninit lgdt gdt_descr ljmp $(0x10),$(1f) 1: movl $(0x18),%eax #reload all the segment registers movl %eax,%ds # after changing gdt. movl %eax,%es movl %eax,%fs movl %eax,%gs lss kernel_stack_descr,%esp # Load processor stack xorl %eax,%eax lldt %ax call setup_idt call setup_task call init_tlb call os_init call setup_timer pushl $(0x00) call set_gdt_item popl %eax jmp restore_parameter .global start_os start_os: movl $(0xc0000ffc),%esp movl %cs,%eax andl $(0x03),%eax jne 1f sti 1: jmp lfyos_main .global page_dir,page_0,system_page_table .org 0x1000 .align 0x1000 page_dir: .org page_dir+0x1000 system_page_table: page_0: .org page_dir+0x2000 page_1: .org page_dir+0x3000 page_2: .org page_dir+0x4000 page_3: .org page_dir+0x5000 end_of_page_table: empty_zero_page: .org system_page_table+1024*1024 end_system_page_table: .align 16 kernel_stack_descr: .long 0xc00a0000 .long 0x18 kernel_stack_descr_end: