ARM64启动汇编和内存初始化(下) --- (三)
文章代码分析基于linux-5.19.13,架构基于aarch64(ARM64),平台qmenu,物理内存起始地址0x40000000
上文讲了汇编代码__create_page_tables的两个映射(未使能mmu):
(1)idmap_text段的恒等映射;
(2)内核镜像的线性映射;
1. 恒等映射和内核镜像映射示意图
2. 问题
2.1 为什么创建恒等映射?
为了降低启动代码的复杂性,进入linux内核的时候,MMU是关闭的,这也就意味着不能利用高速缓存的性能,那么内核是如何要打开MMU并使能数据高速缓存呢?
(1) 在关闭MMU的情况下,处理器访问的地址都是物理地址。当MMU打开后,处理器访问地址就变成虚拟地址;
(2) 目前的处理器都是多级流水行架构,处理器会提前预取多条指令到流水线中。当打开MMU后,处理器之前预取的指令就会以虚拟地址来访问,到MMU查找对应的物理地址。
因此,为了保证处理器在开启MMU后,能完成从物理地址到虚拟地址的平滑过渡,首先会创建VA和PA的相等映射(恒等映射identity mapping))。 建立恒等映射是小范围的,占用的空间通常小于内核映像的大小,也就是几兆字节。
2.2 为什么ARM64要创建两个页表?
arm64处理器中有两个页表基地址存储器TTBR0和TTBR1 。
(1)当虚拟地址的63bit为0的时候,硬件会自动选择TTBR0;
(1)当虚拟地址的63bit为1的时候,硬件会自动选择TTBR1;
一般SOC的物理地址从0或者某一个地址开始,但是这个地址一般不会超过256TB(0000 FFFF FFFF FFFF),至少目前不会(因为已经够用,且地址越大soc成本越高),所以恒等映射要用到TTBR0。
因为内核image的映射一定处于内核空间中,所以映射要用到TTBR1。因此这里必须创建了两个页表。
本文来自博客园,作者:BSP-路人甲,转载请注明原文链接:https://www.cnblogs.com/jianhua1992/p/16846171.html,并保留此段声明,否则保留追究法律责任的权利。