Linux中MMU内存管理【进阶学习】

news2024/12/28 5:17:35

前言

现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供支持。

MMU(Memory Management Unit) :内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。

内存管理单元MMU(memory management unit)的主要功能是虚拟地址(virtual memory addresses)到物理地址(physical addresses)的转换。除此之外,它还可以实现内存保护(memory protection)、缓存控制(cache control)、总线仲裁(bus arbitration)以及存储体切换(bank switching)。

工作机制

CPU将要请求的虚拟地址传给MMU,然后MMU先在高速缓存TLB(Translation Lookaside Buffer)查找转换关系,如果找到了相应的物理地址则直接访问;如果找不到则在地址转换表(Translation Table)里查找计算。

虚拟地址

现代的内存管理单元是以页的方式来分区虚拟地址空间(the range of addresses used by the processor)的。页的大小是2的n次方,通常为几KB。所以虚拟地址就被分为了两个部分:virtual page number和offset。

页表项(page table entry)

上面从虚拟页号在页表里找到的存放物理页表号的条目就是页表项(PTE)。PTE一般占1个字长,里面不仅包含了physical page number,还包含了重写标志位(dirty bit)、访问控制位(accessed bit)、允许读写的进程类型(user/supervisor mode)、是否可以被cached以及映射类型(PTE最后两位)。

映射

映射方式

映射方式有两种,段映射和页映射。段映射只用到一级页表,页映射用到一级页表和二级页表。

映射粒度

段映射的映射粒度有两种,1M section和16M supersection;页映射的映射粒度有4K small page、64K large page和过时的1K tiny page。

假设页表只有一级

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

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

总结CPU访问虚拟地址的流程如下:

依次按顺序判断:是否命中(命中:想要的数据在内存中)、是否满足RWX权限、是否满足 User/Kernel权限,只要一项不满足,MMU会给CPU发出paqefault,CPU自动跳到fault的代码 去处理fault。全满足,那么MMU就去访问内存条上对应的地址。

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

所以,这个页表的大小是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,把新的进程的页表激活即可。 在Android开发中,Linux中MMU内存管理也是重要部分;Android学习是永无止境的,技术不断更新。我们不能停滞不前有关更多的技术学习可以参考《Android核心技术手册》里面内容丰富适用于的大部分初中级程序员学习进阶。

文末:MMU的产生

许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为覆盖块(overlay)的片段。

覆盖块0首先运行,结束时他将调用另一个覆盖块。虽然覆盖块的交换是由OS完成的,但是必须先由程序员把程序先进行分割,这是一个费时费力的工作,而且相当枯燥。人们必须找到更好的办法从根本上解决这个问题。不久人们找到了一个办法,这就是虚拟存储器(virtual memory).虚拟存储器的基本思想是程序,数据,堆栈的总的大小可以超过物理存储器的大小,操作系统把当前使用的部分保留在内存中,而把其他未被使用的部分保存在磁盘上比如对一个16MB的程序和一个内存只有4MB的机器,OS通过选择,可以决定各个时刻将哪4M的内容保留在内存中,并在需要时在内存和磁盘间交换程序片段,这样就可以把这个16M的程序运行在一个只具有4M内存机器上了。而这个16M的程序在运行前不必由程序员进行分割。

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

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

相关文章

微信小程序023安全科普之家在线考试错题集

开发语言:Java 小程序前端框架:uniapp 小程序运行软件:微信开发者 后端技术:Ssm(SpringSpringMVCMyBatis)vue.js 后端开发环境:idea/eclipse 数据库:mysql 本系统设计的是一个“科普之家”知识在线考试小程序的网站,此网站使用户实…

计算机网络基础知识点

计算机网络基础知识点计算机网络1、概述1.1 计算机网络基本概念1.2 互联网核心部分:数据交换1.3 计算机网络的性能指标1.4 计算机网络体系结构2、物理层2.1 物理层基本概念2.2 数据通信系统模型2.3 数据编码技术2.4 信道复用技术3、数据链路层3.1 概述3.2 PPP协议3.3 CSMA/CD3.…

Python垃圾回收机制——完美讲解

Garbage collection(GC) 现在的高级语言如java,c#等,都采用了垃圾收集机制,而不再是c,c里用户自己管理维护内存的方式。自己管理内存极其自由,可以任意申请内存,但如同一把双刃剑,为大量内存泄…

小程序用ts时点击事件e的类型

今天检查代码的时候发现,小伙伴用ts写的文件里面,点击事件的e都是用any,这明显不对。所以趁着有空,去百度去翻阅资料解决这个问题。 小程序的官方社区下面直接给了答案,如下图: 嗯,是的&#x…

看ChatGPT这形势,留给我们开发人员的时间不多了

程序员一直所做的工作是什么?恐怕想到最后,每个努力的程序员都是在让自己努力的走向失业。最近ChatGPT爆火,他能做什么?能写文章,写的很好,可以代替你发邮件,一直到发现OpenAI的深度加持&#x…

微信小程序 Springboot+vue+nodejs学科竞赛比赛报名管理系统

目 录 摘 要 III Abstract 4 1 系统概述 5 1.1 概述 5 1.2课题意义 5 1.3 主要内容 5 2 系统开发环境 6 2.1微信开发者工具 6 2.2小程序框架以及目录结构介绍 6 2.3 JAVA简介 7 2.4 MySQL数据库 7 3 需求分析 1 3.1 系统设计目标 1 …

