#工作记录#
拖了非常久的页表转换整理,补坑!废话不多说开整。
MMU相关的知识点可以参考我之前的博客,这篇博客主要介绍如何在boot_code.s中配置页表。
目录
1.boot_code.s简介
2. MMU配置相关
2.1系统寄存器
2.2 ttb0_base的配置
1.boot_code.s简介
在ARMv8架构中,boot_code.s
是一个特殊的汇编语言源文件,通常用于编写启动代码。启动代码是系统启动时首先执行的代码,负责初始化系统环境,设置堆栈,以及跳转到操作系统的启动例程。
以下是boot_code.s
的一些常见用途和特点:
-
初始化堆栈:在系统启动时,需要设置一个初始堆栈,以便程序可以正常执行函数调用和返回。
-
设置BSS段:BSS段(Block Started by Symbol)是未初始化的全局变量和静态变量的区域。启动代码通常需要将这个区域清零。
-
设置控制寄存器:启动代码可能需要设置一些控制寄存器,以配置处理器的工作模式和行为。
-
跳转到操作系统启动例程:一旦系统环境被初始化,启动代码会跳转到操作系统的启动例程,通常是操作系统内核的入口点。
-
异常处理:启动代码可能需要处理一些早期的异常,例如内存访问错误或非法指令。
-
平台特定配置:不同的硬件平台可能需要不同的启动代码来配置硬件,例如设置时钟、初始化I/O设备等。
-
安全性:在一些系统中,启动代码还负责设置安全特性,如安全启动模式,以确保系统的安全性
2. MMU配置相关
2.1系统寄存器
系统寄存器用于控制和管理CPU的操作模式、特权级别、内存管理、中断处理等关键系统功能。主要的系统寄存器包括:
- SCTLR_ELx(System Control Register):系统控制寄存器,用于控制和配置处理器的系统级特性,如内存保护、缓存策略等。
- TTBR0_ELx(Translation Table Base Register):转换表基地址寄存器,用于定义页表的基地址,支持内存地址转换和虚拟内存管理。
- MAIR_ELx(Memory Attribute Indirection Register):内存属性指示寄存器,用于定义不同内存区域的属性,如缓存策略、访问权限等。
- TCR_ELx(Translation Control Register):转换控制寄存器,用于控制地址转换的行为和特性,如地址范围、页大小等。
- ESR_ELx(Exception Syndrome Register):异常综合症寄存器,用于存储异常发生时的状态信息,帮助调试和错误处理。
这些系统寄存器根据不同的异常级别(EL0, EL1, EL2, EL3)有不同的实例,如SCTLR_EL1, SCTLR_EL2等,分别对应用户态、内核态、虚拟化和安全态的控制。
以EL3为例:
1.首先配置SCTLR_EL3无效化CPU内部的L1 cache
mrs x0,SCTLR_EL3
and x0, x0, #12
msr SCTLR_EL3, x0
2.初始化页表信息配置tcr,mair系统寄存器
ldr x1,=0x80803520
msr tcr_el3,x1
ldr x1,=0xccee77bb0444ff00
msr mair_el3,x1
ldr x0,=ttb0
msr ttbr0_el3,x0
tcr_el3各bit含义如下
这个T0SZ又把我引到计算页表大小的章节了,继续探索一下这个到底是怎么个事。
由文档描述可以知道T0SZ用来描述输入address的size,那假设当我们输入的地址范围是44bits的时候,是不是我们输入的地址T0SZ就配置成44呢?
根据文档当我们地址范围为44bits的时候,需要将T0SZ配置为20。
mair_el3寄存器
设置不同的memory attribute属性。共可以配置成8种类型,后面由table translation descriptor 来选择使用哪个attribute。
上例中的ttb0_base在后面会描述,这里只是一个传参的作用,传递配置给ttbr0_el3。
ttbr0_el3寄存器
3.开启mmu和cache
mrs x0, s3_1_c15_c2_1
orr x0, x0, #(0x1<<6)
msr s3_1_c15_c2_1, x0
s3_1_c15_c2_1可以参考下面这个博客。
ARMv8架构u-boot启动流程详细分析(2)_armv8 atf+bootloader-CSDN博客
2.2 ttb0_base的配置
对于ttb0_base的配置就是需要进行页表的配置,将地址与attribute带上分配好。