Chinaunix首页 | 论坛 | 博客
  • 博客访问: 20823
  • 博文数量: 15
  • 博客积分: 670
  • 博客等级: 上士
  • 技术积分: 127
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-15 23:56
文章分类
文章存档

2010年(15)

我的朋友

分类: LINUX

2010-11-30 22:23:58

linux0.11是如何加载并执行一个二进制可执行文件和shell脚本文件的?

 

1.         linux0.11是如何加载并执行一个二进制可执行文件和shell脚本文件的?

(1)    答:linux0.11仅支持ZMAGIC执行文件格式,并且执行文件代码都从逻辑地址0开始执行,因此不支持含有代码或数据重定位信息的执行文件。加载并执行一个二进制文件或脚本的主要函数是do_execve(),其主要功能为:

a.   执行对命令行参数和环境参数空间页面的初始化操作------设置初试空间起始指针,初试空间页面指针数组为NULL,根据执行文件名取执行对象的i节点,计算参数个数和环境变量个数,检查文件类型,执行权限。

b.  根据执行文件开始部分的头数据结构,对其中信息进行处理------根据被执行文件i节点读取文件头部信息(二进制可执行文件和shell脚本文件都是作为普通文件进行读取);若是shell脚本程序(第一行以“#!”开始),则分析shell程序名及其参数,并以被执行文件作为参数执行指定的shell程序(这也就解释了为什么shell脚本都要以“#!”放在文件第一行开头)。

c.   对当前调用进程在运行新程序前进行初始化操作------指向新执行文件的i节点,复位信号处理句柄,根据头结构信息设置局部描述符基址和段长。设置参数和环境参数页面指针,修改进程各执行字段内容。

d.  替换堆栈中原调用execve()程序的返回地址为新执行程序运行地址,运行新加载程序(这个新执行程序运行的起始地址在这个执行文件头部数据结构中)。

(2)    说明:在do_execve()执行过程中,系统会清掉fork()复制的原程序的页目录和页表项。并释放对应的页面。系统仅为新加载的程序代码重新设置进程数据结构中的信息。申请和映射了命令行参数和环境参数块所占用的内存页面,以及设置了执行代码执行点。此时内核并不从执行文件所在设备上加载程序的代码和数据,当该过程返回时即开始执行新的程序。但一开始执行肯定会引起缺页异常中断发生,因为代码和数据还未被从块设备上读入内存,此时缺页异常处理过程会根据引起异常的线性地址在主内存区为新进程申请内存页面,并从设备上读入引起异常的指定页面,同时还为该线性地址设置对应的页目录项和页表项。

阅读(1175) | 评论(0) | 转发(0) |
0

上一篇:Porting gtk+-2.10.14 && directfb-1.0.0 on s3c2410

下一篇:没有了

给主人留下些什么吧!~~