转:https://blog.csdn.net/yueqian_scut/article/details/24816757

mmu页表也是放在内存中,mmu里有一个寄存器存放页表首地址,从而找到页表(地址为物理地址)。当我们执行一个程序时,会把这个进程的mmu页表地址放到该寄存器中,跳转找到mmu页表执行。

TLB是MMU内部的缓存,页表是每个进程都有的一段保存虚拟地址到物理地址对应映射关系的数组,此数据在内存中

(TLB---Translation Lookaside Buffers,转译查找缓存):由于从MVA到PA的转换需要访问多次内存,大大降低了CPU的性能,故提出TLB办法改进。当CPU发出一个虚拟地址时,MMU首先访问TLB。如果TLB中含有能转换这个虚拟地址的描述符,则直接利用此描述符进行地址转换和权限检查,否则MMU访问页表找到描述符后再进行地址转换和权限检查,并将这个描述符填入TLB中,下次再使用这个虚拟地址时就直接使用TLB用的描述符。使用TLB需要保证TLB中的内容与页表一致,在启动MMU之前,页表中的内容发生变化后,尤其要注意。一般的做法是在启动MMU之前使整个TLB无效,改变页表时,使所涉及的虚拟地址对应的TLB中条目无效。

不同进程切换时,通过CR3(x86时)寄存器 把页表缓存地址传递给MMU模块,进而时MMU的TLB更新为对应进程的页表内容

程序的大部分代码都可以在必要的时候才加载到内存去执行,运行完后可以被直接丢弃或者被其他代码覆盖。我们PC上同时跑着很多的应用程序,每个应用程序使用的虚拟地址空间几乎可以整个线性地址空间(除了部分留给操作系统或者预留它用),可以认为每个应用程序都独占了整个虚拟地址空间(字长是32的CPU是4G的虚拟地址空间),但我们的物理内存只是1G或者2G。即多个应用程序在同时竞争使用这块物理内存,其必然会导致某个时刻只存在程序的某个片段在执行,也即是所有程序代码和数据分时复用物理内存空间—这就是内存管理单元(MMU)工作核心作用所在。

处理器系列的芯片(如X86、ARM7以上、MIPS)一般都会有MMU,跟操作系统一块实现虚拟内存管理,MMU也是Linux、Wince等操作系统的硬件要求。而控制器系统的芯片(面向低端控制领域,ARM1,2,MIPS M系列,80251等)一般都没有MMU,或者其只有单一的线性映射机制。

本文要谈的是控制器领域SoC的内存管理单元的硬件设计,其重要的理念同样是代码和数据分时复用物理内存空间,在保障系统功能和性能的基础上最大限度地节省物理内存的目的。相关的文章包括:SoC软件架构设计之一:系统内存需求评估和节省内存的软件设计技巧。

一、内存管理单元(MMU)的工作机制

在阐述控制器领域的内存管理之前,还是要先介绍处理器领域的虚拟内存管理机制,前者很大程度上是对后者核心机制精髓的借鉴。实现虚拟内存管理有几个模块是协调工作的:CPU、MMU、操作系统、物理内存,如图示(假设该芯片系列没有cache):

我们根据上图来分析一下CPU访问内存的过程,假设寻址是0x10000008,一页大小为4K(12比特)。则虚拟地址会分成两个部分:页映射部分(20bit,0x10000)+页内偏移(12bit, 0x8)。CPU通过总线把地址信号(0x10000008)送给MMU,MMU会把该地址的页映射部分(20bit)拿到TLB中匹配。

TLB是什么东西?Translation Lookaside Buffer,网上有称为“翻译后备缓冲器”。这个翻译都不知道它干什么。它的作用就是页表的缓冲,我喜欢叫它为页表cache。其结构图如下:

可以想象,TLB就是索引地址数组,数组的每个元素就是一个索引结构,包含虚拟页地址和物理页地址。其在芯片内部表现为寄存器形式,一般寄存器都是32位,实际上TLB中的页地址也是32位寄存器,只不过索引比较时是比较前20bit,后12bit其实也是有用的,例如可以设置某个bit是表示常驻的,即该索引是永远有效的,不能更换,这种场景一般是为适合一些性能要求特别高的编解码算法而设计的。非常驻内存的一般在某个时刻(如TLB填满时访问一个新的页地址)就会发生置换。

1) 假如0x10000008的前20bit在TLB中第M个索引中命中,这时就表示该虚拟页在物理内存中已经给它分配好对应的物理内存,页表中也已经做好记录。至于虚拟地址对应的代码页是否从外存储(flash,card,硬盘)的程序中加载到内存中还需要要另外的标记,怎么标记呢?就是利用上面所讲的TLB低12位的某一bit(我们称为K)来标识,1标识代码数据已经加载到内存,0表示还没加载到内存。假如是1,那就会用M中的物理地址作为高20bit,以页内偏移0x8作为低12bit,形成一个物理地址,送到内存去访问。此时该次访问就会完成。

