程序装载即程序在运行前做的准备,总共分3步。
1、创建一个独立的虚拟地址空间
虚拟空间是由一组页映射函数将虚拟空间各个页映射到物理空间,实际上就是创建映射函数所需要的相应的数据结构(在i386的Linux下只需要分配一个页目录就好了,映射关系在发生页错误时再设置)
虚拟地址空间大小由硬件平台指定,具体是由CPU位数决定,比如32位的硬件平台虚拟地址空间范围为0~2^32-1,即4GB虚拟内存空间大小。
2、读取可执行文件头,建立虚拟空间与可执行文件的映射关系即创建虚拟空间与可执行文件的映射关系。
由于可执行文件中有多个段,可执行文件装载时是以页为单位的,势必会产生空间浪费,怎么办?
实际上在装载过程中,操作系统并不关心段,而是关心权限,同一权限的段可以当做一个段进行映射
在链接为可执行文件时,链接器会尽量把同一权限的Segment放在一起
段的权限基本有3种组合:
①以代码段为代表的权限为只读
②以数据段和BSS段为代表的权限为可读可写的权限
③以只读数据段为代表的权限为只读的段
3、将CPU指令寄存器设置成可执行文件入口,启动运行
操作系统通过设置CPU指令寄存器将控制权转交给进程,由此进程开始执行