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

简介:

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

相关文章
|
22天前
|
Python
文件元数据获取方法对比:`os.path` 与 `os.stat`
本文对比了Python中两种获取文件元数据的方法:`os.path`和`os.stat`。通过示例代码展示了如何获取文件大小和修改时间,并从性能、功能性和代码可读性三方面进行了详细对比。最终给出了根据具体需求选择合适方法的最佳实践建议。
24 2
|
2月前
|
存储 Java iOS开发
MacOS环境-手写操作系统-43-dir命令的实现 和 文件写入
MacOS环境-手写操作系统-43-dir命令的实现 和 文件写入
37 0
|
6月前
|
缓存 Linux Windows
初识Linux操作系统(根目录下的重要文件)(命令提示符的含义)
Linux系统基于"一切皆文件"的理念,重要文件分布在如/root(root用户目录)、/home(普通用户目录)、/etc(应用配置)、/dev(设备文件)、/boot(内核及启动文件)、/proc(动态系统信息)、/lib64(库文件)、/opt(软件存放)、/tmp(临时文件)。"[root@localhost ~]#"代表管理员在root目录,"$"代表普通用户。创建新用户用`useradd`命令。调节终端字体大小:Ctrl+Shift++增大,Ctrl+减号缩小。绝对路径从根目录开始,相对路径从当前目录开始。
|
6月前
|
Unix 关系型数据库 API
Python OS 文件/目录方法
Python OS 文件/目录方法
|
6月前
|
Java 开发工具 Android开发
详细解读Android开发DNK开发将.c文件打包成os
详细解读Android开发DNK开发将.c文件打包成os
35 0
|
6月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错合集之RocksDB在尝试打开更多文件时达到了操作系统允许的最大打开文件数限制,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
129 0
|
7月前
|
Ubuntu Linux iOS开发
LabVIEW在不同操作系统上使VI、可执行文件或安装程序
LabVIEW在不同操作系统上使VI、可执行文件或安装程序
313 3
|
7月前
|
Python
在Python中,利用`os模块`的`path.exists()`函数可判断文件是否存
【5月更文挑战第12天】在Python中,利用`os模块`的`path.exists()`函数可判断文件是否存在,该函数对路径进行检查,存在则返回True,不存在则返回False。示例代码展示了如何检查'example.txt'文件是否存在并相应打印消息。此外,`os.path.isfile()`用于确认路径是否为文件,仅当是文件时返回True,否则返回False,同样配以示例说明其用法。
270 2
|
7月前
|
Linux Shell
Linux操作系统下查找大文件或目录的技巧
Linux操作系统下查找大文件或目录的技巧
56 2
|
7月前
|
Python
Python OS 文件/目录方法
Python OS 文件/目录方法
下一篇
DataWorks