2) 假如K是0,那意味着代码数据尚未加载到内存,这时MMU会向中断管理模块输出信号,触发一个中断进行内核态,由操作系统负责将对应的代码页加载到内存。并修改对应页表项的K比特和TLB对应项的K比特为1.

3) 假如0x10000008的前20bit在TLB所有索引中都没有命中,则MMU也会向中断管理模块输出一个信号触发中断进入内核态,由操作系统将0x10000008右移12位(即除以4K)到页表中去取得对应的物理页值,假如物理页值非0有效,说明代码已经加载到内存了,这时将页表项的值填入到某一个空闲的TLB项中;假如物理页值为0,说明尚未给这个虚拟页分配实际的物理内存空间,这时会给它分配实际的物理内存,并写好页表的对应项(这时K是0),最后将这索引项写入TLB的其中一条。

2)和3)其实都是在中断内核态中完成的,为什么不一块做了呢?主要是因为一次中断不应该做太多事情,以加大中断延时,影响系统性能。当然如果有芯片将两者做成一个中断也是可以理解的。我们再来看看页表的结构。页表当然也可以按TLB那样做成索引数组,但是这样有两个不好的地方:

1)页表是要映射所有的虚拟页面的,其维护在内存中也需要不小的空间。页大小是4K时,那映射全部就是4G/4K=1M条索引,每条索引4*2=8个字节,就是8M内存。

2)假如按TLB那种结构,那匹配索引的过程就是一个for循环匹配电路,效率很低,要知道我们做这个都是在中断态完成的。

所以一般的页表都是设计成一维数组,即以整个线性虚拟地址空间按页为单位依次作为数组的下标,即页表的第一个字(4字节)就映射虚拟地址空间的最低4K,第二个字映射虚拟地址最低的第二个4K,以此类推,页表的第N个字就映射虚拟地址空间的第N个4K空间,即(N-1)*4K~4KN的地址空间。这样页表的大小就是1M*4=4M字节,而且匹配索引的时候只是一个偏移计算,非常快。

承前启后,在引出第二部分之前先明确两个概念:

1. Bank表示代码分块的意思,类似于上面提到的页的概念。

2.不同代码分时复用内存:不同代码即意味着不同的虚拟地址对应的代码,(程序链接后的地址都是虚拟地址),内存即物理内存,即一定大小的不同虚拟地址的代码在不同的时刻都跑在同一块一定大小的物理内存空间上。每一块不同的代码块即是不同的代码Bank。

二、控制器领域SoC内存管理单元的硬件设计

这里专指没有内存管理单元的SoC设计,一般为了降低成本,在性能足够时,如果16位或者24位字长CPU能够解决问题,一般都不会去选32位字长的CPU,除非是计算性能考虑,或者32位CPU的license更便宜(一般很少见)。只要能够达到高效地进行内存管理,实现物理内存分时复用的目的,那都可以称为是成功或者有效的。在介绍真正的内存管理单元硬件设计之前,我们先简单介绍一种利用工具链来实现内存分时复用的机制,然后再结合MMU和这个工具链实现的分块处理方法去设计我们新的内存管理单元,包括其硬件工作机制和软件设计和关键机制。

由于以下内容涉及到在审专利,经过考虑,暂时将以下内容隐藏,适当时候再公开,抱歉!

×××××××

后记补充

在集成没有MMU的CPU时,SoC要实现内存管理,需要另外设计一个内存管理模块,实现MMU的核心功能,即代码分页(块)映射的功能,而且需要简化设计以达到最高的效率,同时代码分块需要直接地体现在链接脚本上。为了追求效率,编译链接后的可执行性文件还会被离线解析组织成一个更简化的执行文件,把不需要的段都删除,并将分块代码按逻辑顺序放好,以便于操作系统在必要时更快地加载。当然,操作系统的代码内存管理也需要配合内存管理硬件电路,并能够解析重新打包后的执行程序文件。因此内存管理的实现是需要架构师从软件和硬件上全面考虑,尽可能地在实现核心功能的基础上简化电路和设计,涉及的模块包括:硬件机制设计、物理内存分配、代码分块原则、linker脚本定义、打包执行文件、操作系统定制等等。后续阐述的架构设计将会包括以上内容。

---------------------

本文来自 吴跃前 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/yueqian_scut/article/details/24816757?utm_source=copy

