0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

对MMU和页表工作机制的简单评析

Linux阅码场 2018-02-02 14:08 次阅读

由于很多童鞋大学的时候学《微机原理》都是打酱油,当老师是苍蝇在讲台上发噪音,导致MMU这些基本知识都没有搞清楚,所以对计算机的认识一塌糊涂,Linux也无法学通。然后我经常被问到各种奇葩到让人吐血的内存管理问题,这些问题显示出这些童鞋对最基本的MMU和页表工作机制不清楚。我觉得我不得不写点什么东西,让这些打酱油的童鞋,把基本的马步扎稳,当然这不是为了别人,也不是为了无私奉献,纯粹是为了避免无数次被问到吐血,迟早有一天吐血而亡。为了能够活地久一点,特作此文。

假设页表只有一级

对于一个有MMU的CPU而言,MMU开启后,CPU是这样寻址的:CPU任何时候,一切时候,发出的地址都是虚拟地址,这个虚拟地址发给MMU后,MMU通过页表来在页表里面查出来这个虚拟地址对应的物理地址是什么,从而去访问外面的内存条。MMU里面的页表地址寄存器,记录了页表本身的存放位置。

对MMU和页表工作机制的简单评析

现在我们假设每一页的大小是4KB,而且假设页表只有一级,这个页表长成下面这个样子,页表的每一行是32个bit。

当CPU访问虚拟地址0的时候,MMU会去查上面页表的第0行,发现第0行没有命中,于是无论以何种形式(R读,W写,X执行)访问,MMU都会给CPU发出page fault,CPU自动跳到fault的代码去处理fault。

当CPU访问虚拟地址4KB的时候,MMU会去查上面页表的第1行(4KB/4KB=1),发现第1行命中,如果这个时候

用户是执行读或者执行,则MMU去访问内存条的6MB这个地址,因为页表里面记录该页的权限是RX;

用户是去写4KB,由于页表里面第1行记录的权限是RX,没有记录你有写的权限,MMU会给CPU发出page fault,CPU自动跳到fault的代码去处理fault。

当CPU访问虚拟地址8KB+16的时候,MMU会去查上面页表的第2行(8KB/4KB=2),发现第2行命中了物理地址8M,这个时候,MMU会访问内存条的8MB+16这个物理地址。当然,权限检查也是需要的。

当CPU访问虚拟地址3GB的时候,MMU会去查上面页表的第3GB/4KB行,表中记录命中了,查到虚拟地址3GB对应的物理地址是0,于是MMU去访问内存条上的地址0。但是,这个访问分成2种情况:

CPU在执行用户态程序的时候,去访问3GB,由于页表里面记录的U+K权限只有K,所以U是没权限的,MMU会给CPU发出page fault,CPU自动跳到fault的代码去处理fault;

CPU在执行内核态程序的时候,去访问3GB,由于页表里面记录的U+K权限只有K,所以K是有权限的,MMU不会给CPU发出page fault,程序正常执行。

由此可以得知,如果页表只有1级,每4KB的虚拟地址空间就需要页表里面的一行(32bit),那么CPU要覆盖到整个4GB的内存,就需要这个页表的大小是:

4GB/4KB *4 = 4MB。

注意页表是无缝全覆盖!!!你页表不覆盖全,CPU访问虚拟地址的时候,MMU都不知道查哪里了....

所以,这个页表的大小是4MB,覆盖了整个0-4GB的虚拟地址空间,任何一个虚拟地址,都可以用地址的高20位(由于一页是4KB,低12位就是叶内偏移了),作为页表这个表的行号去读对应的页表项。

这个查水表的过程,由MMU硬件自动完成。

现在我们假设在Linux里面有2个进程,一个是QQ,一个是Firefox,他们的页表分别如下:

对MMU和页表工作机制的简单评析

当CPU在执行QQ的时候,Linux会把QQ的页表的物理地址255MB,填入MMU的页表地址寄存器,于是这个时候,QQ的页表生效。根据页表内容,CPU如果访问4KB这个虚拟地址的话,MMU访问内存条的6MB物理地址;CPU如果访问8KB这个虚拟地址的话,MMU访问内存条的8MB物理地址;CPU如果访问3GB这个虚拟地址的话,MMU访问内存条的0MB物理地址;

当CPU在执行Firefox的时候,Linux会把Firefox的页表的物理地址280MB,填入MMU的页表地址寄存器,于是这个时候,Firefox的页表生效,QQ的页表淡出江湖。根据页表内容,CPU如果访问4KB这个虚拟地址的话,MMU访问内存条的100MB物理地址;CPU如果访问8KB这个虚拟地址的话,MMU访问内存条的200MB物理地址;CPU如果访问3GB这个虚拟地址的话,MMU访问内存条的0MB物理地址。

上面我们发现一个共同点,QQ和Firefox去访问3GB虚拟地址的时候,最终MMU访问的都是0MB这个物理地址,具体原因非常简单,QQ和Firefox,这2张页表里面,3GB/4KB这一行,里面填的是完全一样的东东。

多级页表:真实的存在在

上面我们发现,如果采用一级页表的话,每个进程都需要1个4MB的页表,这个空间浪费还是很大,于是我们可以采用二级或者三级页表。举例如下,假设我们用地址的高10位作为一级页表的索引,中间10位作为2级页表的索引。CPU访问虚拟地址16,这个地址如果分解为10/10/12位的话,就是这个样子:

