内存大小计算

我们拿32位系统来举个栗子

2^32 = ‭4,294,967,296‬ bytes

‭4,294,967,296‬ bytes / 1024 = ‭4,194,304‬ kbytes

4,194,304‬ kbytes / 1024= ‭4,096‬ M

‭4,096‬ M /1024 =  4G

物理内存如何分页?

分段和分页计算机内存管理的两种方式,这里我只讨论分页。

比如是 4G的内存,我们一个页的大小是 4K,那可以分成多少个页呢?

通过一系列复杂而且不为人知的计算

4,194,304‬ kbytes / 4 = ‭1,048,576

所以分页后的物理内存应该是这样排列的

MMU是什么?

如果操作系统是一家银行,那MMU就是这家银行的资金仓库管理员,所有要申请资金的人都要通过管理员才能拿到钱。

我们说的MMU就是内存管理单元,所有什么乱七八糟的虚拟地址最后都是都需要经过MMU这个内存管家把虚拟地址转换成物理地址来操作的。

顺便说一句,并不是所有的支票都可以转成钱的,有些也可能是空头支票,操作系统给应用的虚拟内存,这些虚拟内存并不是都能转换成相对应的物理内存的

分页模式下的虚拟地址转换成物理地址对应图

上面分页的问题

如果是32的系统,我们4G的内存,分成4KB一个页,那需要多少个页呢?

4,194,304‬ kbytes / 4 = ‭1,048,576‬

我们上面已经计算出来了,如果一个虚拟地址和物理地址的映射关系需要4个字节来存储,那我们需要多少空间呢?

1,048,576‬  x 4bytes = ‭4,194,304‬ bytes /1024 = ‭4,096‬ k / 1024 = 4M

就是说我们一个映射关系需要 4M的内存,我们操作系统开一个进程就需要开一个映射表,如果我我们开100个进程就需要400M内存,这样的话,我们的操作系统的内存会非常非常吃紧。

所以,操作系统的开发大牛们就发明了多级页表这个东西,多级页表的作用就是为了省空间,每当读到这里,我每每感叹,自己比别人是笨了多少个等级啊。

为什么需要4个字节来存一个页表项呢?因为是32为地址,一个字节是8位,4个字节刚好是32位,所以就需要4个字节存储页表项。

有人会问,这4K存的是物理地址还是虚拟地址呢?

大家想一下,物理地址的分页在系统启动的时候已经确定好了,物理地址是没有必要分多次的。所以这个存的是虚拟地址。

多级页表

然后,大神们就设计出这样的分页方式

多级页表划分

我们上面说了,如果只用一级分页的话,导致一个问题是需要的太多的空间来存储映射关系了,那现在改成使用32bit不同的bit来寻址,需要多少内存来存储呢?

2^10 = 1024bytes = 1k

一个页表大小是 4 K ,我们是一个字节一个字节的偏移的,所以一个页我们一定需要 12个bit做偏移来获取页中的具体位置,所以我们必须要留12bits给页表偏移使用。

既然页表偏移使用12bit,那页目录和页表各分到10bits。

1024 * 1024 = ‬ ‭1,048,576‬

1,048,576‬  x 4 k = ‭4,194,304‬ k

‭4,194,304‬ k / 1024 = 4096M = 4G

这样分是不是很牛,计算出来就刚刚好等于 4G 内存

那页表项我们需要多少内存空间呢?

页目录一共是 2^10 = 1024 项,每一项代表一个页目录表的编号,一个页目录表我们需要4个字节来表示,所以占用的存储空间应该是 1024 * 4bytes = 4K 大小。

同理页表也是一样,需要4K大小的存储空间

偏移量这个是不需要存储的,我们只要知道了前面两个位置,再加上偏移量,就能准确知道内存的具体位置了

我们把这种分段方式想象成一本书,就很好理解了。比如,我们要在新华字典查某个字的时候,我们需要在目录里面找这个字在哪一页,这个就需要一个页目录表。然后,我们找到确定的页数后,再通过页表找到在哪一行。最后,我们通过偏移量找到这个字跟行首偏移多少个字。

我们这样就能找到确定的字了。

如下图

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

end

嵌入式Linux

微信扫描二维码,关注我的公众号

