程序的装载

作者: SnC_ | 来源:发表于2021-07-16 19:06 被阅读0次

    程序被装载的过程:

    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,计算相应页面在可执行文件中的偏移),将其从磁盘读取到内存中,然后在物理内存中分配一个物理页面,将虚拟页与物理页之间建立映射关系。然后控制权返回给进程,继续执行。

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

    相关文章

      网友评论

        本文标题:程序的装载

        本文链接:https://www.haomeiwen.com/subject/ztiqultx.html