从操作系统角度看可执行文件的装载和执行

进程的建立:
  创建一个进程,然后装载相应的可执行文件并执行。
  1.创建一个独立的虚拟地址空间。
  2.读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系。
  3.将cpu的指令寄存器设置为可执行文件的入口地址,启动运行。
  1.创建虚拟地址空间
  创建一个虚拟地址空间并不是真正地创建空间而是创建映射函数所需要的相应的数据结构,在i386的linux下,创建虚拟地址实际上只是分配一个页目录(Page Directory)就可以了。这一步的映射关系式虚拟空间到物理内存的映射关系。
  2.读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系
  可执行文件与执行该可执行文件进程的虚拟空间的映射关系只是保存在操作系统内部的一个数据结构。windows中将进程虚拟空间中的一个段叫做虚拟段,在linux中叫虚拟内存区域(VMA)。操作系统创建进程后会在进程相应的数据结构中设置一个各个段的VMA。VMA是一个很重要的概念,它对于我们理解程序的执行很热闹操作系统如何管理进程虚拟空间有非常重要的帮助。操作系统在内部保存这种结构,很明显是因为当程序执行发生页错误时,它可以通过查找这样的一个数据结构来定位错误页在可执行文件中的位置。
  3.将cpu指令寄存器设置成可执行文件入口,启动运行。
  上面的3个步骤执行完后,其他可执行文件的真正指令和数据都没有被被装入内存中。操作系统只是通过可执行文件的头部信息建立起可执行文件和进程虚存之间的映射关系而已。假设程序的入口地址为0x08048000,即刚好是.text段的起始地址。当CPU开始打算执行这个地址的指令时,发现页面0x08048000---0x08049000是一个空页面,于是就认为这是一个页错误(page fault)。CPU将控制权交给操作系统,操作系统有专门的页错误处理机制例程来处理这种情况。这时候装载过程的第二部建立的数据结构气到了关键的作用,操作系统将查询这个数据结构,然后找到空页面所在的VMA,计算相应的页面在可执行文件中的偏移,然后再物理内存中分配一个物理页面,将进程中该虚拟页与分配的物理页之间建立映射关系,然后把控制权还给进程,进程从刚才页错误的位置重新开始执行。
最新内容请见作者的GitHub页:http://qaseven.github.io/

上一篇:优秀国外网页设计欣赏的200佳网站推荐(系列十二)


下一篇:企业上云最佳实践:账号安全管理之 RAM 访问控制