宋宝华: CPU是如何访问到内存的?--MMU最基本原理
原帖地址:
假设页表只有一级
对于一个有MMU的CPU而言,MMU开启后,CPU是这样寻址的:CPU任何时候,一切时候,发出的地址都是虚拟地址,这个虚拟地址发给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,他们的页表分别如下:
当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这个物理地址。
据以上分析,1级页表占据的内存是2的10次方,再乘以4,即4KB。而每个二级页表,也是2的10次方,再乘以4,即4KB。分级机制的主要好处是,二级页表不是一定存在了,比如一级页表的第2行不命中,也即如下地址都无效的话:
那么这一行对应的二级页表,就整个都不需要了,于是就省掉了这段区间4KB二级页表的内存占用。页表当然还有是三级甚至更多。
至于有多级页表的时候,其实MMU也只需要知道一级页表的基地址即可。每次切换进程的时候,把一级页表的地址重新填入MMU,把新的进程的页表激活即可。
宋宝华: CPU是如何访问到内存的?--MMU最基本原理相关推荐
- 宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)上集
共享单车.共享充电宝.共享雨伞,世间的共享有千万种,而我独爱共享内存. 早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进 ...
- 宋宝华:论一切都是文件之匿名inode
01 唯有文件得人心 当一个女生让你替她抓100只萤火虫,她一定不是为了折磨你,而是因为她爱上了你.当你们之间经历了无数的恩恩怨怨和彼此伤害,她再次让你替她抓100只萤火虫,那一定是因为她还爱着你. ...
- 宋宝华:评Linux 5.13内核
目录 Misc cgroup Landlock安全模块 系统调用的堆栈随机化 printk无锁ringbuffer的进一步优化 BPF可调用内核函数 公共的IO PAGE Fault支持 Linux ...
- 宋宝华:LEP(Linux易用剖析器) 是什么,为什么以及怎么办(2)
LEP(LINUX EASY PROFILING) 是Linuxer之LEP项目组(Barry Song,Mac Xu,陈松等以及陈莉君教授/西邮Linux 3+1实验室)正在致力于打造的一个开源项目 ...
- linux pdf 宋宝华,51CTO博客-专业IT技术博客创作平台-技术成就梦想
原创 宋宝华 Linux阅码场 2018-04-10 前言 网上关于BIO和块设备读写流程的文章何止千万,但是能够让你彻底读懂读明白的文章实在难找,可以说是越读越糊涂! 我曾经跨过山和大海 也穿过人山 ...
- 宋宝华: 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清
原创 宋宝华 Linux阅码场 2018-01-22 作者简介 宋宝华,他有10几年的Linux开发经验.他长期在大型企业担任一线工程师和系统架构师,编写大量的Linux代码,并负责在gerrit上r ...
- linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...
本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...
- 宋宝华: 用off-cpu火焰图进行Linux性能分析
在<宋宝华:火焰图:全局视野的Linux性能剖析>一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析.但是,很多时候,单纯地看on-cpu的情况(什么代码在耗费CPU) ...
- 宋宝华_2010年11-12月Linux驱动和内核讲座PPT下载
12月29日,宋宝华老师在线讲座(按键和LCD驱动) cloudquan 2010-12-20 2/146 heyan0208 3 天前 00:37 宋宝华_2010年12月11日_& ...
- platform设备驱动全透析(转自宋宝华老师)
platform设备驱动全透析(转自宋宝华老师) 2013-04-12 09:58 384人阅读 评论(0) 收藏 举报 分类: linux kernel(22) 1.1 platform总线.设备与 ...
最新文章
- 跨越原理优缺点_请教:单管跨越式和双管式的优缺点
- 性能测试系列:Jmeter使用记录
- 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述
- MATLAB制图代码
- wincc安装信息服务器,wincc客户端与服务器配置
- linux运维系统故障排查思路及常见故障处理
- 批量ping检测主机状态
- 资深程序员教你,用python入门的知识抓取抖音短视频,太厉害了
- php如何做直播api,网易云视频直播php版api
- 流利说被强制退市:因市值过低 不符合上市要求
- 如何下载网页上的音乐?不用注册!不用会员!不用播放器!
- 汽车零部件企业数字工厂管理系统建设方案
- 获得打气筒的三种方式
- Mapbox网络GIS开发第一步——Mapbox本地化
- VASP计算笔记_声子谱计算
- 数字电路基础与Quartus-II入门
- 格式工厂将视频导出Maya需要的图像序列帧
- 战争迷雾sharder
- matlab cdfx,matlab自带工具箱svmtrain函数参数的选择
- 华展云-让展览更高效 2017年第35届中国国际体育用品博览会会刊(参展商名录)
热门文章
- 【JAVA错误笔记】 - Unable add facets project AnnotationWebService CXF 2-x Web Services
- php 查询出来的字段名全是小写或者大写
- Mobicents记录1:如何搭建和运行mobicents3.0环境(基于jboss7.2)
- 文件读入简单操作(C#)
- defaultView与currentStyle的区别_获取CSS样式值
- 263. Ugly Number
- 用Markdown格式写一份前端简历
- Windows Server 2012 R2 WSUS-7:查看状态报告
- 大数据实验数据集何处来?
- Oracle数据库编程:PL/SQL编程基础