CPU是如何访问到内存的?

讨论的重点

我们知道CPU有地址总线,数据总线和控制总线

数据总线(Data Bus):在CPU与RAM之间来回传送需要处理或是需要储存的数据。

地址总线(Address Bus):用来指定在RAM(Random Access Memory)之中储存的数据的地址。

数据总线是用来传输数据的,假设内存上有一个篮球,这个篮球存放的地址是0x2345,CPU想拿到这个篮球的方法就是通过地址总线发送0x2345告诉内存,内存再通过数据总线把篮球运到CPU里面。

我们这篇文章只讨论ARM架构 Linux下的MMU,不讨论段式寻址,也不讨论有些特殊的芯片直接寻址,技术高明的同学不要抬杠哈。

假设页表只有一级

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

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

640?wx_fmt=png

当CPU访问虚拟地址0的时候,MMU会去查上面页表的第0行,发现第0行没有命中「第0行没有映射物理内存」,于是无论以何种形式(R读,W写,X执行)访问,MMU都会给CPU发出page fault,CPU自动跳到fault的代码去处理fault「这就是我们很多书里面提到的缺页异常处理」。

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

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

2、用户是去写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种情况「用户空间和内核空间访问内核地址」:

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

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

640?wx_fmt=jpeg

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

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

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

这个查水表的过程,由MMU硬件自动完成。现在我们假设在Linux里面有2个进程,一个是QQ,一个是Firefox,他们的页表分别如下:640?wx_fmt=png640?wx_fmt=png当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位的话,就是这个样子:

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

那么这一行对应的二级页表,就整个都不需要了,于是就省掉了这段区间4KB二级页表的内存占用。页表有一级页表,二级页表甚至三级页表或者更多。至于有多级页表的时候,其实MMU也只需要知道一级页表的基地址即可。每次切换进程的时候,把一级页表的地址重新填入MMU,把新的进程的页表激活即可。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

扫码或长按关注

回复「 加群 」进入技术群聊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468416.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

macos支持exfat吗_打造便捷、人性化的macOS桌面使用环境

原标题:打造便捷、人性化的macOS桌面使用环境打造便捷、人性化的macOS桌面使用环境 2020-10-23 17:25:410点赞4收藏0评论欢迎参加#果粉是怎样炼成的#征稿,围观秋季发布会新品!是什么让苹果生态无法割舍?快来讲讲你的果粉炼成记&am…

滴滴是如何搭建起PB级数据中台的?

滴滴公司自12年底上线至今,俨然成功跻身互联网大咖行列,在以流量活命的互联网世界里,如果没有一定的硬核技术为业务做支撑,单靠营销与宣传,是没有办法留住日益挑剔的用户的。我们今天就谈一谈滴滴打车背后所用到的大数…

java技术_2020年最流行的Java开发技术

点击上方“千锋教育”后台回复「 Java 」,领取视频学习教程在本文中,我们将以编程界最常用的编程语言Java为例,分享最为主流的技术与工具。Java几乎无处不在,无论在智能手机、台式机、游戏设备还是科学超级计算机上,处…

gx works2 存储器空间或桌面堆栈不足_静态体验奇瑞艾瑞泽GX冠军版,细节做工很精湛...

奇瑞艾瑞泽GX冠军版车型正式上市。编辑近日趁着区域上市的机会,对其进行了静态体验。这车怎么样?分几个方面来看看外观方面,运动范儿十足,看着就年轻,一副活力四射的样子。得益于fastback极速凌动的设计元素&#xff0…

我这几年呆的这几个公司

之前发的丰富的经历我12年硕士毕业,历经华为,某芯片原厂外企,某芯片原厂国企,某手机公司,最后来到大疆,可以说是一个跳槽小能手,因为具有多家大企业的工作经历,我觉得谈下自己在各个…

nsoutlineview 搜索_阿里巴巴搜索推荐广告三位一体的在线服务体系

最近在工作中大量使用到了淘系的在线分发服务体系,可以快速高效的实现个性化内容分发,其技术架构的概览在这里分享给大家。AIOS(Artificial Intelligence Online Serving)是阿里巴巴集个性化搜索、推荐、广告三位一体的在线服务平台。在大型互联网公司里…

为了生活

前几天,我刚刚满30岁,30岁的那天,过得很深刻,高烧了40度,每次发烧我都没有去医院,这次也一样,潜意识里面觉得它一定会来,潜意识里面也知道它一定会走,不管是40度还是45度…

深度ip转换器手机版app_手机大师智能管家app下载-手机大师智能管家app官网版 v1.0.0...

手机大师智能管家app:针对各种手机垃圾快速在线清除的软件,利用这款软件可以快速的清除各种不同的手机垃圾,而且还可以一键在线加速,更好的享受手机加速带来的便捷,同时针对各种文件清理也更加的简单,让你更…

