linux0.11之加载二进制文件(续)

 

这里主要想说一说do_execve具体所做的几件事情,也就是怎样加载并执行子进程。

        

程序被加载时,程序参数信息和环境信息需要被初始化到任务空间末端,Linux0.11允许有128KB空间用于存放参数和环境变量字符串。

do_execve (unsigned long *eip, long tmp, char *filename,char **argv, char **envp);

do_execve的函数传递过来的参数包含了参数信息指针和环境信息指针,所以,需要复制到任务堆栈中。

复制操作由函数copy_strings完成。

static unsigned longcopy_strings (int argc, char **argv, unsigned long *page,unsigned long p, int from_kmem);

上面的page指针是128KB空间的起始地方,即32页起始地方。P为偏移前面起始空间指针,初始化时为偏移128KB,即32页尾部,因为复制是逆向的,类似于堆栈操作一样。from_kmem标示字符串数组或者字符串来自用户段还是内核段。


一次调用copy_strings复制环境信息,一次复制参数信息,之后的内存情况如下图所示。

 

复制环境信息和参数信息之后,接着创建了环境和参数变量指针表。这个操作通过调用create_tables函数完成。

static unsigned long *create_tables (char *p, int argc, int envc);

p为复制完环境和信息之后的偏移指针,变量指针表紧接着环境和参数字符串的。

 

 

 

这之后,就需要更新当前进程上下文环境了。

这些包括将新的可执行程序i节点赋给任务,复位信号句柄,关闭文件等操作。最后会释放原程序代码和数据段,修改局部描述符中基址及限长。这里会调用change_ldt函数来实现。继续初始化任务一些字段值。

最后设置堆栈上的代码指针为新程序的入口,堆栈指针为上述变量指针表处,do_execve返回就会运行新的程序。

需要注意的是,代码和数据并没有复制到任务空间中,所以,新程序一开始就会出现缺页中断加载代码和数据。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值