ARMMMUL1L2页表计算说明剖析doc.docx
- 文档编号:8280099
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:37
- 大小:31.41KB
ARMMMUL1L2页表计算说明剖析doc.docx
《ARMMMUL1L2页表计算说明剖析doc.docx》由会员分享,可在线阅读,更多相关《ARMMMUL1L2页表计算说明剖析doc.docx(37页珍藏版)》请在冰豆网上搜索。
ARMMMUL1L2页表计算说明剖析doc
ARM的存储管理单元MMU知识点介绍1
ARMMMU页表设置计算9
ARM的存储管理单元MMU知识点介绍
由于ARM的MMU知识体系比较庞大,只总结必须知道了解的MMU知识点。
(一)MMU内存管理单元的作用
(1)虚拟存储空间到物理存储空间的映射
(2)存储器访问权限控制
(3)设置虚拟存储空间的缓冲特性
(二)MMU的地址变换的内存块单元
(1)段单元:
按大小为1M的内存块单元为单位进行的虚拟地址物理地址之间的变换。
第1页共47页
(2)大页单元:
按大小为64K的内存块单元为单位进行的虚拟地址物理地址之间的变换。
(3)小页单元:
按大小为4K的内存块单元为单位进行的虚拟地址物理地址之间的变换。
(4)极小页单元:
按大小为1K的内存块单元为单位进行的虚拟地址物理地址之间的变换。
Linux在最初的汇编代码中使用段单元的映射机制来实现MMU的开启。
当Linux系统启动之后采用的是小页单元的映射机制,因
为我们知道Linux把物理内存和虚拟内存的管理是按页来管理的,每个页大小为4k字节。
(三)MMU的地址变换方式
(1)一级页表地址映射
第2页共47页
一级页表地址段映射,是指按1M大小的内存块单元进行的地址映射,查找的过程就是找到页表基地址和当前需要转化的虚拟地址
的高12位为索引的页目录项,由于每个目录项都是4字节对齐的,所以应该为:
页表基地址+虚拟地址高12位X4,从上图中可看出
第3页共47页
一级描述符的地址总是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
(第三步)我们根据需要把该虚拟地址映射到实际的物理地址的需求,来构建一级页表描述符:
第4页共47页
根据图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.
第5页共47页
(2)二级页表地址映射
第6页共47页
二级页表的映射查找过程其实就是,找到页表基地址,然后找到一级描述符,然后通过一级描述符找到二级页表的基地址,然后再找到二级页表的描述符,通过二级页表描述符来找到对应的物理地址基地址。
二级描述符结构:
二级描述符的说明可以参考一级描述符的描述。
第7页共47页
(3)一级,二级页表地址映射的过程图:
目录项和页面表都是存放在内存中的表。
虚拟地址和物理地址的转化就是查找这些表的过程。
第8页共47页
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
第9页共47页
③实际设备看不到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的地址转换图
第10页共47页
第11页共47页
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的转换过程如下:
第12页共47页
①页表基址寄存器位[31:
14]和MVA[31:
20]组成一个低两位为0的32位地址,MMU利用这个地址找到段描述符
②取出段描述符的位[31:
20](段基址),它和MVA[19:
0]组成一个32位的物理地址(这就是MVA对应的PA)
第13页共47页
段地址转换过程
0b11:
细页表(Finepagetable)
[31:
12]为细页表基址(Finepagetablebaseaddress),此描述符的低12位填充0后,就是一个二级页表的物理地址。
此二级页表含1024个条目(使用[11:
2],10位),其中每个条目表示大小1kb的物理地址空间,一个细页表表示1MB物理地址空间
以大页(64KB),小页(4KB)或极小页(1KB)进行地址映射时,需要用到二级页表,二级页表有粗页表、细页表两种,二级页表描述符格式如下:
二级页表描述符
最低两位:
0b00:
无效
第14页共47页
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个条目保存同一个大页描述符
第15页共47页
第16页共47页
大页的地址转换过程(大页描述符保存在粗页表中)
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:
极小页描述符
第17页共47页
[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)
第18页共47页
第19页共47页
极小页的地址转换过程(极小页描述符保存在粗页表中)
从段、大页、小页、极小页的地址转换过程可知
①以段进行映射时,通过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位),用来表示这个域是否进行权限检查
每两位数据的含义
第20页共47页
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,则允许任何访问,不进行权限检查。
如下图:
第21页共47页
一级页表描述符
二级页表描述符
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的对照表
APSR特权模式
用户模式
说明
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
保留
-
-
第22页共47页
3、TLB的作用
从MVA到PA的转换需要访问多次内存,大大降低了CPU的性能,有没有办法改进呢?
程序执行过程中,用到的指令和数据的地址往往集中在一个很小的范围内,其中的地址、数据经常使用,这是程序访问的局部性。
由此,通过使用一个高速、容量相对较小的存储器来存储近期用到的页表条目(段、大页、小页、极小页描述符),避免每次地址转
换都到主存中查找,这样就大幅提高性能。
这个存储器用来帮助快速地进行地址转换,成为转译查找缓存(TranslationLookaside
Buffers,TLB)
当CPU发出一个虚拟地址时,MMU首先访问TLB。
如果TLB中含有能转换这个虚拟地址的描述符,则直接利用此描述符进行地址转换
和权限检查,否则MMU访问页表找到描述符后再进行地址转换和权限检查,并将这个描述符填入TLB中,下次再使用这个虚拟地址时就直接使用TLB用的描述符。
使用TLB需要保证TLB中的内容与页表一致,在启动MMU之前,页表中的内容发生变化后,尤其要注意。
一般的做法是在启动MMU之
前使整个TLB无效,改变页表时,使所涉及的虚拟地址对应的TLB中条目无效。
4、Cache的作用
同样基于程序访问的局部性,在主存和CPU通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的
一部分指令或数据从主存调入这个存储器,供CPU在一段时间内使用,对提高程序的运行速度有很大作用。
这个cache一般称为高速
缓存。
第23页共47页
①写穿式(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)
第24页共47页
系统刚上电或复位时,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功能关闭,Write
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ARMMMUL1L2 计算 说明 剖析 doc