小米19999

以前没有钱买小米现在也是,没有钱买小米19999的小米可能会比较贵但是看完这几个动图再决定要不要切肾毕竟肾只有一个消息提示调节音量播放音乐玩游戏CS通知栏充电好像有几次文章都说明了我有好多好多朋友在做手机所以我对手机其实没有多大新鲜感不是因为贵了就买而是…

html5+css3第一次作业_“台风爷爷,让我作业飞走!”南京小学生写的诗都这么逆天了?...

小学生的脑洞能有多大?看看他们写的诗就知道了!最近,南京游府西街小学四年(6)班孩子们的语文作业火了,一个个神句让老师都不得不服气。赶紧戳图来看↓↓↓语文老师严杏村介绍,原本的作业是抄写儿童现代诗,但…

小心内存对齐

什么是内存对齐?CPU在读取内存地址的时候,一定按照一定的偏移量去读取,不知道你发现了没有,我们没有看到一个变量的大小是 3 个字节的,都是 1 个字节,2个字节,4个字节,8个字节&#…

JavaScript获取select下拉框中的第一个值

JavaScript获取select下拉框中的第一个值 1、说明 获取select下拉框中的第一个值 2、实现源代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns&quo…

好用的平板电脑_支架里的变形金刚让手机、电脑、平板更好用!6种角度,1秒切换...

六 月 惊 喜戳 这 里嗨&#xff0c;我是专注研究数码3C产品的小嘻~对于当代人来说&#xff0c;办公、学习、娱乐离不开三件宝&#xff1a;手机、平板、电脑。手机不离手&#xff0c;沟通工作、看剧、刷抖音&#xff0c;没留神几个小时就过去了&#xff0c;放下手机的时候就觉得…

推荐一位AI技术人

今天推荐认识的一个朋友&#xff0c;推荐的原因很简单&#xff0c;因为他非常喜欢篮球&#xff0c;正统校队篮球队员&#xff0c;这个AI相关的公众号一直是他个人运营&#xff0c;写了非常多的文章&#xff0c;如果大家有在学习AI相关的知识&#xff0c;强烈推荐关注。AI蜗牛车…

如何 给给软件开发 添加 代理_敏捷开发是如何被跑偏的

今天聊聊敏捷软件过程。先说结论&#xff1a;据我观察&#xff0c;至少有60%的团队误用了敏捷软件过程&#xff0c;或者说至少60%的团队在进行伪敏捷开发。与大家通常的认知是相反的&#xff0c;敏捷过程并不是一个非常容易实践或者实施的过程规范。通常来讲&#xff0c;没有天…

在实时操作系统里随便写代码都能硬实时吗?

这是转发宋老师写的文章&#xff0c;我也是刚知道&#xff0c;宋老师跟我一样也是养娃的人了&#xff0c;国庆期间&#xff0c;看看文章&#xff0c;看看升升国旗。很久没有写技术文章了&#xff0c;做码农难&#xff0c;做养娃的码农更难&#xff0c;趁着娃看动画片的机会&…

python 数据分析 实际案例_python实战案例:超市营业额数据分析

实战是学习的最好途径&#xff0c;效率最高&#xff0c;本文不是很长&#xff0c;通过小小的练习&#xff0c;让大家综合运用基础知识&#xff0c;加深印象巩固记忆。一、读入数据&#xff0c;了解数据本数据随机生成的假数据&#xff0c;读者可以自己造&#xff0c;也可以通过…

台达n2系列变频器_台达变频器C2000系列在Profibus网络中的应用

基本介绍现场总线就是顺应信息技术的发展趋势和工业控制系统的分散化、网络化、智能化要求而发展起来的新技术&#xff0c;它的出现和发展已经成为全球工业自动化技术的热点之一&#xff0c;受到全世界和工业界的普遍重视。现场总线(Fieldbus)技术是实现现场级控制设备数字化通…

CentOS 6.8 虚拟机安装详解

第一步&#xff1a;安装 VMware 官方网站&#xff1a;www.vmware.com 下载百度云链接&#xff1a;http://pan.baidu.com/s/1bphDOWv 密码&#xff1a;0zix VMware 是一个虚拟 PC 的软件&#xff0c;可以在现有的操作系统上虚拟出一个新的硬件环境&#xff0c;相当于模拟出一台新…

unittest里discover用法_unittest框架核心要素及应用

1. unittest核心要素unittest介绍测试框架&#xff0c;不仅仅用于单元测试python自动的测试包用法和django.test.TestCase类似1.1【知道】unittest介绍和核心要素1.2【掌握】unittest核心要素的使用""" 1. 测试用例 2. 容器&#xff0c;容器添加测试用例 3. 运行…