ARM MMU L1 L2页表计算说明剖析.docx

上传人:b****3 文档编号:11708371 上传时间:2023-06-02 格式:DOCX 页数:35 大小:344.10KB
下载 相关 举报
ARM MMU L1 L2页表计算说明剖析.docx_第1页
第1页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第2页
第2页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第3页
第3页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第4页
第4页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第5页
第5页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第6页
第6页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第7页
第7页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第8页
第8页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第9页
第9页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第10页
第10页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第11页
第11页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第12页
第12页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第13页
第13页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第14页
第14页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第15页
第15页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第16页
第16页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第17页
第17页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第18页
第18页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第19页
第19页 / 共35页
ARM MMU L1 L2页表计算说明剖析.docx_第20页
第20页 / 共35页
亲,该文档总共35页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

ARM MMU L1 L2页表计算说明剖析.docx

《ARM MMU L1 L2页表计算说明剖析.docx》由会员分享,可在线阅读,更多相关《ARM MMU L1 L2页表计算说明剖析.docx(35页珍藏版)》请在冰点文库上搜索。

ARM MMU L1 L2页表计算说明剖析.docx

ARMMMUL1L2页表计算说明剖析

ARM的存储管理单元MMU知识点介绍

由于ARM的MMU知识体系比较庞大,只总结必须知道了解的MMU知识点。

(一)MMU内存管理单元的作用

(1)虚拟存储空间到物理存储空间的映射

(2)存储器访问权限控制

(3)设置虚拟存储空间的缓冲特性

(二)MMU的地址变换的内存块单元

(1)段单元:

按大小为1M的内存块单元为单位进行的虚拟地址物理地址之间的变换。

(2)大页单元:

按大小为64K的内存块单元为单位进行的虚拟地址物理地址之间的变换。

(3)小页单元:

按大小为4K的内存块单元为单位进行的虚拟地址物理地址之间的变换。

(4)极小页单元:

按大小为1K的内存块单元为单位进行的虚拟地址物理地址之间的变换。

Linux在最初的汇编代码中使用段单元的映射机制来实现MMU的开启。

当Linux系统启动之后采用的是小页单元的映射机制,因为我们知道Linux把物理内存和虚拟内存的管理是按页来管理的,每个页大小为4k字节。

(三)MMU的地址变换方式

(1)一级页表地址映射

一级页表地址段映射,是指按1M大小的内存块单元进行的地址映射,查找的过程就是找到页表基地址和当前需要转化的虚拟地址的高12位为索引的页目录项,由于每个目录项都是4字节对齐的,所以应该为:

页表基地址+虚拟地址高12位X4,从上图中可看出一级描述符的地址总是4字节对齐的,即后两位为0.一级描述符地址中存放的是一级描述符,一级描述符的格式定义如下:

映射实例:

题目:

把内存的地址从0x100000-0x200000空间映射成虚拟地址0xc0100000-0xc0200000的地址空间.

(第一步)根据图1的介绍,我们先把内存虚拟地址右移20位:

Tableindex=(0xc0100000>>20)=0xc01

(第二步)我们打算用内存地址0x4000-0x8000的内存空间内作为存放页表的内存地址。

所以把0x4000写到CP15:

C2寄存器。

注意0x4000正好是16k对齐。

所以这里的一级描述符地址为:

一级描述符地址:

(0x4000+(0xc01<<2))=0x4000+0x3004=0x7004

(第三步)我们根据需要把该虚拟地址映射到实际的物理地址的需求,来构建一级页表描述符:

根据图2,我们为了取得被映射的物理地址基地址,需要将物理地址右移20位:

Sectionbaseaddress=(0x100000>>20)=0x1

AP,Domain,C,B属性在实例中不做设置。

所以最终的一级页表描述符为:

`1cb10’=0b10010=0x12

一级页表描述符=(0x1<<20)+0x12=0x100000+0x12=0x100012

然后把这个0x100012(一级页表描述符)写到一级描述符地址0x7004指向的内存中去。

这样当我们需要访问虚拟内存地址0xc0100000的时候,CPU需要做的事情就是读取C2寄存器,找到页表基地址0x4000,然后根据0xc0100000>>20的index索引找到一级描述符基地址(0x4000+(0xc01<<2)),然后读取这个地址里面的一级描述符:

0x100012,得到段映射的物理基地址0x100012>>20,然后再与虚拟地址的低20位相加,得到对应的物理地址0x100000.

(2)二级页表地址映射

二级页表的映射查找过程其实就是,找到页表基地址,然后找到一级描述符,然后通过一级描述符找到二级页表的基地址,然后再找到二级页表的描述符,通过二级页表描述符来找到对应的物理地址基地址。

二级描述符结构:

二级描述符的说明可以参考一级描述符的描述。

(3)一级,二级页表地址映射的过程图:

目录项和页面表都是存放在内存中的表。

虚拟地址和物理地址的转化就是查找这些表的过程。

 

ARMMMU页表设置计算

内存管理单元简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。

MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访问权限的检查保护每个进程所用的内存不被其他进程破坏。

重点就在于地址映射:

页表的结构与建立、映射的过程。

 

1、S3C2410/S3C2440MMU地址变换过程 

1)地址的分类

一个程序在运行之前,没有必要全部装入内存,仅需要将那些要运行的部分先装入内存,其余部分在用到时从磁盘载入,当内存不足时,再将暂时不用的部分调出到磁盘。

这使得大程序可以在较小的内存空间中运行,也使得内存中可以同时装入更多的程序并发执行,这样的存储器一般称为虚拟存储器。

虚拟地址最终需要转换为物理地址才能读写实际的数据,通过将虚拟地址空间和物理空间划分为同样大小的空间(段或页),然后两个空间建立映射关系。

由于虚拟地址空间远大于物理地址,可能多块虚拟地址空间映射到同一块物理地址空间,或者有些虚拟地址空间没有映射到具体的物理地址空间上去(使用到时再映射)。

 

ARMcpu地址转换涉及三种地址:

虚拟地址(VA,VirtualAddress)、变换后的虚拟地址(MVA,ModifiedVirtualAddress)、物理地址(PA,PhysicalAddress)

没有启动MMU时,CPU核心,cache,MMU,外设等所有部件使用的都是物理地址。

启动MMU后,CPU核心对外发出虚拟地址VA;VA被转换为MVA供cache,MMU使用,在这里MVA被转换成PA;最后使用PA读取实际设备

 

①CPU核心看到和用到的只是虚拟地址VA,至于VA如果去对应物理地址PA,CPU核心不理会

②caches和MMU看不到VA,他们利用MVA转换得到PA

③实际设备看不到VA、MVA,读写它们使用的是物理地址PA

 

MVA是除CPU核心外的其他部分看到的虚拟地址,VA与MVA的变化关系

如果VA<32M,需要使用进程标识号PID(通过读CP15的C13获得)来转换为MVA

 

if(VA <32M)then

     MVA=VA|(PID<<25)

else

     MVA=VA

 

使用MVA,而不使用VA的目的是,当有重叠的VA时,转换为MVA地址并不重叠,减小转换为PA的代价

比如两个进程1、2,VA都是0-(32M-1),则MVA分别为0x02000000-0x03ffffff,0x04000000-0x05ffffff。

下文说到虚拟地址,如果没有特别指出,就是指MVA

 

2)虚拟地址到物理地址的转换过程

 armcpu使用页表来进行转换,页表由一个个条目组成,每个条目存储一段虚拟地址对应的物理地址及访问权限,或者下一级页表的地址

 S3C2440最多会用到两级页表,以段(Section,1M)的方式进行转换时只用到一级页表,以页(Page)的方式进行转换时用到两级页表。

 页的大小有3种:

大页(64KB),小页(4KB),极小页(1KB)。

条目也称为描述符,有:

段描述符、大页描述符、小页描述符、极小页描述符-保存段、大页、小页、极小页的起始物理地址;粗页表描述符、细页表描述符,它们保存二级页表的物理地址。

 

下图为S3C2440的地址转换图

 TTBbase代表一级页表的地址,将它写入协处理器CP15的寄存器C2(称为页表基址寄存器)即可,一级页表的地址是16K对齐,使用[31:

14]存储页表基址,[13:

0]为0

 一级页表使用4096个描述符来表示4GB空间,每个描述符对应1MB的虚拟地址,存储它对应的1MB物理空间的起始地址,或者存储下一级页表的地址。

使用MVA[31:

20]来索引一级页表(20-31一共12位,2^12=4096,所以是4096个描述符),得到一个描述符,每个描述符占4个字节。

一级页表描述符格式如下:

 

一级页表描述符

 

最低两位:

 0b00:

无效

 

 0b01:

粗页表(Coarsepagetable)

     [31:

10]为粗页表基址,此描述符低10位填充0后就是一个二级页表的物理地址,二级页表含256个条目(使用[9:

2],2^8=256个),称为粗页表(Coarsepagetable)。

其中每个条目表示4KB大小的物理地址空间,一个粗页表表示1MB物理地址

 

0b10:

段(Section)

     [31:

20]为段基址,、此描述符低20位填充0后就是一块1MB物理地址空间的起始地址。

MVA[19:

0],用来在这1MB空间中寻址。

描述符的位[31:

20]和MVA[19:

0]构成了这个虚拟地址MVA对应的物理地址

 

以段的方式进行映射时,虚拟地址MVA到物理地址PA的转换过程如下:

①页表基址寄存器位[31:

14]和MVA[31:

20]组成一个低两位为0的32位地址,MMU利用这个地址找到段描述符

②取出段描述符的位[31:

20](段基址),它和MVA[19:

0]组成一个32位的物理地址(这就是MVA对应的PA)

段地址转换过程

 

0b11:

细页表(Finepagetable)

        [31:

12]为细页表基址(Finepagetablebaseaddress),此描述符的低12位填充0后,就是一个二级页表的物理地址。

此二级页表含1024个条目(使用[11:

2],10位),其中每个条目表示大小1kb的物理地址空间,一个细页表表示1MB物理地址空间

 

以大页(64KB),小页(4KB)或极小页(1KB)进行地址映射时,需要用到二级页表,二级页表有粗页表、细页表两种,二级页表描述符格式如下:

 

二级页表描述符

最低两位:

0b00:

无效

 

0b01:

大页描述符

     位[31:

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

类似的,细页表中每个条目只能表示1KB的物理空间,如果大页描述符保存在细页表中,则连续64个条目都保存同一个大页描述符。

下面以保存在粗页表中的大页描述符为例,说明地址转化那过程

①页表基址寄存器[31:

14]和MVA[31:

20]组成一个低两位为0的32位地址,MMU利用这个地址找到粗页表描述符

②取出粗页表描述符的[31:

10](即粗页表基址),它和MVA[19:

12]组成一个低两位为0的32位物理地址,通过这个地址找到大页描述符

③取出大页描述符的[31:

16](即大页基址),它和MVA[15:

0]组成一个32位的物理地址,即MVA对应的PA

步骤②和③中,用于在粗页表中索引的MVA[19:

12]、用于在大页内寻址的MVA[15:

0]有重合的位[15:

12],当位[15:

12]从0b0000变化到0b1111时,步骤②得到的大页描述符相同,所以粗页表中有连续16个条目保存同一个大页描述符

大页的地址转换过程(大页描述符保存在粗页表中)

 0b10:

小页描述符

[31:

12]为小页基址(Smallpagebaseaddress),此描述符的低12位填充0后就是一块4kb([11:

0],一共12位,2^12=4096)物理地址空间的起始地址。

粗页表中每个条目表示4kb的物理空间,如果小页描述符保存在粗页表中,则只需要用一个条目来保存一个小页描述符。

类似的,细页表中每个条目只能表示1kb的物理空间,如果小页保存在细页表中,则连续4个条目都保存同一个小页描述符。

下面以保存在粗页表中的小页描述符为例,说明地址转换过程:

①页表基址[31:

14]和MVA[31:

20]组成一个低两位为0的32位地址,MMU利用这个地址找到粗页表描述符

②取出粗页表描述符[31:

10](即粗页表基址),它和MVA[19:

12]组成一个低两位为0的32位物理地址,用这个地址找到小页描述符

③取出小页描述符的位[31:

12](即小页基址),它和MVA[11:

0]组成一个32位物理地址(即MVA对应的PA)

小页描述符保存在细页表中,地址转换过程和上面类似。

小页的地址转换过程(小页描述符保存在粗页表中)

 

0b11:

极小页描述符

     [31:

10]为极小页基址(Tinypagebaseaddress),此描述符的低10位填充0后就是一块1KB物理地址空间的起始地址。

极小页描述符只能保存在细页表中,用一个条目来保存一耳光极小页描述符

下面是极小页的地址转换过程:

①页表基址寄存器[31:

14]和MVA[31:

20]组成一个低两位为0的32位地址,MMU通过这个地址找到细页表描述符

②取出细页表描述符[31:

12](即细页表基址),它和MVA[19:

10]组成一个低两位为0的32位物理地址,通过这个地址即可找到极小页描述符

③取出极小页描述符[31:

10](即极小页基址),它和MVA[9:

0]组成一个32位的物理地址(即MVA对应的PA)

 

极小页的地址转换过程(极小页描述符保存在粗页表中)

 

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

①以段进行映射时,通过MVA[31:

20]结合页表得到一段(1MB)的起始物理地址,MVA[19:

0]用来在段中寻址

②以大页进行映射时,通过MVA[31:

16]结合页表得到一个大页(64KB)的起始物理地址,MVA[15:

0]用来在小页中寻址

③以小页进行映射时,通过MVA[31:

12]结合页表得到一个小页(4KB)的起始物理地址,MVA[11:

0]用来在小页中寻址

④以极小页进行映射时,通过MVA[31:

10]结合页表得到一个极小页(1KB)的起始物理地址,MVA[9:

0]用来在极小页中寻址

 

2、内存的访问权限检查

它决定一块内存是否允许读、是否允许写。

这由CP15寄存器C3(域访问控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位共同决定。

“域”决定是否对某块内存进行权限检查,“AP”决定如何对某块内容进行权限检查。

S3C2440有16个域,CP15寄存器C3中每两位对应一个域(一共32位),用来表示这个域是否进行权限检查

每两位数据的含义

00:

无访问权限(任何访问都将导致“Domainfault”异常)

01:

客户模式(使用段描述符、页描述符进行权限检查)

10:

保留(保留,目前相当于“无访问权限”)

11:

管理模式(不进行权限检查,允许任何访问)

Domain占用4位,用来表示内存属于0-15,哪一个域

例如:

①段描述符中的“Domain”为0b0010,表示1MB内存属于域2,如果域访问控制寄存器的[5:

4]等于0b00,则访问这1MB空间都会产生“Domainfault”异常,如果等于0b01,则使用描述符中的“Ap”位进行权限检查

②粗页表中的“Domain”为0b1010,表示1MB内存属于域10,如果域访问控制寄存器的[21:

20]等于0b01,则使用二级页表中的大页/小页描述符中的"ap3"、"ap2"、"ap1"、"ap0"位进行权限检查,如果等于0b11,则允许任何访问,不进行权限检查。

如下图:

 

一级页表描述符

二级页表描述符

 

AP、ap3、ap2、ap1、ap0结合CP15寄存器C1的R/S位,决定如何进行访问检查。

段描述符中AP控制整个段(1MB)访问权限;大页描述符每个apx(0-3)控制一个大页(64KB)中1/4内存的访问权限,即ap3对应大页高端的16KB,ap0对应大页低端的16KB;小页描述符与大页描述符类似,每个apx(0-3)控制一个小页(4KB)的1/4内存的访问权限;极小页中的ap控制整个极小页(1KB)的访问权限。

下表为AP、S、R的对照表

AP

S

R

特权模式

用户模式

说明

00

0

0

无访问权限

无访问权限

任何访问将产生“Permissionfault”异常

00

1

0

只读

无访问权限

在超级权限下可以进行读操作

00

0

1

只读

只读

任何写操作将产生”Permissionfault“异常

00

1

1

保留

-

-

01

x

x

读/写

无访问权限

只允许在超级模式下访问

10

x

x

读/写

只读

在用户模式下进行写操作将产生"Permissionfault"异常

11

x

x

读/写

读/写

在所有模式下允许任何访问

xx

1

1

保留

-

-

 

 3、TLB的作用

从MVA到PA的转换需要访问多次内存,大大降低了CPU的性能,有没有办法改进呢?

程序执行过程中,用到的指令和数据的地址往往集中在一个很小的范围内,其中的地址、数据经常使用,这是程序访问的局部性。

由此,通过使用一个高速、容量相对较小的存储器来存储近期用到的页表条目(段、大页、小页、极小页描述符),避免每次地址转换都到主存中查找,这样就大幅提高性能。

这个存储器用来帮助快速地进行地址转换,成为转译查找缓存(TranslationLookasideBuffers,TLB)

当CPU发出一个虚拟地址时,MMU首先访问TLB。

如果TLB中含有能转换这个虚拟地址的描述符,则直接利用此描述符进行地址转换和权限检查,否则MMU访问页表找到描述符后再进行地址转换和权限检查,并将这个描述符填入TLB中,下次再使用这个虚拟地址时就直接使用TLB用的描述符。

使用TLB需要保证TLB中的内容与页表一致,在启动MMU之前,页表中的内容发生变化后,尤其要注意。

一般的做法是在启动MMU之前使整个TLB无效,改变页表时,使所涉及的虚拟地址对应的TLB中条目无效。

 

4、Cache的作用

同样基于程序访问的局部性,在主存和CPU通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,对提高程序的运行速度有很大作用。

这个cache一般称为高速缓存。

①写穿式(WriteThrough)

任一CPU发出写信号送到Cache的同时,也写入主存,保证主存的数据同步更新。

优点是操作简单,但由于主存速度慢,降低了系统的写速度并占用了总线的时间。

②回写式(WriteBack)

数据一般只写到Cache,这样可能出现Cache中的数据得到更新而主存中的数据不变(数据陈旧)的情况。

此时可在Cache中设一个标志地址及数据陈旧的信息,只有当Cache中的数据被换出或强制进行”清空“操作时,才将原更新的数据写入主存响应的单元中,保证了Cache和主存中数据一致。

 

Cache有以下两个操作:

①”清空“(clean):

把Cache或Writebuffer中已经脏的(修改过,但未写入主存)数据写入主存

②”使无效“(Invalidate):

使之不能再使用,并不将脏的数据写入主存。

 

S2C2440内置了指令Cache(ICaches)、数据Cache(DCaches)、写缓存(Writebuffer),需要用到描述符中的C位(Ctt)和B位(Btt)

1)指令Cache(ICaches)

系统刚上电或复位时,ICaches中的内容是无效的,并且ICaches功能关闭。

往Icr位(CP15协处理器中寄存器1的第12位)写1可以启动ICaches,写0停止ICaches

ICaches一般在MMU开启后使用,此时描述符的C位用来表示一段内存是否可以被Cache。

若Ctt=1,允许Cache,否则不允许。

如果MMU没有开启,ICaches也可以被使用,此时CPU读取指令时所涉及的内存都被当做允许Cache

ICaches关闭时,CPU每次取指都要读取主存,性能低,所以通常尽早启动ICaches

ICaches开启后,CPU每次取指时都会先在ICaches中查看是否能找到所用指令,而不管Ctt是0还是1。

如果找到成为Cache命中,找不到称为Cache丢失,ICaches被开启后,CPU的取指有如下三种情况:

①Cache命中且Ctt为1时,从ICaches中取指,返回CPU

②Cache丢失且Ctt为1时,CPU从主存中取指,并且把指令缓存到Cache中

③Ctt为0时,CPU从主存中取指

2)数据Cache(DCaches)

与ICaches相似,系统刚上电或复位时,DCaches中的内容无效,并且DCaches功能关闭,Writebuffer中的内容也是被废弃不用的。

往Ccr位(CP15协处理器中寄存器1的第二位)写1启动DCaches,写0停止DCaches。

Writebuffer和DCaches紧密结合,额米有专门的控制来开启和停止它

与ICaches不同,DCaches功能必须在MMU开启之后才能被使用。

DCaches被关闭时,CPU每次都去内存取数据。

DCaches被开启后,CPU每次读写数据时都会先在DCaches中查看是否能找到所要的数据,不管Ctt是0还是1,找到了成为Cache命中,找不到成为Cache丢失。

通过下表可知DCaches和Writebuffer在Ccr,Ctt,Btt各种取值下,如何工作,CttandCcr意为Ctt与Ccr进行逻辑与后的值

 

CttandCcr

Btt

DCaches、Writebuffer和主存的访问方式

0

0

Non-cached,non-buffered(NCNB)

读写数据时都是直接操作主存,并且可以被外设中止;

写数据时不使用Writebuffer,CPU会等待写操作完成;

不会出现Cache命中

0

1

Non-Cachedbuffered(NCB)

读数据时都是直接操作主存;

不会出现Cache命中;

写数据时,数据线存入Writebuffer,并在随后写入主存;

数据存入Writebuffer后,CPU立即继续执行;

读数据时,可以被外设中止;

写数据时,无法被外设中止

1

0

Cached,write-through(写通)mode

读数据时,如果Cache命中则从Cache中返回数据,不读取主存;

读数据时,如果Cache丢失则从读主存中返回数据,并导致“linefill”的动作;

写数据时,数据先存入Writebuffer,并在随后写入主存;

数据存入Writebuffer后,CPU立即继续执行;

写数据时,如果Cache命中则新数据也写入Cache中;

写数据时,无法被外设中止

1

1

Cached,write-back(写回)mode

读数据时,如果Cache命中则从Cache中返回数据,不读取主存;

读数据时,如果Cache丢失则从读主存中返回数据,并导致“linefile”的动作;

写数据时,如果Cache丢失则将数据先存入Writebuffer,存储完毕后CPu立即继续执行,这些数据在随后写入主存;

写数据时,如果Cache命中则在Cache中更新数据,并设置这些数据为”脏的“,但是不会写入主存;

无论Cache命中与否,写数据都无法被外设中止

 使用Cache时需要保证Cache、Writebuffer的内容和主存内容一致,保证下面两个原则:

①清空DCaches,使主存数据得到更新

②使无效ICaches,使CPU取指时重新读取主存

在实际编

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2