设为首页 加入收藏

TOP

操作系统开发系列—12.c.从Loader加载ELF内核,顺便解释下函数调用过程 ●(二)
2017-10-12 18:11:35 】 浏览:8176
Tags:操作系统 开发 系列 12.c. Loader 加载 ELF 内核 顺便 解释 函数 调用 过程
inc esi ; ┃ ; ┣ 逐字节移动 mov byte [es:edi], al ; ┃ inc edi ; ┛ dec ecx ; 计数器减一 jmp .1 ; 循环 .2: mov eax, [ebp + 8] ; 返回值 pop ecx pop edi pop esi mov esp, ebp pop ebp ret ; 函数结束,返回 ; MemCpy 结束------------------------------

调用call指令的时候会自动把eip压入栈中,MemCpy第一句把ebp压栈,所以现在栈内情况如下图:

然后把esp的值赋给ebp,因此[ebp + 8]的值就是dst,[ebp+12]就是src,[ebp+16]就是栈最底部的size。然后就是逐字节把src的内容复制到dst,最后把dst的值当成返回值赋给eax寄存器。最后依次弹出压入的值并调用ret(pop eip),那么栈里还剩下dst、src、size共12字节的数据,所以在call MemCpy之后是add esp, 12.

接下来就是向内核跳转

;***************************************************************
	jmp	SelectorFlatC:KernelEntryPointPhyAddr	; 正式进入内核 *
	;***************************************************************

KernelEntryPointPhyAddr定义在头文件load.inc中,其值为0x30400.当然,它必须跟我们的ld的参数-Ttext指定的值是一致的。将来如果我们想将内核放在另外的位置,只需改动这两个地方就可以了。

运行结果如下:

成功了,出现字符“K”,这表明我们的内核在执行了。Loader的使命圆满结束。

 

一个码农的日常 

源码

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇操作系统开发系列—12.b.从Loader.. 下一篇每建一个Activity都要注册权限Man..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目