假设我们是操作系统,在有虚拟存储的情况下:
- 创建一个独立的虚拟地址空间
- 读取可执行文件头,并且建立虚拟空间和可执行文件之间的映射关系
- 将 CPU 指令寄存器设置成可执行文件的入口地址,启动运行
创建一个虚拟地址空间是指创建映射函数所需要的相应的数据结构,在 linux 上只需要分配一个页目录就可以了,映射关系等到后面程序发生页错误的时候再设置。这个映射关系是虚拟空间到物理内存之间的映射关系
读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系。我们知道,当程序发生页错误的时候,操作系统会从物理内存中分配一个物理页,然后将“缺页”从磁盘读取到内存中。所以这个过程操作系统应该要知道当前所需要的页在可执行文件中的哪一个位置。从某种角度来看,这个步骤是整个装载过程中最重要的一步,也就是传统意义上的“装载”过程
由于可执行文件在装载时实际上是被映射的虚拟空间,所以可执行文件很多时候又被叫做映像文件
将 CPU 指令寄存器设置为可执行文件入口,即 ELF 文件头中保存的入口地址