📄 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:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -