⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 head.s

📁 国内一位牛人自己开发的操作系统
💻 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 + -