加载内核.

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值