第6章 可执行文件的装载与施行
可执行文件的装载与执行
一、进程虚拟地址空间
区分“程序虚拟地址空间的寻址范围”、“程序可以使用的虚拟地址空间”和“程序可以使用的内存空间”:
1. “程序虚拟地址空间的寻址范围”、“程序可以使用的虚拟地址空间”:
32位CPU只能使用32位指针。最大寻址范围是0~4GB;在Linux下最多可以使用3GB空间(1GB留给OS),在Windows下最多可以使用2GB(2GB留给OS)或3GB(1GB留给OS)
2. “程序可以使用的内存空间”:
Intel从1995年的Pentium Pro CPU开始使用36位地址线(可访问高到64GB物理内存),程序虽然还是只有32位的地址空间,但是可以从高于4GB的物理空间中申请多个大小为256MB的物理空间块。这种地址扩展称“PAE (Physical Address Extension)”.
二、装载的方式
1. 覆盖装入(已淘汰):需要程序员手工将模块按照它们之间的调用依赖关系组织成树状结构。
2. 页映射:
下图中P0~P7是“进程虚拟地址空间”中的“虚拟页”(VP, Virtual Page),右边F0~F3是“内存”中的“物理页”(PP, Physical Page)。“OS”中的“存储管理器”需要管理调入缺少虚拟页到物理页等。
查看“页的大小”: $getconf PAGE_SIZE
查看“OS位数”:$getconf LONG_BIT
查看“CPU位数”: $arch ==> i686或x86_64则表明机器是64位的
三、从操作系统的角度看可执行文件
由于使用了“分页机制” ,所以提到“可执行文件的装载”并不是一次性完成的,而是分了两步:
1. 进程建立时,为“分页装载”做了一些准备,还未真正装载; (1)(2)(3)
(1)分配一个页目录Page Directory,用来记录Virtual Page(进程虚拟地址空间中)到Physical Page(内存中)的映射关系。等执行时发生缺页(Page Fault)时,由OS安排处理调用、填充页目录等。
(2)在进程数据结构中构造一些VMA(Virtual Memory Area),VMAs保存了Disk Page(磁盘上的可执行文件中)到Virtual Page(进程虚拟地址空间中)的映射关系。注:VMA是OS内部的一个数据结构。
(3)将CPU指令寄存器设置为可执行文件入口,启动运行
2. 缺页(产生页错误)时,才真正地去装载。(4)
(4)缺少进程虚拟空间的某个VP时,
分配一个物理页PP;
查询VMA,将该VP对应的DP装入PP;
在目录表Page Dir中添加一个“VP->PP”的对应关系。
四、进程虚存空间分布
五、Linux内核装载ELF过程
六、Windows PE的装载