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: