[kernel 启动流程]系列:
- [kernel 启动流程] 前篇——vmlinux.lds分析
- [kernel 启动流程] (第一章)概述
- [kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断
- [kernel 启动流程] (第三章)第一阶段之——proc info的获取
- [kernel 启动流程] (第四章)第一阶段之——dtb的验证
- [kernel 启动流程] (第五章)第一阶段之——临时内核页表的创建
- [kernel 启动流程] (第六章)第一阶段之——打开MMU
- [kernel 启动流程] (第七章)第一阶段之——跳转到start_kernel
建议参考文档:
================================================
零、说明
本文是《[kernel 启动流程] (第一章)概述》的延伸,
阅读本文前建议先阅读《[kernel 启动流程] (第一章)概述》
1、kernel启动流程第一阶段简单说明
arch/arm/kernel/head.S
- kernel入口地址对应stext
ENTRY(stext)
第一阶段要做的事情,也就是stext的实现内容
- 设置为SVC模式,关闭所有中断
- 获取CPU ID,提取相应的proc info
- 验证tags或者dtb
- 创建临时内核页表的页表项
- 配置r13寄存器,也就是设置打开MMU之后要跳转到的函数。
- 使能MMU
- 跳转到start_kernel,也就是跳转到第二阶段
本文要介绍的是“使能MMU”的部分。
2、疑问
主要带着以下几个问题去理解
- 如何打开MMU?
- 打开MMU前的一些寄存器设置?
一、MMU控制
MMU的配置操作都是通过操作CP15协处理器来实现的。
1、CP15协处理器寄存器说明
寄存器说明请参考《ARM的CP15协处理器的寄存器》。
表格如下
寄存器编号 | 基本作用 | 在 MMU 中的作用 | 在 PU 中的作用 |
---|---|---|---|
c0 | ID 编码(只读) | ID 编码和 cache 类型 | |
c1 | 控制位(可读写) | 各种控制位 | |
c2 | 存储保护和控制 | 地址转换表基地址 | Cachability 的控制位 |
c3 | 存储保护和控制 | 域访问控制位 | Bufferablity 控制位 |
c4 | 存储保护和控制 | 保留 | 保留 |
c5 | 存储保护和控制 | 内存失效状态 | 访问权限控制位 |
c6 | 存储保护和控制 | 内存失效地址 | 保护区域控制 |
c7 | 高速缓存和写缓存 | 高速缓存和写缓存控制 | |
c8 | 存储保护和控制 | TLB 控制 | 保留 |
c9 | 高速缓存和写缓存 | 高速缓存锁定 | |
c10 | 存储保护和控制 | TLB 锁定 | 保留 |
c11 | 保留 |
重点从MMU的功能方面说明如下几个寄存器
(1)c1,MMU的控制寄存器
bit | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | <
---|