zoukankan      html  css  js  c++  java
  • 操作系统-虚拟内存的一些思考

    为什么 32 位最大寻址内存空间为 4GB 呢

    32 位代表有32最小是32个0,最大是32个1 ,这样可以表示的空间数量,那这个数量有多少呢? 有2的32次方,假如我们以字节(Byte)作为单位,
    也就是说 32位用来寻址到2的32次方个字节 , 也就是 4GB

    已知页的大小为 4KB , 计算一下大概需要多大的页表 ,每一页的页表项为 4Byte

    4GB 的空间,页大小为 4KB , 共分成了2的20次方个页 , 假如用一个页表项来表示一页,那么就会有2的20次方个页表项,一个页表项为 4Byte ,所以所有页表项的
    大小就为 4 乘以 2的20次方 的Byte , 也就是 4MB , 假如我们的页表也是从磁盘中加载的话, 4MB 换算成页,共需要 1024 页 ,

    这样的话 ,我们的页表项数量太多了,放在一张页表中 ,所以一般的操作系统系统都使用“多级页表” , 如下图 :

    1297993-20211103193929504-616088899.png

    于是出现了“根目录”和“分级目录” , 现在我们将 4MB 的大页表继续集成到小一点的页表,这个小一点的页表也是“根目录” ,根目录的大小为 4KB ,刚好是一个页的大小 , 所以当我们在缺页的时候 ,而该进程从来就没加载过 ,那么最多只需要加载两次, 一个根目录,一个分级目录,就可以找到对应的页框号

    这里需要注意 , 我们上面讲到我们已经通过页表,页表项找到对应的页框号, 页表项中有一项是来表示“该页”是否在内存中的, 假如不在那么就需要通知磁盘去加载页到内存中去, 这个过程都是由 MMU 来完成的 。

    过程如下 :

    1297993-20211103221816971-1233187490.png

    1297993-20211103221908532-503426218.png

    页表在哪里

    描述来自[知乎](https://www.zhihu.com/question/63375062),非原创
    

    页表在哪里?一般来说,任何进程切换都会暗示着更换活动页表集。Linux内核为每一个进程维护一个task_struct结构体(即进程描述符PCB),task_struct->mm_struct结构体成员用来保存该进程的页表。在进程切换的过程中,内核把新的页表的地址写入CR3控制寄存器。CR3中含有页目录表的物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR(Page-Directory Base address Register)。

    虚拟地址怎么转化为物理地址?

    描述来自[知乎](https://www.zhihu.com/question/63375062),非原创
    

    对于每次转换,MMU首先在TLB中检查现有的缓存。如果没有命中,根据CR3寄存器,Table Walk Unit将从内存中的页表查询。

    1297993-20211103225712627-1920617830.jpg

    MMU 相关

    MMU 的工作如下 :

    1297993-20211103224659437-1669130.png

    MMU 是一个硬件来的,那么为什么不能用软件来实现 MMU 呢? 可以参考这个问题

    主要的原因在于防止程序的跨域访问不该访问的内存空间这一点。

    MMU 的作用

    下面引用自 : https://whatis.techtarget.com/definition/memory-management-unit-MMU
    讲述 MMU 的三个作用
    The work of the MMU can be divided into three major categories:

    - Hardware memory management, which oversees and regulates the processor's use of RAM (random access memory) and cache memory.
    - OS (operating system) memory management, which ensures the availability of adequate memory resources for the objects and data structures of each running program at all times.
    - Application memory management, which allocates each individual program's required memory, and then recycles freed-up memory space when the operation concludes.
    

    参考资料

  • 相关阅读:
    微服务架构技术栈选型手册(万字长文)
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    Visual Studio 2013 always switches source control plugin to Git and disconnect TFS
    MFC对话框中使用CHtmlEditCtrl
    ATL开发 ActiveX控件的 inf文件模板
    ActiveX: 如何用.inf和.ocx文件生成cab文件
    Xslt 1.0中使用Array
    如何分隔两个base64字符串?
    An attempt was made to load a program with an incorrect format
    JQuery 公网 CDN
  • 原文地址:https://www.cnblogs.com/Benjious/p/15506177.html
Copyright © 2011-2022 走看看