自己学驱动13——内存管理单元MMU(虚拟地址和物理地址)

1.MMU简介

MMU负责完成虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。现代的多用户多进程操作系统通过MMU使得各个用户进程都拥有自己独立的地址空间:地址映射功能使得各个进程拥有"看起来"一样的地址空间,而内存访问权限的检查可以保护每个进程所使用的内存不会被其他进程所破坏。MMU增加了底层的复杂性,但是为上层程序开发提供了极大的方便。

2.虚拟地址与物理地址

虚拟地址最终需要转换为物理地址才能读写实际的数据,这通过将虚拟地址空间、物理地址空间划分为同样大小的一块块空间(称为段或页),然后为这两类小空间建立映射关系来实现。由于虚拟地址空间远大于物理地址空间,有可能多块虚拟地址空间映射到同一物理地址空间,或者有些虚拟地址空间没有映射到具体的物理地址空间(在使用到时再映射)。

ARM CPU上的地址转换过程涉及到3个概念:虚拟地址(VA)、变换后的虚拟地址(MVA)和物理地址(PA)。当没有启动MMU时,CPU核、cache、MMU、外设等所有部件使用的都是物理地址。启动MMU之后,CPU核对外发出虚拟地址VA;VA被转换为MVA供cache和MMU使用,cache和MMU完成MVA到PA的转换;最后使用PA读写具体的实际设备。

(1)CPU核看到的、用到的只是VA(启动MMU之后),VA到PA的转换对于CPU核来说是透明的。

(2)cache和MMU是看不见VA的。

(3)实际设备看不到VA和MVA。

注:MVA是除CPU核外的其他部分看见的虚拟地址。

3.VA和MVA之间的转换

之所以要设置一级VA和MVA之间的转换,是为了提高系统运行的效率。在2440中,VA和MVA之间的转换关系为:如果VA<32M,需要使用进程标识号PID(通过读CP15的C13获得)来转换为MVA,VA与MVA的转换方法如下(由硬件自动完成):

if(VA < 32M) then

MVA = VA | (PID << 25);

else

MVA = VA;

利用PID生成MVA的目的是为了减少切换进程时的代价:不使用MVA而直接使用VA的话,当两个进程的虚拟地址空间VA重叠时(因为对于每个上层应用来说都是拥有独立的4G空间,所以对于VA的使用一般都是从小地址往大地址占用),在切换进程时为了把重叠的VA映射到不同的PA上去,需要重建页表、使无效cache和TLBS等,代价极大。

而使用了MVA之后,切换进程将会简化许多。操作系统中一般小于32M的小进程居多,而真正的大进程反而较少,假设现在有20个小于32M的小进程,有5个超过32M的大进程,那么一共拥有25个不同的PID,这20个小进程会被映射到不同的MVA(因为其均未超过32M),而这5个大进程的低32M的VA也会被映射到不同的MVA,超过的部分会使用到重建页表等来完成映射。

MVA将4G的内存分为2^7=128个32M的空间(PID<<25),如果这128个进程使用的VA都是0~32M之间,则他们的地址都不会重叠,这样在进程切换时付出的代价是极小的。

4.VA到PA的转换过程

将一个虚拟地址转换为物理地址一般有两种方法:第一,使用一个数学公式进行转换;第二,用表格存储虚拟地址对应的物理地址。这类表格被称为页表,页表由一个个条目组成,每个条目存储了一段虚拟地址对应的物理地址及其访问权限,或下一级页表的地址。ARM中使用的是页表方法。

2440最多会用到两级页表:以段(1M)的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表。页的大小有三种:大页(64KB)、小页(4KB)和极小页(1KB)。

大概的转换过程如下:

(1)根据给定的VA找到一级页表中的条目;

(2)如果此条目是段描述符,则返回物理地址,转换结束;

(3)如果此条目是二级页表描述符,继续利用虚拟地址在此二级页表中找到下一个条目;

(4)如果第二个条目是页描述符,则返回物理地址,转换结束;

