美文网首页
Linux学习1(虚拟地址、物理地址、地址映射)

Linux学习1(虚拟地址、物理地址、地址映射)

作者: HardMan | 来源:发表于2021-11-02 22:04 被阅读0次

    虚拟地址

    在虚拟内存出现以前,程序寻址用的都是物理地址,这种方式存在几个问题
    1、程序能寻址的范围是有限的,取决于CPU的地址线条数,比如32位的操作系统可供寻址的范围是2^32次,即4g。因此每个程序都要分配4g的内存,并且这是固定的。因为物流内存是有限的,多个进程执行的时候,内存不够用,于是没有分配到资源的进行就只能等待,很没用效率。
    2、由于内存是随机分配的,因此程序运行时的地址也是不正确。
    3、缺少安全性,通过指针直接访问物理地址,其它进程可能会修改其它进程的数据,甚至内核的数据。
    为了解决上述问题,出现了虚拟内存。
    每个程序运行都会被分配4g虚拟内存(后续都以32位操作系统为例),虚拟内存所对应的地址便是虚拟地址,它是连续的。其实程序以为自己分配到是4g内存,但真正被分配到的物理内存只有一点点,实际正在运行用了多少内存,便会分配多少内存。同样,进程也只是认为内存地址是连续的,实际上,它的数据是存储在多个物理内存碎片上,还有一部分存储在外部存储器上(磁盘),在需要时,将数据交换进内存。
    进程要访问一个地址,必须要将虚拟内存转换成真正的物理地址。每个进程共享一整块物理内存,每个进程只把自己目前需要访问的虚拟地址空间映射到物理内存上。


    页表的具体访问过程
    1.CPU想访问虚拟地址所在的虚拟页,根据页表,找出页表中对应的页表项,判断有效位
    2.若有效位为1,则表示有对应的物理地址,直接返回
    3.若有效位位0,则表示数据在磁盘上,发生缺页异常,中断运行,将磁盘文件内容缓存到该物理地址对应的页上,然后将有效位变成1,第二部分存储物理内存对应地址。
    4.缺页处理完,返回中断前的命令,重新执行。此时缓存命中
    5.将找到的内容映射到高速缓存区,CPU从高速缓存区读取该值,结束。


    参考blog:https://www.jianshu.com/p/26912596e16c

    相关文章

      网友评论

          本文标题:Linux学习1(虚拟地址、物理地址、地址映射)

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