ARM存储器结构 ARM架构的处理器的存储器寻址空间有4G字节 ,存储空间可以分为 : -可快存/可缓冲(Cacheable/Bufferable)区域 -不可快存/不可缓冲区域
ARM架构的处理器,有的带有指令快存(I-Cache)和数据快存(D-Cache),片内都不带有片内RAM和片内ROM。系统所需的RAM和ROM(包括闪存FLASH)都通过总线处接;由于系统的地址范围较大(232=4G字节),故有的片内还带有存储器管理单元MMU(Memory Management Unit)
本节课主要内容 缓冲存储器(Cache) 存储器管理 系统控制协处理器CP15
3.1 缓冲存储器(Cache)
什么是 cache? 位于处理器中的少量高速缓冲存储器, 保存最近被访问的存储空间内容的备份 依赖于内存的重使用 哪些存储空间需要读入到cache中,要通过MMU 或 MPU来控制 依赖于内存的重使用 仅用来改善速度较慢的存储器或总线宽度较窄的存储器的性能 降低对总线宽度的要求 减少功耗 外部 存储器 CPU Cache 总线 接口 地址 数据
带Cache的 ARM 宏单元举例 JTAG 及非AMBA信号 AMBA 总线 接口 CP15 ARM 控制逻辑 内核 MMU 或 MPU 地址 MMU 或 MPU 写缓冲 AMBA 总线 接口 数据 AMBA 接口 地址 数据写 数据读 Cache
ARM 快存(Cache)结构 快存Cache是一种小容量,高速度的存储器,用于处理器与主存储器之间,存放当前被使用的主存部分内容,以减少访问主存的等待时间 常用的Cache有指令和数据统一的Cache和指令和数据分离的I-Cache与D-Cache。新型的ARM架构处理器较多采用了 I-Cache与D-Cache的独立块存结构,如Intel公司的SA1110处理器内含16K字节I-Cache和8K字节D-Cache
统一Cache的结构示意图
分离Cache的结构示意图
Cache 的用法 数据以每次传送一行的方式复制到cache 中 在一个cache 读操作不命中后,将激发cache 行内容的填充 这一处理就是大家所知的数据流动 在一个cache 读操作不命中后,将激发cache 行内容的填充 但新数据应放在cache 的什么位置? ARM 处理器支持以下置换策略中的一个或多个: 随机, 循环轮换 轮换指针指向下一个要填充的cache 行 已经使用过的行将被收回和替换 对回写数据cache而言, 任何改过的数据都要写到存储器中
结合性 简单cache,采用直接映射策略 块结合cache,减少位置竞争 一个特殊的存储器数据项被存放在cache 的某个特定位置。 实施简单,执行快捷 块结合cache,减少位置竞争 一个特殊的存储器数据项被存放在cache 的许多位置 如果一个特殊的存储器数据项被存放在cache中的‘n’ 个位置,那么可以说cache是n维的 实施较复杂,需要更多的比较硬件
直接映射 Cache 主存储器 0x0000 0x0010 0x0020 0x0030 0x0040 0x0050 0x0060 0x0070 0x0080 0x0090 Cache 00..................................01 10 01 0x0064 00 tag index word 地址 tag ram 数据 =
直接映像的方式是给定的内存块仅能放在一个特定的Cache块中。可用若干低位地址直接访问Cache项,其余的高位地址与Cache项中的地址标识(tag)进行比较。若比较相等且有效位为“1”,则为“命中”。这是最简单的放置算法 优点:访问Cache速度快,实现简单; 缺点:当处理器轮流使用两个或多个块,而这些块又都映像在同一Cache项时,命中率会急速下降
2-维块结合 Cache 2-Way, 4 Sets = 替换策略: 随机 循环 最近最少使用 (LRU)† ? 目标 计数器 主存储器 0x0000 0x0010 0x0020 0x0030 0x0040 0x0050 0x0060 0x0070 0x0080 0x0090 Way 0 Way 1 Set 0 2-Way, 4 Sets ? 数据 = tag index 目标 计数器 替换策略: 随机 循环 最近最少使用 (LRU)† †:当前ARM处理器未用
2-维块结合 Cache也使用低位地址直接访问Cache项,但它选中的是一个组,组内包含有两块。给定的内存块可以放在选中组中的任意一块内。选中一组后,组内所有项的标识同时进行比较,如果有一个匹配,则“命中”。 2-维块结合 Cache实际上是靠比较器的个数(2个)及增宽Cache位来降低Cache块的冲突
图中的Cache为8K字节,每行16字节,分为二个组直接映像Cache,每个为256行。32位地址中的4位作为行内的字节选择,索引(index)只需8位,其余的高20位作为地址标识。 2-维块结合 Cache是通过“单体多字存储器”来并行查询,二路组相联即通过单体双字存储器来查询,有2个比较器。在Intel 公司的SA-1110处理器中,512字节的微型数据快存采用了此方式,其每行为32字节,共有16行
若干定义 Line: 行, cache的最小可装载单元 – 任何情况下都是存储器中一个连续的字块。 Tag: 标签,存放在cache 中的存储器地址的一部分,用来识别定位在那里的特定的物理地址。 Set: 块,一组行,用来保持来自特定存储器空间的数据。 Way: 维,一个块所含行的数量,就是cache 的维数。 Index:索引,存储器地址的一部分,它决定可以存储cache 行的块。
4-维块结合 Cache 地址 存于 TAG中的地址 (22 位) Index Word Unused 3 5 Cache 行 v 注: 31 10 9 5 4 2 1 0 3 5 Cache 行 1 2 3 4 5 6 7 d0 d1 Decoder Decoder v d0 d1 TAG Data Decoder Decoder Line 0 注: 每一个地址索引映射到一个cache 行,该行可存于4维的任意一维中(4维结合) Line 1 Line 30 Line 31 way 0 这里是一个4k cache 的例子: 4 ways x 32 lines (sets) x 8 words = 4kb cache v- 有效位 d0,d1 – 脏位
64-维块结合 Cache 地址 存于 TAG中的地址(25 位) Index Word Unused 2 3 Cache line 31 7 6 5 4 2 1 0 2 3 Cache line 7 6 5 4 3 2 1 d0 d1 TAG Data Line 0 Line 1 注: 每个地址索引映射到单一的块,每个块可以存储64不同的地址标签 (64 ways holding 4 lines). Line 62 Line 63 Set 0 Decoder 这里是 ARM922T的例子: 4 sets x 64 lines (ways) x 8 words = 8kb cache 用内容设定地址的存储器 (CAM)
上图采用的方式是给定的主存块可以放在Cache的任意一块中,用内容寻址存储器CAM(Content Addressed Memory)来实现,送来的地址与Cache所有项中的地址标识作比较,以判断是否“命中”。 优点:有较高的命中率; 缺点:CAM的访问速度比较慢,且会占用较大的芯片面积
替换算法 当发生Cache不命中时,必须选择被替换的项。常用的算法有: 随机法 近期最少使用LRU(Least Recently Used)法 循环(Round-robin)法
1、随机法 从Cache中的各行中随机选取一行进行淘汰,可选择一随机事件作为替换的依据,如可用系统实时时钟的低几位。 2、近期最少使用LRU法 Cache控制器设置访问标识,以记录数据在某一段时间内被访问的次数,当需要淘汰时,则淘汰近期最少使用的那一行。 3、循环法 此方法类似于先进先出FIFO法,Cache 控制器设置特殊的时间标识,以记录数据在Cache中存放时间,当需要淘汰时,则淘汰进入Cache时间最长的那一行。 循环法结构简单,速度快,ARM架构的处理器大多采用该淘汰算法。
锁操作 循环法对Cache中代码或数据不分常用还是非常用的,都一样地参与循环淘汰,很明显该淘汰替代算法的效率不及LRU法。为了弥补次不足,ARM架构中许多高性能处理器核采用了锁操作。 在一些常用的代码或数据加上锁放入指令Cache或数据Cache中,免于频繁地淘汰替代,从而可提高系统的效率。但是,锁操作也会给Cache带来了一些缺陷,无形之中缩小了相应Cache的容量;故需及时对已上锁的目前不常用的代码或数据解锁
Cache 闭锁 (1) 部分cache 可能闭锁以避免被清除 可能在需要保证实时性能时使用 需要一个短的子程序来控制行填充 其间隔尺度随着内核的不同而变化 可能在需要保证实时性能时使用 需要一个短的子程序来控制行填充 提供了例子程序 目标计数器范围受限 (cp15之r9) 闭锁行可免于替换 仍可被‘冲洗’ - 那么闭锁机制肯定被清除了
Cache闭锁 (2) 这是一个4维结合的cache,每维包含32 行 (块). 单一的目标计数器选择将要替换的维. Victim Counter Data way 2 TAG Line 0 Line 1 Line 30 Line 31 闭锁行 way 0 way 1 way 3 这是一个4维结合的cache,每维包含32 行 (块). 单一的目标计数器选择将要替换的维. 闭锁固定了计数器的基值所以该值以下的通道完全免于替换. 闭锁具有一维的间隔尺寸 (1/4的cache大小).
Cache闭锁 (3) 这是一个64维,4个块的结合cache. 单一的目标计数器选择将要替换的维(每个块中相同数字的行). 闭锁行 (通道) 这是一个64维,4个块的结合cache. 单一的目标计数器选择将要替换的维(每个块中相同数字的行). 闭锁固定了计数器的基值所以该值以下的块完全免于替换. 闭锁具有一行的间隔尺寸 (1/64的cache大小). TAG Data TAG Data TAG Data TAG Data Line 0 Line 0 Line 0 Line 0 Line 1 Line 1 Line 1 Line 1 Line 62 Line 62 Line 62 Line 62 Line 63 Line 63 Line 63 Line 63 set 0 set 1 set 2 set 3 Victim Counter
Cache Flushing 保存在cache中的信息将优先与存储器相联系。但并不总是希望如此 因此需要一种机制来“刷新”cache 如果使用了自修改的代码 如果MPU或MMU 被重新编程 因此需要一种机制来“刷新”cache 当 cache 被刷新时, cache 行将被标记为无效,然后被重新使用 另外,数据cache可能含有‘脏数据’ ,所以要通过分别操作将数据写回存储器 Cache清理和刷新由CP15指令来实现
时钟 固化宏单元内核(硬核) 可合成内核(软核) 硬核 (例如 ARM920T, ARM940T) 有两个时钟输入,提供了灵活的时钟配置方法 BCLK AMBA 总线时钟, 为所有的外部总线提供时钟 只有在配置为‘快速总线’时才用于内核 FCLK 当配置为‘同步’或‘异步’时钟模式,没有外部总线活动时为内核提供时钟 可合成内核(软核) 可综合内核(例如. ARM946E-S, ARM966E-S, ARM926EJ-S)只有单个时钟输入 单个时钟输入作为CLK信号 HCLKEN 是第二个输入,用来生成总线时钟输出 (HCLK) HCLK 必须能被 CLK整除
同步模式 (固化宏单元 FastBus Synchronous Asynchronous 内核及外部总线由BCLK同步. FCLK ignored Synchronous FCLK 的频率必须比 BCLK.高 BCLK 只可以在FCLK 为高期间改变. ASB操作需 BIU与 BCLK 同步. 最大1 个BCLK 周期的同步延迟. BCLK FCLK Asynchronous FCLK的频率必须比 BCLK.高. 二者相位关系没有限制. ASB操作需 BIU与 BCLK 同步. 最大1.5个 BCLK 周期的同步延迟. BCLK FCLK
写缓冲器 (1) 用于消除内核和存储器速度不匹配的影响 存储器访问总是以正确的顺序出现 数据进入缓冲器时是按内核的速度 数据写到存储器时按总线的速度 存储器访问总是以正确的顺序出现 在非cache读, 非缓冲写和cache 行填充时,写缓冲总是首先被排空 有一个特定的排空写缓冲操作 内部数据总线 数据寄存器 总线接口单元 d7 d6 d5 d4 d3 d2 d1 d0 内核时钟 总线时钟 a3 a2 a1 a0 内部地址总线 地址寄存器
写缓冲器(2) 写操作出现以下情况时处理器将停顿: 如果写缓冲在软件的控制下被排空(通过CP15),处理器将停止执行 写缓冲器满 写缓冲器被禁用 写到不可用作缓冲的区域 在写非缓冲区之前写缓冲器将被排空 如果写缓冲在软件的控制下被排空(通过CP15),处理器将停止执行 在写缓冲的时候不能产生异常中断 异常中断将被忽略
存储器写策略 1.写直达(Write-through) 当要写Cache时,数据同时写回主存储器。 2.通过缓存写直达 由于数据直接写回主存储器速度较慢,会影响处理器的效率。因此,先可高速把数据写至缓存,在下一个操作时再把数据送至主存储器。若有两次连续的写,处理器仍要等待。 3.写回(Write-back) 写回(有时也称Copy-back)是当处理器更新Cache的某一行后,相应间数据并不立即写回主存储器单元,而当该行被从Cache淘汰时,才把数据写回主存储器中。
Cache 写策略 Write Back: Write Through: 访问模式 非 cache, 非缓冲 GCd GBd 非 cache, 可缓冲 1 WT, 直写 WB, 回写 直写: 如果位置在cache之内, cache 将被更新. 数据也通过写缓冲送至存储器. 回写: 如果位置在cache之内,只有 cache 被更新. 注: 如果数据位置不在cache之内, 数据将被直接写到存储器中。如果存储器是可cache或可缓冲的,写缓冲将被使用 。 CPU Cache 写缓冲 外部存储器 wb wt CPU Cache Write Buffer Access Mode Non cacheable, non bufferable GCd GBd Non cacheable, bufferable 1 WT, Write Through WB, Write Back External Memory Write Through: If location is within the cache, the cache is updated. Write is also sent to memory via the Write Buffer Write Back: If location is within the cache, only the cache is updated CPU Cache Write Buffer Access Mode Non cacheable, non bufferable GCd GBd Non cacheable, bufferable 1 WT, Write Through WB, Write Back External Memory CPU Cache Write Buffer Access Mode Non cacheable, non bufferable GCd GBd Non cacheable, bufferable 1 WT, Write Through WB, Write Back External Memory
ARM的Cache设计 为了提高处理器的效率,ARM架构一般采用多维块结合 Cache方式 ARM7处理器核采用了4-维块结合 Cache方式 ;SA1110、ARM9与ARM10则采用了32/64-维块结合 Cache方式 Cache也可以减少与主存储器访问的带宽,而主存储器访问的功耗也要比Cache访问的功耗来得大,故Cache的维数提高,也能进一步降低功耗
Cache性能改善路径 降低失效(miss)率(即提高命中率) 减少失效开销 减少命中时间
降低Cache失效率 提高相联度来减少冲突失效。 产生Cache失效原因有强制性失效(需从主存储器调入Cache)、容量失效(所需的块(行)不能全部调至Cache)和冲突失效(某块(行)被替换,后又被重新访问)。在ARM架构中采用以下方法来改进: 增加Cache中行(块)的大小来减少强制性失效。 据统计分析,对于16K字节以下Cache,每行32/64字节失效率最低;大于16K字节的Cache,每行64/128字节,失效率最低。增加每行的容量,有时反而会增加访问Cache时间。因此,ARM架构较多采用每行32字节。 提高相联度来减少冲突失效。 ARM架构处理器大多数都采用多维块结合 Cache方式机制,即使是最简单的ARM720T处理器核也采用了4-维块结合 Cache方式 。 硬件预取技术 预取建立可利用存储器的空闲频带(若不使用,也是浪费),指令/数据的预取,可以大大提高Cache命中率。
减少Cache失效开销 ARM架构采用了非阻塞(nonblocking)Cache技术。Cache在失效时,仍然允许处理器进行其他命中的访问。这种“失效下命中”(hit under miss)不是完全拒绝处理器的访问,而是能处理部分访问,从而减少了实际的Cache失效开销。 此外,还可以采用“让读失效优于写”和二级Cache技术来减少Cache失效开销。
减少命中时间 Cache命中时间会影响到处理器的时钟频率。在许多处理器设计中,往往是Cache的访问时间限制了处理器的时钟频率。因此,减少Cache命中时间,不但可提高Cache性能,还能提高系统运行速度。 很明显容量小,结构简单的Cache可以有效提高Cache访问速度,缩短命中时间。但是随着ARM架构的新能提高,Cache的容量也不断在增加。因此,有的ARM架构处理器采用了虚拟Cache,Cache中直接用虚拟地址来访问,以减少虚拟地址的转换时间。当然虚拟Cache会产生同义(Synonym)问题,ARM架构通过增加了进程标识符(Process ID)来解决此问题。
本节课主要内容 缓冲存储器(Cache) 存储器管理 系统控制协处理器CP15
3.2 存储器管理
存储器管理 存储器保护单元 (MPU) 将存储空间分割为带有可编程特权的独立的区域 设置简单 节省功耗和芯片面积 不支持虚拟内存 无可用于页表的内存 ARM940T是一例带有MPU的ARM 内核 (不作详细介绍) 内存管理单元 (MMU) 提供更多灵活的动态的存储器控制,连同更强大的特权配置 设置复杂 通过页表支持虚拟内存 ARM920T是一例带有MMU的ARM 内核
编程模式 内核通过写CP15 的寄存器来配置 定义在 CP15 中的寄存器只能用MCR 和 MRC 指令访问. cache, 保护单元, 及其他系统操作象大端或小端模式配置. 定义在 CP15 中的寄存器只能用MCR 和 MRC 指令访问. MCR/MRC{cond} p15,opcode_1,rd,cn,cm,opcode_2 p15 – 指定协处理器 15 opcode_1 – 总是为0 rd - ARM 源或目的寄存器 cn - CP15 主寄存器 cm – 附属寄存器名 opcode_2 - 可选的 3比特数用来指定附加信息 其他协处理器指令 (CDP,LDC,STC)或在非特权模式使用 MCR/MRC访问CP15 将导致未定义指令异常.
保护单元(PU) 用于分割存储器 在保护单元使能之前至少有一个数据存储区和一个指令存储区被定义 区块可以具有单独的cache属性 每个区块可以具有不同的访问设置,例如仅为特权模式 区块的大小和基地址是可选的 可以是分开的数据区和指令区(哈佛结构) 在保护单元使能之前至少有一个数据存储区和一个指令存储区被定义 区间的大小是可变的,典型值是4KB 到 4GB 区块的边界值必须等于其大小的整数倍 保护单元必须在cache使能之前有效
保护区域举例 注: 指令区必须有定义为允许文字池访问的相应数据区. 可以设定可重叠的背景区(Background ). 指令区域图 数据区域图 只读 可Cache Flash 0x25FFFFFF Flash 只读 可Cache Background Background 0x24000000 0x1FFFFFFF 读写 不可cache 不可缓冲 Peripherals 0x10000000 读写 可Cache 可缓冲 只读 可Cache 0x0003FFFF SRAM SRAM 0x00000000 注: 指令区必须有定义为允许文字池访问的相应数据区. 可以设定可重叠的背景区(Background ).
MPU 配置步骤 参照你的目标系统定义和使能保护寄存器 为每个存储区域设定可用于cache或可用于缓冲的属性 为每个存储区域设定访问许可 CP15之 c6 为每个存储区域设定可用于cache或可用于缓冲的属性 CP15之c2和 c3 为每个存储区域设定访问许可 CP15 之c5 使能cache, 设置时钟同步模式,并使能MPU CP15 之c1 其他内核缺省值,象数据存放模式,向量表的位置等都通过c1 设置
存储器管理单元(MMU) 系统中可能包括多种类型的存储器件(flash、rom、sram、sdram) 内存映射技术实现虚拟空间到物理空间的映射 引入存储保护机制,增强系统的安全性 引入一些机制保证将I/O操作映射成内存操作后,各种I/O操作能够得到正确的结果
什么是 MMU 内存管理单元 MMU 的组成 如果MMU 被禁用了 控制存储器的访问权限 将虚拟地址转换为物理地址 后备变换缓冲器 (TLB) 最近用于页变换的cache 页表浮动硬件逻辑 更新 TLB 访问控制逻辑 如果MMU 被禁用了 外部地址总线将直接输出虚拟地址
虚拟地址到物理地址的映射 虚拟 存储器 变换和校验 机制. 物理 存储器 MMU 保护 & 中止 Process D 变换表 Process C VRAM RAM Process B I TLB ROM D TLB RAM Process A RAM RAM Manager RAM 保护 & 中止
映射机制的重要性(1) 举例:通常嵌入式系统的程序存放在ROM/FLASH中,这样系统断电后程序能够保存。 ROM/FLASH(70ns)与SDRAM(7ns)相比,速度慢的多,而且嵌入式系统中通常把异常中断向量表放在RAM中。 利用这种内存映射机制可以解决这种需要。
映射机制的重要性(2) 解决方式: 系统加电时,将ROM/FLASH映射为地址0,进行一些初始化处理 初始化完成后,将SDRAM映射为地址0,并把系统程序加载到SDRAM中运行
为什么要用 MMU? 保护单元提供的是粗略的,通常是静态的存储模式 MMU可以“动态地”重新定位存储空间 将变换过程与系统的其他部分隔离 不能分配额外的存储空间 MMU可以“动态地”重新定位存储空间 对存储器“重新分配”使其纳入有效的管理 将变换过程与系统的其他部分隔离 生成所需的页表虚拟存储系统
TLB 和变换表 TLB是最近用于从虚拟地址 到 物理地址变换的cache 变换表驻留在物理存储器中 为大多数存储器访问提供变换和访问权限的信息 若TLB 没有命中,页表浮动硬件将从存于物理存储器中的变换表重新找回,然后TLB 被更新 如果 TLB 满了, 有的值将因循环编排的方式被覆盖 变换表驻留在物理存储器中 第一级页表包含4096个变换,通过虚拟地址的位 31:20 索引 变换项包含一个指针,指向1MB的段物理空间,连同其属性信息... 指向另一页表基地址的指针,包含了许多指向较少页物理地址指针 好的间隔尺度要求更多的页表,因此也需要更多的物理存储空间!
MMU 转换过程 变换过程由硬件完成,对用户是透明的 变换表由软件产生 虚拟地址 检查TLB是否包含该虚拟地址 是 否 得到物理地址 页表浮动 得到物理地址 更新 TLB
第一级描述 第一级描述是转换表中的一个条目,它可以是: 一个错误 一个段描述 一个粗略的或细致的页描述 段描述指针指向1Mb 的段物理空间,包括访问权限(AP)和可cache和可缓冲的控制位 如果第一级取返回的是一个页描述,这将提供第二级描述表的基地址 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 错误 粗略的第二级描述基地址 域选择 1 0 1 粗略页表 段基地址 AP 域选择 1 C B 1 0 段 详细页表 详细的第二级描述基地址 域选择 1 1 1
第一级描述 存储器管理的段/页寻址中的段表/页表都放在存储器中。表的基址、域、访问权限以及有关特性都放在第一级描述符中。第一级描述符也放在存储器中,该变换表由CP15协处理器的寄存器R2给出,而表格索引则由虚拟地址[31:20]给出 第一级描述符按位[1:0]可以有4种情况: 00:错误或无效 01:粗调页的描述符 10:段的描述符 11:细调页的描述符(支持某些ARM处理器核)
第二级描述 第二级描述保存的是大页,小页的基地址 位 [1:0] 代表访问类别 微页只支持详细页表 加入微页是为了改善存储器以用于更高级的文件分段系统 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 错误 大页基地址 AP3 AP2 AP1 AP0 C B 0 1 大页 小页基地址 AP3 AP2 AP1 AP0 C B 1 0 小页 微页基地址 AP C B 1 1 微页
第一级变换页表 虚拟地址 第一级转换页表 物理地址 1 MB 段 4096 项 1 MB 段 粗略第二级转换页表 错误 细致第二级转换页表 0xFFF 00000 0xFFF AP Domain Selector 1 C B 1 0 0xFFF 00000 0xFFE 00000 0xFFF AP Domain Selector 1 C B 1 0 0xFFE 00000 0xFFD 00000 0xFFF AP Domain Selector 1 C B 1 0 0xFFD 00000 0xFFC 00000 0xFFF AP Domain Selector 1 C B 1 0 0xFFC 00000 0x006 00000 0xFFC AP Domain Selector 1 C B 1 0 0x006 00000 0x005 00000 0 0 0x005 00000 0x004 00000 0 0 0x004 00000 0x003 00000 Fine Table Base Domain Selector 1 1 1 0x003 00000 0x002 00000 Coarse Table Base Domain Selector 1 0 1 0x002 00000 0x001 00000 0x002 AP Domain Selector 1 C B 1 0 0x001 00000 0x000 00000 0x000 AP Domain Selector 1 C B 1 0 0x000 00000 粗略第二级转换页表 错误 细致第二级转换页表
第一级地址变换 虚拟地址 第一级 页表项 物理地址 索引进入第一级页表 段索引 +TTB 段基地址 AP 域 1 C B 1 0 段基地址 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 索引进入第一级页表 段索引 虚拟地址 +TTB 第一级 页表项 段基地址 AP 域 1 C B 1 0 段基地址 段索引 物理地址
第一级地址变换 (或称段式寻址 ) 32位虚拟地址(即逻辑地址)分成高12位段表项索引(table index)和20位段索引(Section index)。12位段表索引与CP15的R2中的18位变换表基址(translation table base address)合并成存储器存取地址(最后2位为00)。查段表找出相应的段描述符,位[31:20]为段基址(section bass address),位[19:12]为零,位[11:10]为AP存储器存取权限,位[9]为0,位[8:5]为域,位[4]不确定,位[3]为C: Cache允许,位[2]为B:缓冲器允许,最低2位为10表示段描述符。然后,段基址与段索引(32位虚拟地址中提供)合并成真正的存储器存取地址(物理地址),读出相应的数据
第二级变换页表 大页 第二级转换页表 16 页 粗略页表 - 256 项 小页 256 页 大页 错误 16页 小页 64kB 粗略页表 - 256 项 小页 256 页 0 0 Large Page Base AP3 AP2 AP1 AP0 C B 0 1 4kB Small Page Base AP3 AP2 AP1 AP0 C B 1 0 1 1 大页 16页 错误 64kB 小页 256页 细致页表 - 1024 项 4kB 0 0 微页 1024页 Large Page Base AP3 AP2 AP1 AP0 C B 0 1 Small Page Base AP3 AP2 AP1 AP0 C B 1 0 Tiny Page Base AP C B 1 1 1kB
第二级地址变换 + 虚拟地址 第一级页表项 第二级页表项 物理地址 页索引 索引进入第一级页表 大页/小页/微页基地址 索引进入第二级页表 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 页索引 索引进入第一级页表 第一级页表项 第二级页表项 大页/小页/微页基地址 索引进入第二级页表 x x C B AP 粗略/细致第二级描述基地址 页 x 1 +TTB +
第二级地址变换 (或称二级页式寻址 ) 32位虚拟地址分成为位[31:20]:12位为第一级表索引(有的称目录项索引),位[19:12]:8位页表索引(page table index),位[11:0]:12位页偏移值(page offset)。12位第一级表索引与CP15的R2中的18位变换表基址合并成存储器存取地址(最后2位为00)。查第一级表,取出相应第一级描述符,位[31:10]为页表的基址(page table base address),位[8:5]为域,最后2位为01表示第二级粗调页表指针(10为段指针,11为第二级细调指针)。22位的页表基址与页表索引(32位虚拟地址提供)再次形成存储取地址(最后2位为00),查第二级表(页表),找出相应表描述符,位[31:12]为该页基址,AP3、AP2、AP1、AP0为4个子页(16K字节)的存取权限,描述符中C和B定义同段描述符中的C和B定义,后2位10表示为小页(01为大页,11为微小页,00变换故障),20位页基址与页偏移值(32位虚拟地址提供)形成真正存储器存取地址(物理地址),读出相应数据
域 MMU 访问主要由域控制 所有定义的存储器区域都有一个相关联的域 域通常允许3个状态 可以通过简单的协处理器写操作修改域的读写区 域被定义为2比特的读写区 可以定义16个域 域通常允许3个状态 客户态 – 服从段或页描述中的访问权限 管理态 – 忽略段或页描述中的访问权限 所以无错误产生 无读写态 – 任何访问都将产生一个域错误 可以通过简单的协处理器写操作修改域的读写区 31 0 D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
CP15 C13 – 进程 ID 寄存器 用于快速的文本切换 (FCSE) 进程 ID 可以取代虚拟地址的位[31:25] 复位时为0 如果 CP15 之R13 是0, VA 位[31:25] 未修改 有效地允许每个进程运行在相同的虚拟地址空间 复位时为0 MCR/MRC p15,0,Rd,c13,c0,0 读进程ID寄存器,返回进程标识 写操作将更新进程标识 31 25 24 0 Process ID SBZ
利用进程 ID 寄存器生成地址 VA[31:25] MVA[31:0] 来自内核的指令地址 修改过的地址 VA[31:0] OS 进程管理 判决逻辑 进程 ID VA[31:25] 来自内核的指令地址 VA[31:0] MVA[31:0] 修改过的地址 送入 Cache和 MMU VA[24:0]
进程 ID – 映射举例 如果 ( 0 VA < 32 MB ) 则 MVA = (32MB Process ID) + VA MMU虚拟地址 (MVA) 来自内核的虚拟地址 (VA) 4 GB 32 MB 4 GB 32 MB 0 MB P0 进程 ID P1 P30 P2 P3 P31 P4 0 MB
MMU 配置步骤 在存储器中构造转换页表,定义所需的从虚拟地址到物理地址转换的初始值 设置变换页表基地址 转换页表项包括可cache和可缓冲的属性 也包括访问权限 设置变换页表基地址 CP15 之c2 使能cache, 设置时钟同步模式并使能 MMU CP15之c1 其他内核缺省配置如存储模式和向量地址页在这里设置
本节课主要内容 缓冲存储器(Cache) 存储器管理 系统控制协处理器CP15
什么是协处理器? ARM为了便于片上系统SOC的设计,ARM处理器内核尽可能精简,要增加系统的功能,可以通过协处理器来实现 协处理器号 功能 15 系统控制 14 调试控制器 13-8 保留 7-4 用户 3-0 保留
3.3 CP15 MMU寄存器 ARM的存储器管理通过系统控制协处理器CP15来实现 CP15中的寄存器可能是只读的,也可能是只写的
访问CP15寄存器的指令 访问CP15寄存器的指令有下面两种: MCR ARM寄存器到协处理器寄存器的数据传送指令 MRC 协处理器寄存器到ARM寄存器的数据传送指令 编程格式: MCR/MRC{cond}p15,opcode_1,rd,cn,cm,opcode_2 p15 – 指定协处理器 15 opcode_1 – 总是为0 rd - ARM 源或目的寄存器 cn - CP15 主寄存器,编号为C0、C1…C15 cm – 附属寄存器名(当指令中不需要必须指定为C0) opcode_2 - 可选的 3比特数用来指定附加信息
示例 MCR p15,0,R4,C1,C0,0; 注:从ARM寄存器R4中将数据传送到协处理器CP15的寄存器中C1中。 其中: R4-ARM寄存器,存放源操作数 C1、C0为协处理器寄存器,为目标寄存器 操作码1 为0 操作码2 为0
R0:ID寄存器(只读) 位[31:24]:实现者标记。ASCII码,A:ARM公司;D:Digital公司 位[23:16]:体系架构版本号。‘A’=0,V3版;‘A’=1,V4版 位[15:4]:3位BCD码的部分号 位[3:0]:版本号
R1: 控制寄存器(V3版:只写;V4版可读/写) M(位0):允许MMU A(位1):允许定位故障检验 C(位2):允许数据Cache或统一Cache W(位3):允许写缓冲 P(位4):从26至32位异常处理 D(位5):从26至32位地址区域 L(位6):至上一次中止时序 B(位7):从小端到大端 S(位8):修改MMU系统 R(位9):ROM保护状态 F(位10):控制外协处理器通信速度 Z(位11):允许分支预测 I(位12):允许指令Cache V(位13):异常向量基址从0×00000000至0×ffff0000 RR(位14):控制Cache置换算法(随机法和循环法) 位[31:15]作为保留位,如位[31:30]用作为ARM920/ARM940的时钟控制。
R2:地址变换表基址(V3版,只写;V4版,可读/写) 位[31:14]提供了18位地址变换表的基址,基定位界限为16K字节。
R3:域访问控制寄存器(V3版,只写;V4版,可读/写) 该寄存器包含了16个域(domain),每个2位来说明访问权限AP(Access Permission)。 其中: 01:客户(client)使用域,根据段或页描述符的访问权限来检验; 11:管理员控制域的操作,无访问权限检验; 00:不允许访问,任何访问都会产生域故障; 10:保留。
R5:故障状态寄存器(V3版,只读;V4版,可读/写) 该寄存器用来指出故障类型和上一次数据存取中止时的域,D(位9):设置数据断点
R6:故障地址寄存器(V3版,只读;V4版,可读/写) 该32位寄存器为上一次数据存取中止的地址。
R7:快存Cache操作(V3版,只读;V4版,可读/写) 该寄存器用来执行快存Cache,写缓冲,预取缓冲和转移目标Cache清除以及排空(flush)等操作。该寄存器值为零或相关的虚拟地址。
R8:变换后备缓冲器TLB操作(V4版有效) 该寄存器用来执行变换后备缓冲器TLB的操作,单路或整个TLB,由统一的或分离的指令和数据TLB来支持。
R9:读缓冲操作 该寄存器用来控制读缓冲器。在一些处理器中,它用来控制Cache的锁住(lockdown)功能。
R10:变换后备缓冲器TLB锁住 该寄存器用于控制TLB锁住功能。
R13:进程ID映像 该寄存器通过进程ID寄存器来再映像虚拟存储器的虚拟地址。该机制是用来支持Window CE,包括了快速文本处理与跟踪进程ID。Intel公司的SA-1110处理器及ARM720T与ARM920T处理器核都有此功能。若虚拟地址的位[31:25]为零,则用该寄存器的位[31:25]来替代
R15:测试和时钟控制 该寄存器用于测试,以及部分处理器的时钟控制。 注:CP15的MMU寄存器中R4、R11和R12保留。
怎么在编程中使用? 举例说明: MRC P15,0,R0,C1,C0, 0; ORR R0,#01; MCR P15,0,R0,C1,C0,0; 注: MRC :协处理器到ARM寄存器 MCR : ARM寄存器到协处理器 C1的位[0]设置成1,使能MMU