Linux内存,先看这篇文章

内存大小计算

我们拿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

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

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

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

相关文章

cloudstack java api_CloudStack API编程指引

前言本文阐述为CloudStack编写新API或者更新已存在API时应遵循的约定和编程指引。参考文档(暂略)介绍当你需要为CS添加新的API时,需要创建一个Request类和Response类(或者在扩展CS API功能时它的API Responese已经定义的情况下重用已经存在的API Response类)。编写C…

深入解析hostname

结论:/etc/sysconfig/network 确实是hostname的配置文件,hostname的值跟该配置文件中的HOSTNAME有一定的关联关系,但是没有必然关系,hostname的值来自内核参数/proc/sys/kernel/hostname,如果我通过命令sysctl kernel.…

在ODM公司要不要跳槽到创业公司

读者朋友提问: 发哥,我现在在手机odm公司做指纹模块做了两三个月,基本天天加班到十点以后,后面要被调到camera团队,但是从这几个月的经历来看,感觉学到的不多,代码都是供应商写的,很…

php des加密 和java胡同_PHP版本DES加密解(对应.net版与JAVA版)

标签:/**** DES FOR .NET版本* author Administrator**/class DES_NET{var $key;var $iv; //偏移量function DES_NET( $key, $iv0 ) {//key长度8例如:1234abcd$this->key $key;if( $iv 0 ) {$this->iv $key; //默认以$key 作为 iv} else {$this->iv $i…

安卓系统应用启动流程分析

随着移动开发的兴起,安卓系统的重要性愈加突显。本文简要介绍安卓系统上应用启动流程,对于应用开发、系统定制以及性能优化人员来说,熟悉应用启动流程会使得在今后的工作中更加得心应手,做到知其然,知其所以然。本文主…

bootstrap 居中 表格中_使用Twitter Bootstrap在表格单元格中垂直居中

Tom Sarduy..156FOR BOOTSTRAP 3.X:Bootstrap现在具有表格单元格的以下样式:.table tbody > tr > td{vertical-align: top;}要做的就是添加自己的类,为前一个选择器添加更多特异性:.table tbody > tr > td.vert-aligned {vertical-align: middle;}然后将类添加到您…

撞车咋办

出门行车,最怕的就是遇到事故,老司机倒还好,这新手司机以及咱们的女司机遇到事故第一反应肯定是傻眼了。那么真要遇到事故了怎么办呢? 今天小编就来给大家讲讲遇到事故应该如何理智应对! 一、单方事故 就是你没碰到人或…

物联网通信协议全解析

随着物联网设备数量的持续增加,这些设备之间的通信或连接已成为一个重要的思考课题。通信对物联网来说十分常用且关键,无论是近距离无线传输技术还是移动通信技术,都影响着物联网的发展。而在通信中,通信协议尤其重要,…

【长沙集训】2017.10.10

Adore 1.1 问题描述 小 w 偶然间遇到了一个 DAG。 这个 DAG 有 m 层&#xff0c;第一层只有1个源点&#xff0c;最后一层只有1个汇点&#xff0c;剩下的每一层都有 k 个 节点。 现在小 w 每次可以取反第 i(1 < i < n − 1) 层和第 i 1 层之间的连边。也就是把原本从 (i,…

elasticsearch mongodb mysql_Elasticsearch 与 Mongodb 数据同步问题

1、mongo-connector工具首先安装python环境wget http://www.python.org/ftp/python/3.0.1/Python-3.0.1.tgztar -zxvf Python-3.0.1.tgzcd Python-3.0.1./configuremake allmake install看来新装的版本生效了&#xff0c;做个软连接应该就OK。ln -s /usr/local/bin/python3.0 /…

Linux中断子系统之Workqueue

背景说明Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio1. 概述Workqueue工作队列是利用内核线程来异步执行工作任务的通用机制&#xff1b;Workqueue工作队列可以用作中断处理的Bott…

python3一个简单的网页抓取

python3一个简单的网页抓取 都是学PYTHON。怎么学都是学&#xff0c;按照基础学也好&#xff0c;按照例子增加印象也好&#xff0c;反正都是学 import urllib import urllib.requestdata{} data[word]baker95935url_valuesurllib.parse.urlencode(data) url"http://www.ba…

给你准备的Linux启动流程

读者朋友提问&#xff1a; 昨天在后台看到一个读者朋友跟我说&#xff0c;发哥&#xff0c;你能不能讲一下嵌入式Linux的开机流程&#xff0c;然后我看了下&#xff0c;我是没有写过这方面的文章&#xff0c;所以&#xff0c;就有了这篇文章。回答&#xff1a;我们都知道pc指针…

[linux]服务器apache配置vhost

官网示例&#xff1a; http://httpd.apache.org/docs/current/vhosts/examples.html转载于:https://www.cnblogs.com/oDoraemon/p/7650748.html

java dao 单元测试_Spring Service、Dao进行Junit单元测试

pring对Controller、Service、Dao进行Junit单元测试总结​ 所有用Junit进行单元测试&#xff0c;都需要下面的配置RunWith(SpringJUnit4ClassRunner.class)ContextConfiguration(locations {"classpath:applicationContext.xml"})​ applicationContext.xml 是整个项…

Linus Torvalds:我们都老了,但Linux维护者真的很难找

Linux 之父Linus Torvalds非常担忧没人继续维护内核「真的很难找到维护者&#xff01;」在本周召开的Linux开源峰会与嵌入式大会上&#xff0c; VMware的首席开放源代码官Dirk Hohndel和Linux的创建者Linus Torvalds再次就Linux开发展开了远程对话讨论。左&#xff1a;Dirk Ho…

判断线程结束

判断线程结束 使用ExecutorService.isTerminated方式 public void executor() throws InterruptedException{ExecutorService executorService Executors.newFixedThreadPool(threadNum);List<Callable<Object>> calls new ArrayList<>();for (int i 0; …

java map扩容机制_java中ConcurrentHashMap的扩容机制是怎样的?详细解析

大家都知道java中有很多的基础知识&#xff0c;需要大家花费一定的时间去消化。关于java中ConcurrentHashMap的扩容机制不知道大家是否了解过&#xff0c;其实内容也是很好理解的&#xff0c;一起来看看吧。首先&#xff0c;我们需要知道的是&#xff1a;1. 计算每个线程可以处…

看printk引发的一点思考

在源码位置kernel/printk/函数原型asmlinkage __visible int printk(const char *fmt, ...) {printk_func_t vprintk_func;va_list args;int r;va_start(args, fmt);/** If a caller overrides the per_cpu printk_func, then it needs* to disable preemption when calling pr…

寄语

寄语&#xff1a; 前面漆黑一片&#xff0c;什么都看不到。 也不是&#xff0c;天亮后就会很美的。转载于:https://www.cnblogs.com/doudou-taste/p/7660997.html