嵌入式体系中,存储体系不同很大,可包括多种类型的存储器材,如 FLASH , SRAM , SDRAM , ROM 等,这些不同类型的存储器材速度和宽度等各不相同;在拜访存储单元时,或许采纳平板式的地址映射机制对其操作,或需求运用虚拟地址对其进行读写;体系中,需引进存储维护机制,增强体系的安全性。为习惯如此杂乱的存储体系要求, ARM 处理器中引进了存储办理单元来办理存储体系。
一 内存办理单元( MMU )概述
在 ARM 存储体系中,运用 MMU 完结虚拟地址到实践物理地址的映射。为何要完结这种映射?首要就要从一个嵌入式体系的根本构成和运转办法着手。体系上电时,处理器的程序指针从 0x0 (或许是由 0Xffff_0000 处高端发动)处发动,次序碑文程序,在程序指针( PC )发动地址,归于非易失性存储器空间规模,如 ROM 、 FLASH 等。但是与上百兆的嵌入式处理器比较, FLASH 、 ROM 等存储器呼应速度慢,已成为进步体系功用的一个瓶颈。而 SDRAM 具有很高的呼应速度,为何不运用 SDRAM 来碑文程序呢?为了进步体系全体速度,能够这样想象,运用 FLASH 、 ROM 对体系进行装备,把实在的运用程序下载到 SDRAM 中运转,这样就能够进步体系的功用。但是这种主意又遇到了别的一个问题,当 ARM 处理器呼应反常事情时,程序指针酿制跳转到一个确认的方位,假定发生了 IRQ 间断, PC 将指向 0x18( 假如为高端发动,则相应指向 0vxffff_0018 处 ) ,而此刻 0x18 处仍为非易失性存储器所占有的方位,则程序的碑文仍是有一部分要在 FLASH 或许 ROM 中来碑文的。那么咱们可不行以使程序彻底都 SDRAM 中运转那?答案是必定的,这就引进了 MMU ,运用 MMU ,可把 SDRAM 的地址彻底映射到 0x0 开端的一片接连地址空间,而把本来占有这片空间的 FLASH 或许 ROM 映射到其它不相抵触的存储空间方位。例如, FLASH 的地址从 0x0000_0000 - 0x00ff_ffff, 而 SDRAM 的地址规模是 0x3000_0000 - 0x31ff_ffff ,则可把 SDRAM 地址映射为 0x0000_0000 - 0x1fff_ffff 而 FLASH 的地址能够映射到 0x9000_0000 - 0x90ff_ffff (此处地址空间为闲暇,未被占用)。映射完结后,假如处理器发生反常,假定仍然为 IRQ 间断, PC 指针指向 0x18 处的地址,而这个时分 PC 实践上是从坐落物理地址的 0x3000_0018 处读取指令。经过 MMU 的映射,则可完结程序彻底运转在 SDRAM 之中。
在实践的运用中,或许会把两片不接连的物理地址空间分配给 SDRAM 。而在操作体系中,习惯于把 SDRAM 的空间接连起来,便利内存办理,且运用程序请求大块的内存时,操作体系内核也可便利地分配。经过 MMU 可完结不接连的物理地址空间映射为接连的虚拟地址空间。
操作体系内核或许一些比较要害的代码,一般是不期望被用户运用程序所拜访的。经过 MMU 能够操控地址空间的拜访权限,然后维护这些代码不被损坏。
二 MMU 地址映射的完结
MMU 的完结进程,实践上便是一个查表映射的进程。树立页表( translate table )是完结 MMU 功用不行短少的一步。页表是坐落体系的内存中,页表的每一项对应于一个虚拟地址到物理地址的映射。每一项的长度便是一个字的长度(在 ARM 中,一个字的长度被界说为 4 字节)。页表项除完结虚拟地址到物理地址的映射功用之外,还界说了拜访权限和缓冲特性等。
1 、映射存储块的分类
MMU 支撑依据节或页的存储器拜访, MMU 能够用下面四种巨细进行映射:
节 ( Section ) 构成 1MB 的存储器块
支撑 3 中不同的页尺度:
微页 ( Tiny page ) 构成 1KB 的存储器块
小页 ( Small page ) 构成 4KB 的存储器块
大页 ( Large page ) 构成 64KB 的存储器块
其间关于节映射运用一级转化表就能够了,而关于微页、小页、大页则需求运用两级转化表。
存在主存储器内的转化表有两个等级:
2 、榜首级转化表
(注:本文中的页表与转化表同义)
存储节转化表和指向第二级表的指针。
注: 上图中粗糙页表栏中的最终一项应为‘01 ’
榜首级表的每个进口是一个描绘它所相关的 1MB 虚拟地址是怎样映射的描绘符。见表 3-1 ,依据 bits[1:0] 的组合,有四种或许:
· 假如 bits[1:0]==0b00 ,所相关的地址没有被映射,小事拜访他们将发生一个转化错( fault )。我们他们被硬件疏忽,所以软件能够运用这样的描绘符的 bits[31:2] 做自己的用处。引荐为描绘符持续坚持正确的拜访权限。
· 假如 bits[1:0]==0b10 ,这个进口是它所相关地址的节描绘符。见节描绘符和转化节参阅中的细节。
· 假如 bits[0]==1 ,这个进口给出粗糙第二级表( bit[1]==0 ),或精密第二级表( bit[1]==1 )。
每一种类型的表描绘了它所相关的 1MB 存储区域的映射。粗糙第二级表较小,每个表 1KB ,每个精密第二级表 4KB 。但是粗糙第二级表只能映射大页和小页,精密第二级表能够映射大页、小页和微页。
节描绘符和转化节参阅
l 假如榜首级描绘符是节描绘符,那么各个字段有如下的含义:
Bits[1:0] 描绘符类型标识( 0b10 一共节描绘符)
Bits[3:2] 高速缓存和缓冲位
Bits[4] 由详细完结界说
Bits[8:5] 这个描绘符操控的节的 16 种域之一
Bits[9] 现在没有运用,应该为零
Bits[11:10] 拜访操控,见表 3-3
Bits[19:12] 现在没有运用,应该为零
Bits[31:20] 节基址,构成物理地址的高 12 位
l 假如榜首级描绘符是粗糙页表描绘符,那么各个字段有如下的含义:
Bits[1:0] 描绘符类型标识( 0b01 一共粗糙页表描绘符)
Bits[4:2] 由详细完结界说
Bits[8:5] 这个描绘符操控的页的 16 种域之一
Bits[9] 现在没有运用,应该为零
Bits[31:10] 页表基地址是一个指向第二极粗糙页表的指针,
l 假如榜首级描绘符是精密页表描绘符,那么各个字段有如下的含义:
Bits[1:0] 描绘符类型标识( 0b11 一共精密页表描绘符)
Bits[4:2] 由详细完结界说
Bits[8:5] 这个描绘符操控的页的 16 种域之一
Bits[11:9] 现在没有运用,应该为零
Bits[31:10] 页表基地址是一个指向第二级精密页表的指针,它给出第二级表
拜访的基地址。而第二级精密页表有必要在 4KB 鸿沟对齐。
3 、第二级转化表 存储大页和小页的转化表。一种类型的第二级表存储微页转化表。
每个粗糙第二级表对映着以4KB 为单位的虚拟地址规模市怎样映射的,每个精密第二级表对映着以1KB 为单位的虚拟地址规模市怎样映射的。那些进口是页描绘符,他们能够别离描绘大于4KB 或1KB 的页。在这种情况下,这个描绘符有必要被重复满足次,以确保这个页一直运用相同的描绘符,不管拜访这个页中的哪个虚拟地址。关于一个第二级描绘符,有四种或许,由描绘符的bits[1:0] 挑选。见表3-2 :
· ? 假如bits[1:0]==0b00 ,说相关的虚拟地址没有被映射,任何对这些虚拟地
址的拜访将会导致转化错(fault) 。软件能够运用这样的描绘符的bits[31:2] 做自己的用处,我们他们被硬件疏忽。引荐为描绘符持续坚持正确的拜访权限。
· ? 假如bits[1:0]==0b01 ,这个进口是大页描绘符,描绘64KB 的虚拟地址。
见转化大页参阅。一个大页描绘符在精密第二级表中有必要被重复64 次,在粗
糙第二级表中有必要被重复16 次以确保一切的虚拟地址都被描绘。
· ? 假如bits[1:0]== 0b10 ,这个进口是小页描绘符,描绘4KB 的虚拟地址。
见转化小页参阅。一个小页描绘符在精密第二级表中有必要被重复4 次,以保
证一切的虚拟地址都被描绘。在粗糙第二级表中只要一个实例。
· ? 假如bits[1:0]== 0b11 ,这个进口是微页描绘符,描绘1KB 的虚拟地址。
见转化微页参阅。在精密第二级表中只需求一个微页描绘符的实例。微页描
述符不能在粗糙第二级表中呈现,假如呈现了,成果不行猜测。
大页描绘符字段
大页描绘符的字段有如下含义:
bits[1:0] 一共描绘符的类型
bits[3:2] 高速缓促和缓冲位
bits[11:4] 拜访权限位。这些为操控对页的拜访。关于这些位的解说见表3-3 。
大页被分红4 各子页。
AP0 编码对榜首个子页的拜访权限。
AP1 编码对第二个子页的拜访权限。
AP2 编码对第三个子页的拜访权限。
AP3 编码对第四个子页的拜访权限。
bits[15:12] 现在没有运用,应该为零。
bits[31:16] 用来构成物理地址的对应位。
?
小页描绘符字段
小页描绘符的字段有如下含义:
bits[1:0] 一共描绘符的类型
bits[3:2] 高速缓促和缓冲位
bits[11:4] 拜访权限位。这些为操控对页的拜访。关于这些位的解说见表3-3 。
小页被分红4 各子页。
AP0 编码对榜首个子页的拜访权限。
AP1 编码对第二个子页的拜访权限。
AP2 编码对第三个子页的拜访权限。
AP3 编码对第四个子页的拜访权限。
bits[31:12] 用来构成物理地址的对应位。
微页描绘符字段
微页描绘符的字段有如下含义:
bits[1:0] 一共描绘符的类型
bits[3:2] 高速缓促和缓冲位
bits[5:4] 拜访权限位。这些为操控对页的拜访。关于这些位的解说见表3-3 关于微页的解说。
bits[9:6] 现在没有运用,应该为零。
bits[31:10] 用来构成物理地址的对应位。
MMU 把 CPU 发生的虚拟地址转化成物理地址去拜访外部存储器,一同承继并查看拜访权限。地址转化有四条途径。途径的选取由这个地址是被标记成节映射拜访仍是页映射拜访确认。页映射拜访能够是大、小和微页的拜访。
MMU 的映射分为两种,一级页表的改换和二级页表改换。两者的不同之处便是所完结的改换地址空间巨细不同。一级页表改换支撑 1M 巨细的存储空间的映射,而二级能够支撑 64KB 、 4KB 和 1KB 巨细地址空间的映射。
要完结从虚拟地址到物理地址的映射,必然会遇到一个问题,怎样找到这个页表。关于表的查找,要知道这个表的基地址和偏移地址,在具有 MMU 功用的处理器中,集成了一个被称为 CP15 的协处理器,该协处理器的 C2 寄存器中用于保存页表的基地址,
下面以一级页表改换为例阐明 MMU 完结地址改换的进程。
4 、节拜访的转化进程
节和大页是支撑答应只用一个 TLB 进口去映射大的存储器区间。小页和大页有附加的拜访操控:小页分红 1KB 的子页,和大页分红 16KB 的子页。微页没有子页,对微页的拜访操控是对整个页。
但是,转化进程总是由下面所描绘的那样由榜首级表的获取开端。节映射的拜访只需求读取榜首级表,页映射的拜访还需求读取第二级表。
1 转化表基址
当片上( on-chip )的 TLB 中不包括被要求的虚拟地址的进口时,转化进程被发动。转化表基址寄存器( CP15 的寄存器 2 )保存着榜首级转化表基址的物理地址。只要 bits[31:14] 有用, bits[13:0] 应该是零( SBZ )。所以榜首级表有必要在 16KB 的鸿沟。
2 取榜首级表
转化表基址寄存器的 bits[31:14] 与虚拟地址的 bits[31:20] 和两个 0 位衔接构成 32 为物理地址,如图 3-2 。这个地址挑选了一个四字节的转化表进口,它是榜首级描绘符或是指向第二级页表的指针。
当处理器拜访一个虚拟地址时,该虚拟地址的 [31 : 20] 作为偏移地址与页基地址结合(基地址有必要是 64KB 对齐的,因而基地址的 [13 : 0] 位都为 0 ),得到一个 32 位的页表项地址(我们页表项为 4 字节对齐, [1 : 0] 两位为 0 )。经过这个页表项地址能够检索到该页表项。页表项的格局见前面榜首级转化表。
查找到页表项后,依据页表项的拜访特性(缓冲以及是否答应拜访等)协处理器决议是否答应拜访。如不答应拜访,则协处理器向 CPU 陈述犯错信息;反之,由页表项的 [31 : 20] 位与虚拟地址的 [19 : 0] 一同组成实践的物理地址,完结从虚拟地址到物理地址的映射。如下图所示:
5 、粗糙二级表中的小页转化 假如从榜首级读取到的是二级粗糙页表描绘符,那么会象下图3-7 所示碑文第二级描绘符读取。
6 、精密二级表中的微页转化
假如从榜首级读取到的是二级精密页表描绘符,那么会象图3-5 所示碑文第
二级描绘符读取。
7 、存储器拜访的次序
查找整个转化表的进程叫转化表遍历。它由硬件制动进行,并需求很多的碑文时刻(至少一个存储器拜访,一般是两个)。为了削减存储器拜访的均匀耗费,转化表遍历成果被高速缓存在一个或多个叫作Translation Lookaside Buffers(TLBs) 的结构中。一般在ARM 的完结中每个内存接口有一个TLB 。
因而,当 ARM 要拜访存储器时, MMU 先查找 TLB 中的虚拟地址表,假如 ARM 的结构支撑分隔的地址 TLB 和指令 TLB ,那么它用:
· 取指令运用指令 TLB
· 其它的一切拜访类别用数据 TLB
假如 TLB 中没有虚拟地址的进口,则转化表遍历硬件从存在主存储器中的转化表中获取转化和拜访权限,一旦取到,这些信息将被放在 TLB 中,它会放在一个没有运用的进口处或掩盖一个已有的进口。
一旦为存储器拜访的 TLB 的进口被拿到 , 这些信息将被用于:
1. C (高速缓存)和 B (缓冲)位被用来操控高速缓存和写缓冲,并决议是否高速缓存。(假如体系中没有高速缓存和写缓冲,则对应的位将被疏忽)
2. 拜访权限和域位用来操控拜访是否被答应。假如不答应,则 MMU 将向 ARM 处理器发送一个存储器反常;不然拜访将被答应进行。
3. 对没有高速缓存的体系(包括在没有高速缓存体系中的一切存储器拜访),物理地址将被用作主存储器拜访的地址。对有高速缓存的体系,在高速缓存没有选中的情况下,物理地址将被用行取 (line fetch) 的地址。假如选中了高速缓存,则物理地址将被疏忽。图 3-1 阐明晰这种高速缓存体系
三、协处理器 CP15
MMU 由体系操控寄存器的2 、3 、4 、5 、6 、8 、10 号寄存器和1 号寄存器的一些位操控。
5.1 对协处理器寄存器的操作
ARM 寄存器到协处理器的数据传诵指令和反向传送指令别离为MCR MRC
l MCR
MCR 指令将ARM 处理器的寄存器中的数据传送到协处理器的寄存器中。若协处理器不能成功碑文该操作,将发生未界说指令反常间断。指令格局如下:
MCR{cond} coproc ,opcode1 ,Rd ,CRn ,CRm{ ,opcode2}
其间 coproc 指令操作的协处理器的称号,规范名为pn ,n 为0~15 ,这儿为p15
opcode1 协处理器的特定操作码
Rd 做源的ARM 处理器寄存器
CRn 寄存榜首个操作数的协处理器寄存器
CRm 寄存第二个操作数的协处理器寄存器
opcode2 可选的协处理器操作码
指令举例如下:
MCR p6,2,R7,c1,c2
MCR p7,0,R1,c3,c2,1
l MRC
MRC 指令将协处理器的寄存器中的数据传送到ARM 理器的寄存器中。若协处理器不能成功碑文该操作,将发生未界说指令反常间断。指令格局如下:
MRC{cond} coproc ,opcode1 ,Rd ,CRn ,CRm{ ,opcode2}
其间 coproc 指令操作的协处理器的称号,规范名为pn ,n 为0~15 ,这儿为p15
opcode1 协处理器的特定操作码
Rd 做方针的ARM 处理器寄存器
CRn 寄存榜首个操作数的协处理器寄存器
CRm 寄存第二个操作数的协处理器寄存器
opcode2 可选的协处理器操作码
指令举例如下:
MRC p6,2,R7,c1,c2
MCR p7,0,R1,c3,c2,1
CP15 寄存器 0 , ID 代码及缓存类型
拜访:只读
CP 寄存器 0 包括详细的硬件信息。读拜访内容由 opcode_2 域值确认。对寄存器 0 写入成果无法估计。
将 opcode_2 域置 0 后读寄存器 0 拜访 ID 代码寄存器 。
将 opcode_2 域置 1 后读寄存器 0 拜访缓存类型寄存器。缓存类型寄存器包括缓存巨细与架构信息。
CP15 寄存器 1 ,操控
拜访:读 / 写
CP15 寄存器 1 或或称为操控寄存器包括 ARM920T 操控位
各个操控位的效果:
• M[0]: MMU 使能
0 = MMU 禁用
1 = MMU 使能
• A[1]: 行列毛病使能
0 = 毛病校验禁用
1 = 毛病校验使能
• C[2]: DCache 使能
0 = DCache 禁用
1 = DCache 使能
• B[7]: Endianness
0 = 小 endian 形式
1 = 大 endian 形式
• S[8]: 体系维护
修正 MMU 维护体系
详见 ARM920T 技能参阅手册 Rev. DDI0151C 。
• R[9]: ROM 维护
修正 MMU 维护体系
详见 ARM920T 技能参阅手册 Rev. DDI0151C 。
• I[12]: ICache 操控
0 = ICache 禁用
1 = ICache 使能
• V[13]: 反常寄存器基地址
0 = 低地址,为 0x00000000
1 = 高地址,为 0xFFFF0000
• RR[14]: Round Robin 置换
0 = 随机置换
1 = Round robin 置换
CP15 寄存器 2, TTB
拜访:读 / 写
CP15 寄存器 2 ,或转化表基 (TTB) 寄存器,界说转化表榜首级,用于寄存页表基址
读 CP15 寄存器 2 时,在 bits[31:14] 回来当时活动的榜首级转化表的物理地址, bits[13:0] 不确认。读 CP15 寄存器 2 时, CRm 和操作数 2 被疏忽,并应该是 0 。
写 CP15 寄存器 2 时,在 bits[31:14] 更新当时活动的榜首级转化表的物理地址, bits[13:0] 应该写 0 或从前读回的值。写 CP15 寄存器 2 时, CRm 和操作数 2 被疏忽,并应该是 0 。
CP15 寄存器 3 ,域拜访操控寄存器
拜访:读 / 写
CP 15 寄存器 3 ,或域拜访操控寄存器,界说答应域拜访。
运用 16 域进行 MMU 拜访优先级操控。
寄存器 3 中的每两位对应一个域。
域是节、大页和小页的调集。 ARM 结构支撑 16 个域。对域的拜访由域拜访操控寄存器的两个位字段操控。我们每个字段对拜访对应的域的使能十分敏捷,所以整个存储器区间能很快地交流进出虚拟存储器。这儿支撑 2 种域拜访办法:
客户域的用户(碑文程序,拜访数据),被构成这个域的节或页来监督拜访权限。
办理者操控域的行为(域中的当时节和页,对域的拜访),不被构成这个域的节或页来监督拜访权限。
一个程序能够是一些域的客户,也是别的一些域的办理者,一同没有对其它域的拜访权限。这答应对程序拜访不同存储器资源的十分灵敏的存储器维护。表 3-4 阐明晰域拜访操控寄存器的位编码办法。
(域的效果即关于每一个存储块如节、大页和小页,设置能否拜访这些存储块,或许拜访这些存储块时是否需求进行在转化表中所设置的权限的查看)
CP15寄存器4,保存
对该寄存器的拜访( 读或写) 成果无法预见。
CP15寄存器5,毛病状况寄存器
拜访:读/ 写
读CP 15 寄存器5,或毛病状况寄存器(FSR),回来最终数据毛病源,一共当数据间断呈现时测验拜访的域与类型。
此外,将引起数据间断的虚拟地址写入毛病地址寄存器(CP15 寄存器6)。
写CP 15 寄存器5,或毛病状况寄存器(FSR),设置数据写入时FSR 值。用于调试器康复FSR中值。
Status[3:0]: 毛病类型
阐明毛病类型。当数据间断呈现时由MMU对状况域编码。状况域译码由域名及与数据间断相关的MVA(存于FAR中)确认。
Domain[7:4]: 域
阐明当毛病呈现时拜访的域(D15 – D0)。
当写入时,未界说位为0,读出时成果无法预见。
CP15寄存器6,毛病地址寄存器
拜访:读/ 写
CP 15寄存器6,或毛病地址寄存器(FAR),包括当最终毛病呈现时测验拜访的MVA 。FAR只会因数据毛病而改动,不会因预取毛病改动。
对FAR 的写功用,答应调试器保存一个从前状况。
CP15寄存器7,缓存作业寄存器
拜访: 只写
CP15寄存器7,或缓存作业寄存器,用以办理指令缓存(ICache) 与数据缓存(DCache)。
每个缓存作业功用由pcode_2 及运用写CP15 寄存器7 的MCR 指令的CRm 域选定。
详细内容参照手册。
CP15寄存器8, TLB 作业寄存器
拜访: 只读
CP15寄存器8,或转化后备缓冲器(TLB)作业寄存器,用于办理指令TLB与数据TLB。
运用opcode_2及写CP15 寄存器8 的MCR 指令中的CRm域选定TLB 作业 。
TLB:Translation Lookaside Buffer. 依据功用能够译为快表,直译能够翻译为旁路转化缓冲,也能够把它了解成页表缓冲.晒干寄存的是一些页表文件(虚拟地址到物理地址的转化表).当处理器要在主内存寻址时,不是直接在内存的物理地址里查找的,而是经过一组虚拟地址转化到主内存的物理地址,TLB便是担任将虚拟内存地址翻译成实践的物理内存地址,而CPU寻址时会优先在TLB中进行寻址.处理器的功用就和寻址的命中率有很大的联系.
二,为什么要引进TLB:
映射机制有必要使一个程序能断语某个地址在其自己的进程空间或地址空间内,而且能够高效的将其转化为实在的物理地址以拜访内存.一个办法是运用一个含有整个空间内一切页的进口(entry)的表(即页表),每个进口包括这个页的正确物理地址.这很明显是个相当大的数据结构,因而不得不寄存于主存之中.
我们CPU首要接到的是由程序传来的虚拟内存地址,所以CPU有必要先到物理内存中取页表,然后对应程序传来的虚拟页面号,在表里找到对应的物理页面号,最终才干拜访实践的物理内存地址,也便是说整个进程中CPU有必要拜访两次物理内存(实践上拜访的次数更多).因而,为了削减CPU拜访物理内存的次数,引进TLB.。一般在ARM 的完结中每个内存接口有一个TLB。
· 有一个存储器接口的体系一般有一个仅有的TLB
· 指令和数据的内存接口分隔的体系一般有分隔的指令TLB 和数据TLB
当存储器中的转化表被改动或选中了不同的转化表(经过写CP15 的寄存器2),从前在TLB中的转化表遍历成果将不再有用。MMU 结构供给了改写TLB 的操作。MMU 结构也答应特定的转化表遍历成果被确认在一个TLB 中,这就确保了对相关的存储器区域的拜访绝不会导致转化表遍历,这也对那些把指令和数据确认在高速缓存中的实时代码有相同的优点。
小事用MRC 指令读CP15 寄存器8 的成果不确认。当只要很少数的存储器被从头映射时,无效的单一进口操作能被用来在一些完结中改进功用。对每个被从头映射的存储器区域(节、小页或大页),无效的单一进口需求在存储器区域的虚拟地址上碑文。功用的改进来源于不必从头装载与没有被从头映射的存储器区域相关的TLB 进口。
—当心——
当存储器被从头映射时有必要使与旧的映射相关的TLB 进口无效。假如不这样,或许会进入两个TLB 进口掩盖虚拟地址规模的状况。在最好的情况下拜访这样的掩盖虚拟地址规模会有不行意料的成果;在某些完结中甚至会物理损坏MMU。强烈建议在从头映射存储器时要加倍当心使TLB 适当地失效。
————
CP15寄存器9,缓存上锁寄存器
拜访: 读/ 写
CP15寄存器9,或缓存上锁寄存器,复位时值为0x0。缓存上锁寄存器答应软件操控在ICache或DCache上的缓存线上载入填充。避免在填充时ICache 或 DCache 被驱赶,将其确认在缓存中。
由CP15 寄存器9 读取回来缓存上锁寄存器值,即一切缓存段的基地址指针。只回来[31:26],其它值不行预见。
对CP15 寄存器9 写入更新缓存上锁寄存器,一切缓存段基地址与当时地址指针更新。
CP15寄存器10, TLB 上锁寄存器
拜访: 读/ 写
CP15寄存器10,或 TLB上锁寄存器复位时值为0x0。每个TLB均有一个TLSB上锁寄存器;opcode_2值确认拜访哪个TLB寄存器:
opcode_2 = 0x0 , D TLB 寄存器
opcode_2 = 0x1, I TLB寄存器
转化表遍历的碑文需求必定的时刻,特别当拜访慢速的主存储器时。在实时刻断处理程序中,当TLB 不包括间断处理程序的转化和/或要拜访的数据时,间断推迟回很多加长。
TLB 确认是一些ARM 存储器体系的特性,它答应把特定的转化表遍历的成果装载到TLB 中。这种办法不会被后来的转化表遍历的成果掩盖。由CP15 寄存器10 设定。设 W=LOG2(TLB 进口数),假如需求的话取整(round-up),则CP15 寄存器10 的格局为:
假如详细的完结有分隔的指令和数据TLB,那么有2 个不同的寄存器,由拜访寄存器10 的MCR 或MRC 指令中的opcode2 字段挑选:
opcode2 == 0 挑选数据TLB 确认寄存器
opcode2 == 1 挑选指令TLB 确认寄存器
假如详细的完结只要仅有的TLB,那么只要1 个寄存器,opcode2 字段应该为0。拜访寄存器10 的MCR 或MRC 指令中的CRm 总应该为0。
写寄存器10 有如下成果:
victim 字段一共下次TLB 失利(miss)时,转化表遍历的成果代替哪个TLB 进口。Base 字段包括TLB 替换的战略,只运用从(base)到(TLB 进口-1)的TLB 进口,victim 应该在这个区间。
转化表遍历的成果在写到TLB 进口时,若P==1 则它被维护起来,不能被寄存器8的使整个TLB 失效操作影响;若P==0 则会被那些操作给失效掉。
—注——
假如TLB 的进口不是2 的N 次方,那么写到大于或等于TLB 进口数的TLB 进口的base 或victim 的值将不确认。
———–
读寄存器10 将回来它的值。
CP15寄存器11, 12,保存
对这些寄存器的拜访( 读或写) 成果不行预见。
CP15寄存器13, FCSE PID寄存器
拜访: 读/ 写
CP15寄存器13,或快速前后切换扩展(FCSE)处理标识符(PID) 寄存器,复位时值为0x0。
由CP15 寄存器13读取回来FCSE PID值。
向CP15 寄存器13写入置位FCSE PID。
FCSE PID 设置ARM9TDMI 与缓存存储器MMU 间映射。
ARM9TDMI 地址规模为0 ~ 32 M字节,经过FCSE PID 转化。
CP15寄存器14, 保存
对这些寄存器的拜访( 读或写) 成果不行预见。
CP15寄存器15,测验装备寄存器
CP15寄存器15,或测验装备寄存器用于测验。对该寄存器的拜访( 读或写) 成果不行预见。
四、设置MMU
下面是一个设置MMU进行地址重映射的一个实例
关于实践编程作业而言,主要是确认怎样编写页表中的内容并怎样确认页表项地址。现举例如下:
假定物理地址为0x3000_0000~0x30ff_ffff(1M空间)的一块接连空间需映射为0x0000_0000~0x000f_ffff的一块接连空间:
1.确认页表项中的内容:把物理地址的基地址作为页表项的高12位(31bit~21bit),填写拜访特点。假定能够读写,能够读缓存、写缓冲,这样该页表项内容为0x3000_C00E;
2.确认页表基地址,填写页表基地址到CP15寄存器的C2中。页表的基地址要为64KB对齐,此处为0x305f_c000;
3.计算出偏移地址,把内容填写到页表项地址中。页表项地址=页表基地址+(虚拟地址基地址>>18),如页表基地址为0x305f_c000,那么,页表项地址=0x305f_c000;
4.将页表项数值写到对应的页表项地址中。上例中,需求向地址0x305f_c000中写入0x3000_COOE。
下面是程序的详细完结
;init MMU
;写MMU表到on chip sram from 0x60010000 to 0x60014000
import write_mmu_table
ldr r0,=table ;0x305f_c000
bl write_mmu_table ;
nop
nop
ldr r2,=0x55555555
mcr p15,0x0,r2,c3,c0,0 ;16个域均为0b01,客户形式
nop
nop
nop
nop
ldr r0,=table ;
mcr p15,0x0,r0,c2,c0,0 ;改换表基地址写入cp15 r2
nop
nop
nop
nop
mov r2,#0x7d ;0b0111 1101,使能cache,write buffer,MMU
mcr p15,0x0,r2,c1,c0,0
nop
nop
nop
nop
nop
nop
就这些,mmu初始化完了
write_mmu_table()是c的小程序,往ram写地址转化的描绘
void write_mmu_table(UINT32 *base)
{
UINT32 *p_table;
UINT32 description;
UINT32 i;
p_table = base;
description = 0x3000_C00E; //页表项的值
*p_table = description;
p_table++;
description = 0x31000c10 //下面使除了上面映射地址之外,一切的虚拟地址都为无效
//地址..bits[1:0]==0b00,所相关的地址没有被映射
for (i=1;i<4096;i++)
{
*p_table = description;
description = description +0x00100000;
p_table ++;
}
//return;
}