Linux内存,先看这篇文章相关推荐

  1. Vue开发入门看这篇文章就够了

    摘要: 很多值得了解的细节. 原文:Vue开发看这篇文章就够了 作者:Random Fundebug经授权转载,版权归原作者所有. 介绍 Vue 中文网 Vue github Vue.js 是一套构建 ...

  2. 好多人都说存储过程很难?认真看这篇文章就够了

    何为存储过程? 存储过程是在数据库管理系统中保存的.预先编译的并能实现某种功能的sql程序,说直白点,java知道吧?和java的方法一样. 每遇到一个新的知识点时,我们都会看看它的优点,从而加深对它 ...

  3. 上海nas服务器_想要自己搭建NAS服务器?看这篇文章,小白也能学会!(一)

    原标题:想要自己搭建NAS服务器?看这篇文章,小白也能学会!(一) NAS即网络附加存储(Network Attached Storage),通过网络提供数据访问服务. 本人不推荐自攒NAS,稳定性差 ...

  4. 如果有人问你数据库的原理,看这篇文章。(超长预警)

    长文,相当的通透.以下为scrat进行总结后的删减版. 下面假定你已经知道时间复杂度 关系型数据库无处不在,而且种类繁多,从小巧实用的 SQLite 到强大的 Teradata .但很少有文章讲解数据 ...

  5. Android 8.0新特性(看这篇文章就够了)

    2019独角兽企业重金招聘Python工程师标准>>> 在刚结束不久的谷歌 I/O2017开发者大会上发布的第二个Android O(安卓8.0)开发者预览,并且向普通用户开放了第二 ...

  6. 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下(转)...

    本文转自http://blog.csdn.net/gs80140/article/details/51496925 一直对zookeeper的应用和原理比较迷糊,今天看一篇文章,讲得很通透,分享如下: ...

  7. 使用分层网络模型的两个优点是什么_从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了...

    从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了​mp.weixin.qq.com 前言 今天和大家一起谈谈"网络",之前写的文章可能不太通俗易懂,有人就 ...

  8. python入门书籍推荐,看这篇文章就够,请!

    python入门书籍推荐,看这篇文章就够,请! 事实上,有关python的书籍很多很多,就当当网就有50000件和python有关的书籍,我特地去了当地的新华书店,蹲了大半天,回来给大家推荐,适合想学 ...

  9. 男孩,请用几分钟看这篇文章(女孩别看,会哭)

    [转] 男孩,请用几分钟看这篇文章(女孩别看,会哭) 这是一个真实的故事,从网上看到,我被女孩的行为感动了,所以才转到我的空间来.是男孩就一定必须要看,只用你几分钟的时间,看完后要深深的思考" ...

  10. i7处理器好吗_二手CPU值得买吗?购买二手CPU不想交智商税就看这篇文章

    二手CPU值得买吗?众所周知,不少装机用户可能因为预算的原因,可能会考虑二手硬件,理论上二手CPU无疑相比全新更加便宜,但是CPU这玩意真的有很多例外,有些二手CPU还真的没有全新划算,较老型号的in ...

最新文章

  1. 图论 ---- DAG删点+枚举+暴力+离线前缀异或和 J Red-Black Paths (2021 icpc网络赛第一场)
  2. 嵌入式学习笔记之三 (uboot我来看)
  3. 登录首页时报错:java.lang.IllegalArgumentException (不合法的参数异常)
  4. spring的log4j listener(webAppRootKey)
  5. P3181-[HAOI2016]找相同字符【SAM】
  6. OpenSSL原理与实现
  7. 【福利】MySQL vs Postgre SQL: 5个你最关注的非技术维度的区别
  8. Pandas使用DataFrame进行数据分析比赛进阶之路(一)
  9. https 慢_dba+开源工具:可视化分析MongoDB慢查询日志
  10. 每个tabpage中都有一个dategridview_宇宙中每个原子里都隐藏着一个巨大的秘密
  11. sigar获取单个进程信息
  12. Docker bridge 模式 容器如何访问外部世界?
  13. 财务管理系统如何帮助企业实现财务自动化管理?
  14. 网络测试丢包软件,网络掉包率测试工具
  15. XMind思维导图使用详解
  16. 罗技推出可蓝牙连接的5.1环绕立体声扬声器
  17. python算24点穷举法_24点游戏7节课–第1节-游戏介绍与基本算法 | 学步园
  18. 怎样快速抠图ps图片?这些小妙招了解一下
  19. strtotime 用法
  20. 《UnityAPI.GUI界面》(Yanlz+Unity+SteamVR+云技术+5G+AI+VR云游戏+GUI+DrawTexture+FocusControl+Toggle+立钻哥哥++OK++)

热门文章

  1. Sublime Text 3新建工程
  2. 【学习笔记】在storyboard中给TabViewController添加tab页面
  3. RS 学习笔记 3-1
  4. 微软白皮书发布:在IIS7.5中用Service Bus端点寄宿WCF服务
  5. 数据库操作,内外联查询,分组查询,嵌套查询,交叉查询,多表查询,语句小结...
  6. @Pointcut的用法
  7. 清华大学《操作系统》(十八):管程于信号量
  8. Flask werkzeug 源码解析
  9. Flask 第三方组件之 SQLAlchemy
  10. Python 第三方库之 Celery 分布式任务队列