大家好,欢迎来到IT知识分享网。
我们uefi firmware 模块,是通过几个core 联系到一起的,这几个core 包括(SEC core, PEI core, Dxe core, SMM core)。如果单单从软件角度讲想学习UEFI 架构,那么这几个core 是很值得学习的,因为他们说架构核心。当然这是指软件方面的,因为还有各种外围设备,总线协议,等等要去学习或者了解。
介绍EFI 这种能被动态load 然后还能被执行的image 来讲,我们首先先来热身一下,通过一个例子,我们可能会比列出各种spec ,贴代码强多了。通过例子来思考可能会有带入感,再去看spec,就会很有感觉。
- 我们首先先实现一个c 程序a.c 和一个经过编译过的可执行文件b.bin。在a.c 里去动态加载到内存里,然后把控制权交给b.bin
这个问题首先我们是要练习如果在一个程序里去加载另外的程序并执行它,所以我们不考虑增加线程或者进程去实现它。
下面是我的实现思路(linux )
- 这个linux 下比较好实现,其实windows 下思路一样,只不过函数名字不一样而已。linux 有一个mmap函数它会把其他文件映射到当前进程的虚拟空间里。并且映射的地址空间可以设置成可读,可写,可执行。所以知道这个mmap function 其他就迎刃而解了。下面是伪代码:
//a.c handle = open(b.bin) // address 是映射文件到内存返回的虚拟地址 address = mmap(handle,可读,可写,可执行) //把控制权交给b.bin jmp/call address -------------------------------- b.c // b.bin 就是一个打印hello world 的可执行文件 char str[] = "hello world\n" write (4, 1, str, strlen(str));
- 思路就是这样,看起来a.c 不难,b.c 更是简单,但是把这两个合在一块能在屏幕上打印一个hello world 还是有点细节要注意的。(赶紧去写一个吧,看看能不能打印出来)。
- 如果自己写的执行有点问题可以接着往下看看,我直接就贴代码了。
.section .data output: .asciz "Hello World\n" length: .int .-output .section .text .global _start _start: movl $4, %eax movl $1, %ebx movl $output, %ecx movl length, %edx int $0x80 movl $1, %eax movl $0, %ebx int $0x80 ; 这个就是那个只打印hello world 的源文件 hello.s, ; 这里是用的汇编调用int 0x80 的function 4 也就是 write。
hello.s 还是很简单的,但是有一个细节地方
movl $output, %ecx
这张图,我们可以看到编译器要告诉它人,.text 需要重定向,两个地方,分别是.text 段偏移0x0b 位置,和 0x12 的位置,填什么值,后面VALUE 字段有讲。
代码链接:
app
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/128854.html