(5)其他情况出错。

32位的CPU的虚拟地址空间达到4GB,一级页表中使用4096个描述符来表示这4GB空间——每个描述符对应1MB的虚拟地址,要么存储了它对应的1MB物理空间的起始地址,要么存入了下一级页表的地址。MMU根据MVA的[31:20]一共12位来得到这4096个描述符中的一个,每个描述符占用4B,所以一级页表占用了4KB。

根据一级描述符的最低两位,可以分为四种情况。

(1)0b00:无效。

(2)0b01:粗页表。

位[31:10]称为粗页表基址,此描述符的低10位填充0后就是一个二级页表的物理地址。此二级页表含有256个条目(10个bit表示,粗页表占用空间为1KB),粗页表中的每个条目代表4KB的物理地址空间,所以256*4KB=1MB的空间。

(3)0b10:段。

位[31:20]称为段基址,此描述符的低20位填充0之后就是一块1MB物理地址空间的起始地址。MVA[19:0]用于在这1MB空间中寻址。所以描述符的位[31:20]和MVA[19:0]就构成了这个虚拟地址MVA最终对应的PA。

(4)0b11:细页表。

位[31:12]称为细页表基址,此描述符的低12位填充0之后就是一个二级页表的物理地址。此二级页表含1024个条目(每个条目4B,一共占用4KB),其中每个条目代表1KB的物理地址空间,1024*1KB=1MB。

以大页(64K)、小页(4K)或极小页(1K)进行地址映射时,需要用到两级页表。二级页表分为上述的粗页表和细页表两种,根据二级描述符的最低两位,可以分为以下四种情况。

(1)0b00:无效。

(2)0b01:大页描述符。

位[31:16]称为大页基址,此描述符的低16位填充0后就是一块64KB物理地址空间的起始地址。粗页表中每个条目只能表示4KB的物理空间,如果大页描述符保存在粗页表中,则连续16个条目都保存同一个大页描述符。类似的,细页表中每个条目只能表示1KB的物理空间,如果大页描述符保存在细页表中,则连续64个条目都保存同一个大页描述符。

(3)0b10:小页描述符。

位[31:12]称为小页基址,此描述符的低12位填充0后就是一块4KB物理地址空间的起始地址。粗页表中每个条目表示4KB的物理空间,如果小页描述符保存在粗页表中,则只需要用一个条目来保存一个小页描述符。类似的,细页表中每个条目只能表示1KB的物理空间,如果小页描述符保存在细页表中,则连续4个条目都保存在同一个小页描述符中。

(4)0b11:极小页描述符。

位[31:10]称为极小页基址,此描述符的低10位填充0之后就是一块1KB的物理地址空间的起始地址。极小页描述符只能保存在细页表中,用一个条目来保存一个极小页描述符。

5.MVA到PA总结

从段、大页、小页和极小页的地址转换过程可知:

(1)以段进行映射时,通过MVA[31:20]结合页表得到的一段(1MB)的起始物理地址,MVA[19:0]用来在段中寻址。

(2)以大页进行映射时,通过MVA[31:16]结合页表得到一个大页(64KB)的起始物理地址,MVA[15:0]用来在大页中寻址。

(3)以小页进行映射时,通过MVA[31:12]结合页表得到的一个小页(4KB)的起始物理地址,MVA[11:0]用来在小页中寻址。

(4)以极小页进行映射时,通过MVA[31:10]结合页表得到的一个极小页(1KB)的起始物理地址,MVA[9:0]用来在极小页中寻址。

时间: 2024-10-05 00:44:45

自己学驱动13——内存管理单元MMU(虚拟地址和物理地址)的相关文章

自己学驱动14——内存管理单元MMU(二)

1.内存的访问权限检查 内存的访问权限检查是MMU的主要功能之一,简单地说,它就是决定一块内存是否允许读.是否允许写.这由CP15寄存器C3(域访问控制).描述符的域(Domain).CP15寄存器C1的R/S/A位.描述符的AP位等联合作用. CP15寄存器C1中的A位表示是否对地址进行对齐检查,所谓对齐检查就是访问字时地址是否为4字节对齐,访问半字时地址是否2字节对齐,如果地址不对齐则产生"Alignment fault"异常.无论MMU是否被开启,都可以进行对齐检查.CPU读取指

