Chap-6 6.1~6.3 程序装载

6.1 进程的虚拟地址空间
程序和进程的区别:
程序(或者狭义上讲可执行文件)是一个静态的概念,它就是一些预先编译好的指令和数据
集合的一个文件;进程则是一个动态的概念,它是程序运行时的一个过程,很多时候把
动态库叫做运行时(Runtime)也有一定的含义。
程序运行起来以后,将拥有自己独立的虚拟地址空间,这个虚拟地址空间的大小由计算机
的硬件平台决定,具体的说是由CPU的位数决定。硬件决定了地址空间的最大理论上限,即
硬件的寻址空间大小,比如32位的硬件平台决定了虚拟地址空间的地址为0到2^32 - 1,即
0x00000000 ~ 0xFFFFFFFF,就是4GB的虚拟空间大小。
在32位平台下的4GB虚拟空间,用户的程序使用的大小有所限制,进程的虚拟地址空间都是
在操作系统的掌握之中,进程只能使用那些操作系统分配给进程的地址。如果访问未经允许
的空间,那么操作系统会捕获这些非法访问,强制进程结束。
整个4GB的虚拟地址空间被划分为了两部分,其中操作系统用去了一部分:从地址0xC0000000
到0xFFFFFFFF,共1GB,剩下的从0x00000000到0xBFFFFFFF共3GB的虚拟空间是留给用户进程使用
的。

6.2 装载的方式
6.3 从操作系统看可执行文件的装载
6.3.1 进程的建立
从操作系统的角度来看,一个进程最关键的特征是它拥有独立的虚拟地址空间,这使得它有别于
其他进程。很多时候一个程序被执行同时都伴随着一个新的进程被创建,然后装载相应的可执行
文件并且执行。这个过程最开始只需要做三件事情:
1.创建一个独立的虚拟地址空间
2.读取可执行文件头,并且建立虚拟空间和可执行文件的映射关系
3.将CPU的指令寄存器设置成可执行文件的入口地址,启动执行。

创建一个独立的虚拟地址空间:一个虚拟空间由一组页映射函数将虚拟空间的各个页映射至相应
的物理空间,创建一个虚拟空间实际上并不是创建空间而是创建映射函数所需要的数据结构。在
i386的Linux下,创建虚拟空间实际上仅仅是分配一个页目录项(Page Directory)。

读取可执行文件头,建立虚拟空间与可执行文件的映射关系:上面一步的页映射关系函数是虚拟
空间到物理内存的映射关系,而这一步所做的是虚拟空间与可执行文件的映射关系。当程序执行
中,发生缺页错误时,操作系统将从物理内存中分配一个物理页,然后将该“缺页”从磁盘读到物理
内存中,再设置缺页的虚拟页和物理页的映射关系,这样程序才能继续执行。当操作系统捕获到
缺页错误时,它应知道程序当前所需要的页在可执行文件中的哪一个位置。这就是虚拟空间与可
执行文件之间的映射关系。

由于可执行文件在装载时实际上是被映射的虚拟空间,所以可执行文件又被叫做映像文件(Image)。

自我理解:当程序被编译后生成可执行文件,此时我们可以用objdump -h execu_file来查看,可以
看到可执行文件中的各个段都对应有VMA、LMA,因此我认为该步实际上仅仅是将可执行文件中,VMA
对应的虚拟地址拷贝到进程相应的数据结构中。

原文地址:https://www.cnblogs.com/miaoyong/p/3514592.html