可执行文件的装载

程序的装载过程大体上可以分为6个步骤:

1)新建进程调用do_execve()后查找文件,找到后先读取前128字节(魔数),判断 文件类型,其中有elf、#!(脚本)、cafe(java)等;

2)在获取了文件类型后,调用相应的加载函数,处理文件的加载过程;

3)寻找动态链接器路径(存在动态链接)

4)根据文件头中的信息进行文件的映射,其中包括代码、数据等

5)初始化ELF文件环境

6)将系统调用返回入口设置为elf入口,并将执行权交给elf文件入口,对于动态链接而言,elf文件的入口时动态链接器的入口;

可执行文件的装载最重要的就是讲elf文件中的虚拟地址映射到物理地址,也就是进行页表映射。另外虚拟地址必须也与文件建立映射关系,这样就能通过虚拟地址将物理地址和文件联系起来。而虚拟地址和文件的映射是通过vma的数据结构进行的。在编译的时候我们都知道生成了很多的段,其中包括代码段、数据段等,在elf文件与虚拟地址映射的时候为每个段建立一个vma。在vma中包括文件的位置、文件的属性、文件的权限(读、写)以及虚拟地址的起始和终止位置等。由于vma是以页为单位的,所以对于一些小的段可能会造成大量的内部碎片,所以可以将许多具有相同属性的段进行合并。同时也可以将一个物理页与多个vma进行映射。程序中的堆区和栈区也有对应的vma,这种vma没有对应的文件,被称为匿名文件区域。

在上述两种映射机制完成后,elf文件的指令和数据其实并没有真正的装载到内存中。操作系统知识通过可执行文件的头部信息建立起了映射关系。只有当访问某一个虚拟页,却发现相应的物理页的时候,才将真正的指令和数据加载到内存中。

另外为了保证程序的运行,需要环境和为程序传递参数。环境变量的设置和main参数的传递都是通过堆栈进行的。在将执行权交给elf文件之前,现将环境变脸和参数信息压入程序栈中,在程序真正执行后自动读取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值