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