MEMORY | INTERRUPT | TIMER | 并发与同步 | 进程管理 | 调度 | uboot | DTB | ARMV8 | ATF | Kernel Data Structure | PHY | LINUX2.6 | 驱动合集 | UART子系统 | USB专题 |

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。因此这里必须创建了两个页表。

posted on 2022-11-21 22:19  BSP-路人甲  阅读(173)  评论(0编辑  收藏  举报

导航