type
status
date
slug
summary
tags
category
icon
password
URL
上一篇中,详细分析了 MMU 打开前,为 MMU 打开后能正常启动 linux kernel 进行了 3 块区域的 section map;
本篇聚焦为打开 MMU 而进行的 CPU 初始化, 主要内容:
- cache 和 TLB 处理
- memory attributes lookup table 的创建
- SCTLR_EL1、TCR_EL1 的设定 (详细见参考资料)
首先介绍 icache, dcache
icache: 指令 cache(instruction cache)
- 由 cp15 协处理器中控制寄存器 1 的第 12 位控制,一般在 MMU 开启之后被使用
- icache 一般有 512 个 entry,每个 16 bytes;如果 miss cache, 则从内存中读取指令,且触发
8-word linefill
, 将该指令所在区域 8 word 写进某个 entry
dcache: 数据 cache
- ARM dcache 架构由 cache 存储器和写缓冲器(write-buffer)组成,其中写缓冲器是 CACHE 按照 FIFO 原则向主存写的缓冲处理器
- 一般来说 CACHEABILITY 和 BUFFERABILITY 都是可以配置的,所以,一块存储区域可以配置成下面 4 种方式:NCNB CNB NCB CB(例: ip map 都采用 NCNB)
- DCaches 使用的是虚拟地址,它的大小是 16KB, 它被分成 512 行(entry), 每行 8 个字(8 words,32Bits)。每行有两个修改标志位(dirty bits),第一个标志位标识前 4 个字,第二个标志位标识后 4 个字,同时每行中还有一个 TAG 地址(标签地址)和一个 valid bit
memory type
<ARMv8 采用了 weakly-order 内存模型, 即处理器实际对内存访问(load and store)的执行序列和 program order 不一定保持严格的一致,处理器可以对内存访问进行 reorder;例如,对于写操作,processor 可能会合并两个写请求
因此,有必要对内存进行分类,以便 CPU 可以对不同类型做一些性能优化
- normal memory: 常用内存,访问无 side effect,processor 可以进行 reorder, repeat 或者 merge 以及分支预测
- IO memory: 外设 IO 内存,例如设备的 FIFO 队列,地址固定不变;process 不能进行 Speculative data accesses
memory attribute
- gathering(G): 对多个 memory 访问是否可以合并
- ordering(R):对内存访问指令是否可以重排
- Early Write Acknowledgement(E): PE 访问 memory 是有问有答的, 为了加快写速度,系统的中间环节可能会设定一些 write buffer;例如:以便确定完成一次 erite transaction. nE 表示写操作的 ack 必须来自最终的目的而不是中间 write buffer.
代码分析
__cpu_setup
__enable_mmu
__mmap_switched
参考资料
http://www.wowotech.net/armv8a_arch/__cpu_setup.html
http://www.wowotech.net/armv8a_arch/turn-on-mmu.html