内存管理单元MMU

一. .text .global _start _start: ldr sp, =4*1024 @调用C函数之前,要设置栈指针:栈的作用:保存上下文,传递参数,保存临时变量:因为堆栈向下生长,所以要将栈指针设置到地址空间的顶层:总共可用的只有4K,也就是4*1024 bl close_watchdog @关看门狗 bl mem_ctrl_set @设置存储控制器 bl copy_code_sdram @复制代码到sdram bl set_page @设置页表 bl start_mmu @启动mm

Mini2440内存管理单元MMU

一级页表: TTB base代表一级页表的地址,将它写入协处理器CP15的寄存器C2(称为页表基址寄存器)即可,一级页表的地址是16K对齐,使用[31:14]存储页表基址,[13:0]为0.一级页表使用4096个描述符来表示4GB空间,每个描述符对应1MB的虚拟地址,要么存储它对应的1MB物理空间的起始地址,要么存储下一级页表的地址.使用MVA[31:20]来索引一级页表(2^12=4096个描述符),得到一个描述符,每个描述符占4个字节. 一级描述符低两位: 00:无效(Fault) 01:粗

MMU内存管理单元

arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权.多任务多进程操作系统.(来自百度百科,对其几个点不熟悉,因此可以只考虑加粗部分) 发展历史 注意:学习一个知识点,很重要的一步是了解其为什么而存在?它的存在是为了解决什么问题?然后,在学习的过程中带着这些问题去理解.去思考. 在许多年以前,还是使用DOS或一些古老的操作系

关于内存管理单元须要掌握的相关知识

1.怎样将虚拟地址转换为物理地址, 2.MMU的内存訪问权限机制, 3.TLB,Catch和write buffer原理. ---------- 内存管理单元MMU的功能:将虚拟地址映射到物理地址,并提供内存訪问权限. 没启动MMU时.cpu核.cache,MMU和外设等全部部件使用的都是物理地址. 启动MMU后,cpu核发出虚拟地址.由MVA转换成物理地址供cache和MMU使用. 最后使用物理地址訪问实际设备. 问题: 为什么是从虚拟地址到物理地址的转换. NAND Flash控制器须要掌握

关于内存管理单元需要掌握的相关知识

1.如何将虚拟地址转换为物理地址, 2.MMU的内存访问权限机制, 3.TLB,Catch和write buffer原理. ---------- 内存管理单元MMU的功能:将虚拟地址映射到物理地址,并提供内存访问权限. 没启动MMU时,cpu核,cache,MMU和外设等所有部件使用的都是物理地址. 启动MMU后,cpu核发出虚拟地址,由MVA转换成物理地址供cache和MMU使用. 最后使用物理地址访问实际设备. 问题: 为什么是从虚拟地址到物理地址的转换. NAND Flash控制器需要掌握

SoC软件架构设计之二:内存管理单元的硬件设计实现

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

ARM4412的MMU内存管理单元

由于在裸板驱动的时候要中断>>异常>>MMU MMU是一个内存管理单元,在CP15协处理器里面,而CP15处理器是嵌入在ARM芯片里.功能是将虚拟地址映射到物理地址里面. 在使用MMU寄存器机制之前首先要配置寄存器.将寄存器的功能打开 映射的机制支持段模式1M,小段模式,小页模式(更精细) 000000-------1000000  rom的地址 TLB虚拟地址与物理地址缓存的对应关系 页表的产生:假如将4个G的虚拟地址映射到1G的物理地址,假如有100个线程同时使用表,此时,建立

MMU内存管理单元相关知识点总结

1.MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统. 2.虚拟内存由来:许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序.但随着图形界面的兴起还有用户需求的不断增大,应用程序