CPU与内存

程序的装载

2021-07-16  本文已影响0人  SnC_

程序被装载的过程:

  1. 创建独立的虚拟内存空间,建立虚拟空间与物理内存的映射关系。

    • 在Linux中,程序被运行起来后,将拥有自己独立的虚拟地址空间。
      虚拟地址空间的大小由CPU的位数决定,32位下虚拟地址空间的地址为02^{32}-1,64位下为02^{64}-1。 此外,C语言中指针的位数也等于虚拟空间的位数。
    • 虚拟内存空间并不是都给进程用的。以32位的Linux系统为例子,虚拟内存共有4GB,其中 0xC000 0000 到 0xFFFF FFFF 的1GB是留给操作系统的,进程执行时能使用的内存上限为3GB(其实还要更少,不过也有扩展内存的技术)。
    • 创建虚拟空间,其实并没有创建空间,而是创建页映射函数,将虚拟空间的各个页映射至相应的物理空间。 有时只是创建一个页目录,并没有映射关系,这些关系等到之后发生页错误时再设置。
  2. 读取可执行文件头,建立可执行文件与虚拟空间的映射关系。

    • 将程序的.text,.data等段映射到虚拟内存中。 这种映射关系是保存在操作系统中的一个数据结构。
    • 虚拟内存中的一个段称为“虚拟内存区域(VMA, Virtual Memory Area)”。 Heap和Stack也是VMA,它们与程序不存在映射关系,它们几乎在每个进程中都存在。
    • 这个映射关系是需要在运行之间建立好的,不像虚拟内存与物理内存之间的映射关系,可以在运行时逐渐建立。
  3. 将CPU的指令寄存器指向可执行文件的入口地址,启动运行。

上面的步骤执行完以后,程序的指令和数据其实并没有被放到内存。
程序开始执行的时候,CPU发现入口地址指向的内存页面是个空页面,于是产生页错误,CPU将控制权交给操作系统的页错误处理机制。 该机制通过上面第2步建立的可执行文件与虚拟空间的映射关系,定位缺页在程序中的位置(找到对应VMA,计算相应页面在可执行文件中的偏移),将其从磁盘读取到内存中,然后在物理内存中分配一个物理页面,将虚拟页与物理页之间建立映射关系。然后控制权返回给进程,继续执行。

随着进程的执行,页错误会不断产生,操作系统也会不断为进程分配物理页面来满足它运行的要求。 有时需要的内存过多,这就涉及到了虚拟存储管理方面的知识。

上一篇下一篇

猜你喜欢

热点阅读