程序装载是指 将程序从外部存储器(如硬盘)读取到内存中的某个位置,并进行一系列准备工作,以便CPU能够执行该程序。这个过程涉及以下几个关键步骤:
创建虚拟地址空间
程序装载首先需要为进程创建一个独立的虚拟地址空间。这个虚拟地址空间由一组页映射函数将虚拟空间的各个页映射到物理空间。在i386架构的Linux系统中,这通常通过分配一个页目录来实现,映射关系在发生页错误时再设置。
加载程序到内存
程序只有装载到内存后才可以被CPU执行。装载过程包括将程序从外部存储器中读取到内存中的某个位置。例如,在Linux系统中,可执行文件(ELF格式)的装载过程包括解析ELF文件结构,获取程序的入口地址,并将程序头表中的各段加载到内存中的相应位置。
地址映射
在程序装载时,将程序使用的虚拟内存地址和计算机实际分配的物理内存地址进行映射。这样,CPU在执行程序时能够通过虚拟地址访问到正确的物理内存位置。
满足内存要求
装载器在加载程序时需要满足两个要求:一是程序加载后占用的内存空间应该是连续的;二是执行指令时,程序计数器需要顺序地一条一条指令执行,这意味着这些指令需要连续地存储在一起。
动态装入
由于程序运行时所需的内存数量可能大于物理内存数量,因此通常会采用动态装入的方式。动态装入的原理是程序运行时有局部性,将程序最常用的部分驻留在内存中,而将不太常用的数据存放在磁盘上。常见的动态装入方法包括覆盖装入(Overlay)和页映射(Paging)。
总结来说,程序装载是将程序从外部存储器加载到内存中,并进行地址映射和内存分配等一系列准备工作,以便CPU能够顺利执行程序。这个过程在操作系统中由装载器负责,涉及到虚拟地址空间的管理、内存的分配和地址映射等关键步骤。