linux执行class文件_深入理解linux内核——可执行文件执行过程(2)

接上篇。。

13。调用do_mmap()函数创建一个新线性区来对可执行文件正文段(即代码)进行映射。这个线性区的起始线性地址依赖于可执行文件的格式,因为程序的可执行代码通常是不可重定位的。因此,这个函数假定从某一特定逻辑地址的偏移量开始(因此就从某一特定的线性地址开始)装入正文段。ELF程序被装入的起始线性地址为0x08048000.

14。调用do_mmap()函数创建一个新线性区来对可执行文件的数据段进行映射。这个线性区的起始线性地址也依赖于可执行文件的格式,因为可执行代码希望在特定的偏移量(即特定的线性地址)处找到它自己的变量。在ELF程序中,数据段正好被装在正文段之后

15。为可执行文件的其他专用段分配另外的线性区,通常是无。

ccb5bd78d23263d2227736c1be3bcebb.png

16。调用一个装入动态链接程序的函数。如果动态链接程序是ELF可执行的,这个函数叫做load_elf_interp()。一般情况下,这个函数执行第12〜14的操作,不过要用动态链接程序代替被执行的文件。动态链接程序的正文段和数据段在线性区的起始线性地址是由动态链接程序本身指定的:但它们处于高地址区(通常高于0x40000000),这是为了避免与被执行文件的正文段和数据段所映射的线性区发生冲突。

17。把可执行格式的linux_binfmt对象的地址存在进程描述符的binfmt字段中。

18。确认进程的新权限

dd88f923ab808c85ecdd56c850ba7605.png

19。创建特定的动态链接程序表并把它们存在在用户态堆栈,这些表处于命令行参数据和指向环境串的指针数组之间。

20。设置进程的内存描述符的start_code、end_code、start_data、end_data、start_brk、brk及start_stack字段。

21。调用do_brk()函数创建一个新的匿名线性区来映射程序的bss段(当进程写入一个变量时,就触发请求调页,进而分配一个页框)。这个线性区的大小是在可执行程序被链接时就计算出来的。因为程序的可执行代码通常是不可重新定位的,因此,必须指定这个线性区的起始地址。在ELF程序中,bss段正好装在数据段之后

68257d1b2bd2313e94c5365c5c9db07f.png

22。调用start_thread()宏修改保存在内核态堆栈但属于用户态寄存器的eip和esp的值,以使它们分别指向动态链接程序的入口点新的用户态堆栈的栈顶

23。如果进程正被跟踪,就通知调试程序execve()系统调用已完成。

24。返回0值(成功)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值