简单介绍MMU和TLB

简单记录一下有关MMU的一些东西
背景
引入虚拟地址的原因
(一)让APP可以以同样的链接地址来编译
举个例子,两个hello应用程序,编译后查看反汇编代码,这两个程序的起始地址都是0x80A4。于是CPU运行两个APP时,都会去0x80A4读指令,然后经过MMU转换成Addr1、Addr2。这样,不同的APP可以在任意地址,经过MMU地址转换后,在内存上是不同的地址,互不干扰。
(二)让大容量APP可以在资源少的系统上运行
在电子系统里面,内存都是有限的,无论是嵌入式系统还是电脑,比如我们的JZ2440内存就只有64M,这时假如有一个APP,需要1G的内存。应用程序执行时,不是一次性将所有代码都放入内存,而是将要运行的部分依次放入,当放入的代码指令大于64M后,会先将SDRAM里暂时用不到代码指令先置换出来,再放入需要运行的代码指令。这样尽管SDRAM很小,也可以运行内存需要很大的应用程序,而这个置换管理的工作,就是由MMU完成的。
(三)权限管理,禁止访问其它空间
不同的APP之间应该相互独立,避免APP1能直接访问到APP2,以防止APP1影响APP2。

首先是关于虚拟地址与物理地址
如果处理器咩有MMU,CPU内部执行单元所产生的地址信号经由地址总线送到芯片的引脚,这就是物理地址(PA)。如果处理器有MMU,那么同样的CPU在送地址信号到存储芯片的时候,会被MMU先截取,经由MMU翻译后,会将虚拟地址映射成物理地址在送到芯片的引脚。
举一个例子来说,我们在程序中定一个了一个变量,比如 int a = 10;,此时如果我们使用debug工具就可以看到变量 a 存放的地址为 0x10006666 ,此时的地址即为虚拟地址。如果我们使用硬件检测工具去检测 变量 a 实际在内存中的地址,我们会发现可能是 0x000080000,此时的地址即为物理地址。

其次我们需要理解一下 页 / 页表 / 页表项
前面说到 MMU 完成的是虚拟地址到物理地址的映射,那么对于映射来说,我们需要知道映射的最小单位(粒度)和映射的规则。
从VA到PA的映射最小的单位称为页,映射的最小粒度是单个虚拟页到物理页。例如 VA 的一页 0x00000000 - 0x000000ff 被映射为 PA 的一页 0x00008000 - 0x0000080ff,当我们访问的虚拟地址的0x00000000 实际对应到物理地址就是 0x00008000
页帧指的是物理内存中的一页内存,MMU 虚拟地址映射时就是寻找物理页帧的过程。
页表是用来描述MMU的映射规则,也就是 VA 的哪些页映射到 PA 的哪些页,页表的内容就是一条条记录着 PA VA 的映射关系的页表条目(PTE),这个页表保存在片外内存中,当需要映射的关系的时候就去查找这个 pte,但是这样的效率就会大大的降低,速度慢,为解决这个问题就提出了 TLB

TLB(Translation Lookaside Buffers) 转换快表简称为快表,他的作用就是类似于 cache, 可以理解为 MMU 内部专用存放页表的 cache。MMU 在接收到 VA 时,首先在 TLB 中查找,如果找到对应的 PTE 那么直接映射成 PA 。如果没有找到的话,会到外部的片外内存的页表中去查找,并记录到 TLB 中。

一般来说,处理器没有 MMU 的话,他是不可以跑 os 的,MMU 也是为了OS 中复杂的内存管理而产生的。
在系统初始时,会在内存中生成页表,然后把页表的首地址告诉MMU,以便MMU在后期映射工作的时候可以在内存中找到页表的位置。接着启动MMU,此时程序中的所有的内存地址都变成 VA ,MMU 开始自动完成查表和地址映射。在初始化的后期,创建用户进程的时候也需要用到页表,将其地址赋给进程结构体中的某个指针成员变量,也就是说每个进程都要有独立的页表。随着进程的增加,用户在创建新的进程时,子进程会拷贝父进程的页表,页表的内容逐渐更新。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值