Lazy loaded image[转载]ARM64 内存管理三:MMU 前 CPU 初始化及打开 MMU
2023-8-22
| 2023-8-22
字数 1260阅读时长 4 分钟
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
 
  • 内存管理
  • [转载]ARM64 内存管理二:创建启动阶段的页表[转载]ARM64 内存管理四:setup_arch 简介 (内存管理初始化)
    Loading...