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

简介:

进程的建立:
  创建一个进程,然后装载相应的可执行文件并执行。
  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/

相关文章
|
存储 API 虚拟化
【OSTEP】Introduction:操作系统介绍 | 程序运行时会发生什么?
【OSTEP】Introduction:操作系统介绍 | 程序运行时会发生什么?
66 0
|
2月前
|
存储 调度 iOS开发
MacOS环境-手写操作系统-32-进程挂起和恢复
MacOS环境-手写操作系统-32-进程挂起和恢复
23 0
|
7月前
|
存储 程序员
操作系统(10)----从写程序到程序运行
操作系统(10)----从写程序到程序运行
68 1
|
7月前
【嵌入式】虚拟机未能将管道连接到虚拟机: 系统找不到指定的文件
【嵌入式】虚拟机未能将管道连接到虚拟机: 系统找不到指定的文件
|
存储 Unix Java
探索操作系统:内核、启动和系统调用的奥秘
操作系统是计算机不可或缺的一部分,它连接着硬件和应用程序。内核是操作系统的核心,负责管理进程和线程、内存、硬件设备以及提供系统调用接口。计算机启动过程中,ROM负责加载并执行BIOS程序,而RAM用于存储运行中的程序和数据。系统调用是操作系统提供给应用程序的接口,通过系统调用可以访问操作系统的功能。系统调用相当于一个办事大厅,应用程序需要通过系统调用来完成特定的操作或获取特定的服务。
|
Linux
编译进内核的驱动是如何工作的
编译进内核的驱动是如何工作的
111 0
编译进内核的驱动是如何工作的
操作系统:利用fork()进行虚拟机环境下的多进程编程
操作系统:利用fork()进行虚拟机环境下的多进程编程
157 0
操作系统:利用fork()进行虚拟机环境下的多进程编程
|
Linux 索引
操作系统第四章_03 文件目录
操作系统第四章_03 文件目录
119 0
操作系统第四章_03 文件目录
|
存储 安全 Java
Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)
Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)
299 0
Android安全与逆向之Dalvik虚拟机架构和如何执行程序以及JIT(即时编译)
虚拟机文件系统混乱,导致编译失败
虚拟机文件系统混乱,导致编译失败
134 0
下一篇
DataWorks