实战案例 Python批量识别银行卡号码并且写入Excel,初学者也可以轻松使用~

大家好,这里是恶霸 今天我们继续学习Python自动化办公:每次有新员工入职,都要收集大量的工资卡信息,并且生成Excel文档,能不能用Python准确、快速地解决呢? 今天我们就来学习一下,如何用1行代…

【07】FreeRTOS的列表和列表项

目录 1.列表和列表项的简介 1.1列表结构体成员-介绍 1.2列表项结构层成员-介绍 1.3迷你列表项 1.4列表和列表项的关系 2.列表相关API函数介绍 2.1列表初始化函数vListInitialise() 2.2列表项初始化函数vListInitialiseItem() 2.3列表项插入函数vListInsert() 2.4末尾…

微服务配置中心, 这个方案 Go 里用起来不输SpringCloud

微服务架构设计模式里有一条讲到,要设计可配置的服务。把服务从单体架构细分成微服务后,所有配置属性都集中存储在一个位置,更易于管理。这个集中存储管理配置的地方叫,就是配置中心。 使用配置中心还有一个好处就是,…

java基础面试题 一

一、面向对象五大基本原则是什么 1.单一职责原则SRP(Single Responsibility Principle) 类的功能要单一,不能包罗万象,跟杂货铺似的。 2.开放封闭原则OCP(Open-Close Principle) 一个模块对于扩展是开放的,对于修改是封闭的 …

Jenkins基于docker cloud动态增减节点

jenkins可以按照jenkins容器启动去部署 Jenkins管理动态节点 动态节点可以在有job运行时,临时加入一个agent到jenkins master,然后等job执行完毕之后,所加入的agent再自动删除掉,达到一个动态的增删节点效果,使所有的…

引用第三方插件到分包中即如何把uni_modules文件夹中的插件放入分包中

网上搜索了很多,但都没有直接说明如何把node_modules中的第三方插件如何引入到分包中,首先为什么要在分包引入,原因就是小程序有包大小的限制,不能超过2M,超过2M的话,则不能发布或预览,于是不能…

SCT81620QSTER,升降压电源芯片

P2P替代 LM3478和LM3481SCT81620QSTER设备是一个宽输入、非同步升压控制器。该设备可用于增强、间隔和反馈转换器和拓扑结构。SCT81620Q设备的开关频率可以通过将SCT81620Q设备的开关频率调整到100 kHz到2.2MHz之间的任何值。电流模式控制提供了优越的带宽和瞬态响应&#xff0…

IDEA设置注释模板(详细版)

IDEA设置注释模板 类注释模板方法注释模板效果展示 1. 类注释模板 类注释模板是IDEA创建类时生成的注释 第一步、File -> Settings 第二步、Editor -> File and Code Templates -> Includes -> File Header 点apply,再点ok即可 模板参考如下&#…

拉格朗日插值原理及其Julia实现

文章目录数学原理算法化测试设函数yf(x)yf(x)yf(x)在区间[a,b][a,b][a,b]上有定义,且在点a⩽x0⩽x1…⩽xn⩽ba\leqslant x_0\leqslant x_1\ldots\leqslant x_n\leqslant ba⩽x0​⩽x1​…⩽xn​⩽b上的值y0,y1…yny_0, y_1 \ldots y_ny0​,y1​…yn​之间存在一个函…

规则引擎-drools-3.2-drl文件构成-rule部分-属性Attribute

文章目录drl文件构成-rule部分rule示例rule nameAttribute全部属性说明no-loop 和 lock-on-activeactivation-group 和 agenda-groupdrl文件构成-rule部分 drl文件构成,位于官网的第5章位置,也是drools作为规则引擎应用的最核心部分。 其中rule模块&…

谷歌浏览器无法翻译此网页,解决方法?(谷歌浏览器无法翻译成中文,谷歌翻译,最新方法)

谷歌浏览器自带的翻译功能,对我们来说用处很大,但有的时候突然就会变成“无法翻译此网页”,针对此问题这里提供几种解决方案(翻译插件),如下: 方法1: 蓝奏云文件https://wwot.lanzouw.com/iFc7d0hmrtpg 访问密码:slee 方法2: 脚本之家

分布式事务的4种模式

分布式事务理论基础 解决分布式事务,也有相应的规范和协议。分布式事务相关的协议有2PC、3PC。 由于三阶段提交协议3PC非常难实现,目前市面主流的分布式事务解决方案都是2PC协议。 有些文章分析2PC时,几乎都会用TCC两阶段的例子&#xff0…

Java开发基础入门之Java基础中的Stack类及其常用方法

一、Stack类 1.Stack是Vector的一个子类,它实现标准的后进先出堆栈。Stack只定义了创建空堆栈的默认构造方法。 Stack() 2.Stack类里面主要实现的有以下的几个方法: (1)boolean empty( )方法是判断堆栈是否为空。 (2)Object peek( )方法是返回栈顶端…

一夜爆火的现象级产品ChatGPT,是AI突破还是昙花乍现?

导语 | 编写代码、翻译小说、参加考试……2022 年末,人工智能聊天机器人 ChatGPT 风靡全网。自 2016 年 AlphaGo 击败围棋世界冠军李世石后,ChatGPT 再次掀起了人工智能发展应用的高潮。它将会给我们带来哪些影响?人工智能的颠覆性应用是否即…