其他分享
首页 > 其他分享> > 加载内核.

加载内核.

作者:互联网

1.ELF文件格式

在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。
详细了解
在这里插入图片描述
在这里插入图片描述

2.加载内核

KERNEL_START_SECTOR  EQU 0x9    	 kernel.bin的扇区号
KERNEL_BIN_BASE_ADDR EQU 0x70000	从磁盘读入后 写入该地址
KERNEL_ENTRY_POINT equ 0xc0001500	内核的入口函数的地址

初始化内核

;/*****Init Kernel*********/
Init_Kernel:

	MOV EAX, 0			;CLear EAX EBX ECX EDX
	MOV EBX, 0
	MOV ECX, 0
	MOV EDX, 0

	MOV DX, [KERNEL_BIN_BASE_ADDR + 42] ; phentsize 程序头表大小
	MOV EBX, [KERNEL_BIN_BASE_ADDR + 28]; phoff	    程序头表的偏移
	ADD EBX, KERNEL_BIN_BASE_ADDR	;phaddr         程序头表的地址
	MOV CX, [KERNEL_BIN_BASE_ADDR + 44]	; phnum		程序头表的个数
	

	现在EBX就是程序头表的地址
.Each_Segment:

	CMP byte [EBX + 0], PT_NULL 		;program head not exist
	JE  .PTNULL							程序头表不存在

	对每一个程序头表 将其拷贝的虚拟内存对应的位置上去 
	;/*****MemCpy(dst, src, size)*****/

	PUSH dword [EBX+16]		;p_filesize
	MOV  EAX,  [EBX+4]		;p_offest
	ADD  EAX,  KERNEL_BIN_BASE_ADDR
	PUSH EAX
	PUSH dword [EBX+8]		;p_vaddr

	CALL Mem_Cpy
	ADD ESP, 12			;Clear Stack
	
.PTNULL:
	ADD EBX, EDX     	;EDX 就是一个程序头表的大小
	
	LOOP .Each_Segment
	RET

Mem_Cpy:
	;逐字节拷贝 
	CLD				; DF = 0
	PUSH EBP
	MOV  EBP, ESP
	PUSH ECX
	
	MOV EDI, [EBP+8]		;des
	MOV ESI, [EBP+12]		;src
	MOV ECX, [EBP+16]		;size
	REP MOVSB


	POP  ECX
	POP  EBP
	RET

标签:KERNEL,ADDR,MOV,BASE,内核,头表,EBX,加载
来源: https://blog.csdn.net/ZZHinclude/article/details/121453577