linux mmu的实现的讲解_MMU解读相关推荐

  1. linux mmu的实现的讲解_Linux中的物理内存管理 [一]

    前面的文章介绍了Linux中虚拟地址空间的管理,本文将讨论Linux系统对物理内存的管理. NUMA 所谓物理内存,就是安装在机器上的,实打实的内存设备(不包括硬件cache),被CPU通过总线访问. ...

  2. linux mmu的实现的讲解_Linux中的段

    Intel 微处理器的段机制是从8086 开始提出的, 那时引入的段机制解决了从CPU 内部 16 位地址到20 位实地址的转换.为了保持这种兼容性,386 仍然使用段机制,但比以前复杂. 因此,Li ...

  3. linux内核奇遇记之md源代码解读之八阵列同步二

    linux内核奇遇记之md源代码解读之八阵列同步二 转载请注明出处:http://blog.csdn.net/liumangxiong 在上一小节里讲到启动同步线程: 7824 mddev->s ...

  4. linux下杀死进程全权讲解

    linux下杀死进程全权讲解 2009-10-27 08:57 佚名 linux 我要评论(0) 字号:T | T 本文将详细讲解linux杀死进程的多种命令,包含他们的作用,kill作用:根据进程号 ...

  5. Linux字符设备重命名,【收藏】Linux常用命令全称及讲解(五)

    今天小编 要跟大家分享的文章是关于Linux常用命令全称及讲解(五).从事IT行业的很多人都会使用Linux常用命令,但是知道这些常用命令全称的人并不多,让我们来看看这些常用命令对应的全称吧!小编精心 ...

  6. linux内核奇遇记之md源代码解读之十二raid读写

    linux内核奇遇记之md源代码解读之十二raid读写 转载请注明出处:http://blog.csdn.net/liumangxiong 我们都知道,对一个linux块设备来说,都有一个对应的请求队 ...

  7. linux touch命令 全称,【收藏】Linux常用命令全称及讲解(八)

    今天小编要跟大家分享的文章是关于Linux常用命令全称及讲解(八).从事IT行业的很多人都会使用Linux常用命令,但是知道这些常用命令全称的人并不多,让我们来看看这些常用命令对应的全称吧!小编精心整 ...

  8. 复制linux内核,linux内核写时复制机制源代码解读

    作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...

  9. linux中将文本中的单词换掉的指令_干货:Linux常用命令全称及讲解

    从事IT行业的很多人都会使用Linux常用命令,但是知道这些常用命令全称的人并不多,让我们来看看这些常用命令对应的全称吧!小编精心整理了一下,毕竟常用命令比较多,如果没有你常用的还望海涵,可以评论区补 ...

最新文章

  1. 密度聚类、密度聚类过程、OPTICS算法
  2. centos 禁用root登录
  3. java 类和方法自动添加注释
  4. 如何自学python爬虫-菜鸡的Python爬虫之路(一)如何零基础自学Python
  5. MYSQL数据库导入出错:#1046 - No database selected
  6. at指令返回值检验c语言,学渣求指教,如何识别字符串中的AT命令并逐个输出,求程序!!!...
  7. 数字和为sum的方法数-01背包计数问题
  8. 【计算机网络复习 数据链路层】3.4.2 停止-等待协议
  9. jsp import mysql con_jsp的分页查询的代码(mysql数据库)
  10. python双层for循环优化,如何优化Python中的嵌套for循环
  11. wamp配置中的大小写
  12. smoothstep(),平滑阶梯函数,平滑过渡函数
  13. 初次软件开发(总结篇 之二)_-Chaz-_新浪博客
  14. 豆果美食APP,看一下都给[Python爬虫爱好者]提供了哪些接口
  15. win10桌面的计算机图标怎么删除,win10电脑桌面图标如何去掉快捷箭头。
  16. gtx1660是什么级别的_GTX1660显卡性能怎么样 gtx1660相当于什么显卡
  17. 基于MTK65xx平台lcm和背光驱动的编写
  18. SuperMap iDesktop 提取影像边界裁剪去除无值区域处理方案
  19. 使用vue-cli创建vue工程
  20. 嵌入式项目实战——基于QT的视频监控系统设计(二)

热门文章

  1. 目前市场上用于个人计算机的硬盘尺寸是,2016年计算机组装与维修高考题
  2. 【R】分类数据与数值型数据分组与绘图
  3. 微信小程序动画效果方法封装
  4. query Table 的基本操作
  5. Html中img自带属性有哪些,HTML IMG标签的属性是有哪些?了解IMG标签的用法
  6. 项目实战——基于Java8+JavaFX+多线程+文件IO+SQLite数据库实现的本地文件快速搜索引擎详细设计实现
  7. 联想小新锐7000(笔记本)+ubuntu14.04+gtx1050+cuda8.0+cudnn5.1+caffe完整配置记录
  8. Windows解决npm命令没有反应
  9. 关于object[ 变量],arry[变量]
  10. RFID标签与我们的生活息息相关