那么MMU会用0这个下标去访问一级页表(一级页表的地址填入MMU的页表地址寄存器)的第0行,第0行的内容写的是2MB(此处不再是最终的物理地址,而是二级页表的物理地址),证明二级页表的地址在2MB,于是MMU自动去以中间的10位作为下标,去查询位置在2MB的二级页表,在2级页表里面,最终查到第0页(地址范围0x00000000~0x00000FFF)这个虚拟地址的物理地址是1GB,于是MMU去访问内存条的1GB+16这个物理地址。

对MMU和页表工作机制的简单评析

据以上分析,1级页表占据的内存是2的10次方,再乘以4,即4KB。而每个二级页表,也是2的10次方,再乘以4,即4KB。分级机制的主要好处是,二级页表不是一定存在了,比如一级页表的第2行不命中,也即如下地址都无效的话:

那么这一行对应的二级页表,就整个都不需要了,于是就省掉了这段区间4KB二级页表的内存占用。页表当然还有是三级甚至更多。

至于有多级页表的时候,其实MMU也只需要知道一级页表的基地址即可。每次切换进程的时候,把一级页表的地址重新填入MMU,把新的进程的页表激活即可。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10434

    浏览量

    206520
  • Linux
    +关注

    关注

    87

    文章

    10986

    浏览量

    206718
  • MMU
    MMU
    +关注

    关注

    0

    文章

    91

    浏览量

    17936

原文标题:宋宝华: CPU是如何访问到内存的?--MMU最基本原理

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于MMU的一级表为什么必须是16K对齐

    哪位仁兄知道:MMU的一级表为什么必须是16K对齐,最好有计算公式~~~谢谢!!!
    发表于 02-14 23:46

    关于表和MMU的问题

    刚开始学,好多东西都云里雾里的TT为什么在bootloader里要进行表初始化然后开启MMU,然后在进入内核后还要创建表开启MMU?这两个有什么不一样么?s3c2410,bootl
    发表于 05-06 17:25

    ARM MMU 理解(基于ARM 920T)

    被用户应用程序所访问的。通过MMU可以控制地址空间的访问权限,从而保护这些代码不被破坏。MMU的实现过程,实际上就是一个查表映射的过程。建立表(translate table)是实现MMU
    发表于 08-29 11:10

    控制器中如何设计MMU--虚拟内存管理机制

    控制器中如何设计MMU--虚拟内存管理机制
    发表于 12-15 09:53

    MMU的产生及MMU工作过程详解

    号为2,框2的物理地址范围是8192~12287,故MMU将虚拟地址1026映射为物理地址9218(框首地址+偏移量=8192+1026=9218)。以上就是MMU
    发表于 07-03 08:19

    裸机加强版MMU章节表创建,地址映射相同

    ARM裸机1期加强版 024_mmu_cache_021\002_mmu_021_004\mmu.c 文件/* 2.3 for 64M sdram */创建表 SDRAM 64M 虚
    发表于 04-18 07:45

    ARM的内存管理(MMU)是如何实现的?

    是不希望被用户应用程序所访问的。通过 MMU 可以控制地址空间的访问权限,从而保护这些代码不被破坏。二 MMU 地址映射的实现MMU 的实现过程,实际上就是一个查表映射的过程。建立
    发表于 10-23 15:29

    MMU存储管理单元的工作原理是什么?如何实现其流程呢

    MMU,Memory Management Unit,存储管理单元。MMU工作流程为:首先,配置一个地址映射表的基地址。然后,每输入一个虚拟地址则输出一个物理地址。地址映射表可以简单
    发表于 05-13 09:56

    如何配置MMU page table walk的访问属性

    众所周知,MMU表是由软件建立在外部内存中的。实际上有两条硬件路径需要访问这个表:1 MMU硬件进行page table walk时,它会读取查找这个
    发表于 10-24 15:45

    三相电度表工作原理

    三相电度表工作原理   三相电度表用于测量三相交流电路中电源输出(或负载消耗
    发表于 06-17 01:38 2.5w次阅读
    三相电度<b class='flag-5'>表工作</b>原理

    单相电度表工作原理

    单相电度表工作原理 当电度表接入被测电路后,被测电路电压U加在电压线圈上,在其铁芯中形成一个交变的磁通,这个磁通的一部分ΦU
    发表于 06-17 01:43 3.1w次阅读
    单相电度<b class='flag-5'>表工作</b>原理

    各工控仪表工作原理动态图汇总

    温度仪表工作原理图、压力仪表工作原理图、流量仪表工作原理图、液位仪表工作原理图、控制阀门工作原理图、控制
    的头像 发表于 02-05 10:37 1w次阅读
    各工控仪<b class='flag-5'>表工作</b>原理动态图汇总

    MMU工作原理梳理

    本文从内存管理的发展历程角度层层递进,介绍 MMU 的诞生背景,工作机制。而忽略了具体处理器的具体实现细节,将 MMU工作原理从概念上比
    的头像 发表于 12-17 16:13 1.3w次阅读
    <b class='flag-5'>MMU</b>的<b class='flag-5'>工作</b>原理梳理

    ADM1278设计工作表工

    ADM1278设计工作表工
    发表于 03-23 10:49 9次下载
    ADM1278设计<b class='flag-5'>工作</b><b class='flag-5'>表工</b>具

    嵌入式Linux运行一定需要MMU吗?为什么需要MMU

    虚拟内存功能和保护机制的重要角色。 MMU(Memory Management Unit)是一种硬件机制,它为CPU提供了一种虚拟内存映射的功能,可以将物理地址映射到虚拟地址上。在实际应用中,使用
    的头像 发表于 10-29 16:28 473次阅读