Lec 06 系统初始化
Lec 06 系统初始化
目录
Contents
1.启动过程和系统初始化
1.从上电到等待输入
2. 计算机上电到内核启动
- 上电后,开始执行BIOS ROM中的代码(早期设备)
-- 自检(POST: Power-On Self Test)
-- 找到第一个可启动设备(如第一块磁盘)
-- 将可启动设备的第一个块(Master Boot Record )加载到内存固定地址中
-- 跳转到bootloader的内存地址(MBR中包含bootloader)并继续执行 - bootloader开始执行
-- 将内核的二进制文件从启动设备加载到内存中
-- 若内核文件是压缩包,则对其进行解压
-- 跳转到(解压后的)内核加载地址(物理地址)并继续执行 - 内核代码开始执行
3. 实例:树莓派启动
- 树莓派:上电后真正运行的第一行代码(没有BIOS)
-- 板子上电后固定从0x0地址运行firmware(也称 bootloader)
-- firmware放在SD卡中
-- 然后再由这段代码去初始化CPU、SDRAM等
-- 最后再加载内核、根文件系统到内存,实现系统启动 - 不同主板厂商的实现可以不同
-- 这部分代码由主板厂商提供,使用人员通常不用关心
-- 树莓派的启动比较特殊:第一行代码由GPU运行
-- 不同版本的树莓派也可能不一样
4. 树莓派GPU启动
- Step-1
-- GPU:运行0x0地址的firmware,将将SD卡根目录下的bootcode.bin加载到内存中 - Step-2
-- GPU:运行bootcode.bin,将SD卡根目录下的start.elf加载到内存中 - Step-3
-- GPU:运行start.elf,将SD卡根目录下的kernel.img加载到内存中
-- 然后,CPU 跳转到 kernel.img,开始真正运行内核代码
5. 内核入口函数地址
CPU从预定义的RAM地址读取第一行代码,由硬件厂商决定
树莓派:32位为0x8000,64位为0x80000
6. ARMv8架构下内核启动的3个主要任务
- 设置CPU异常级别(特权级别)
-- 内核通常运行在EL1,CPU上电后的异常级别不一定是EL1,如何切换异常级别? - 设置页表并开启虚拟内存机制
-- 页表究竟改如何具体配置?
-- 难点:开启地址翻译的前一行指令使用物理地址,开启后立即使用虚拟地址,前后如何衔接? - 设置异常向量表并打开中断
-- 异常向量表如何配置?
-- 打开后,异常处理的指令流如何流动?
2. 物理地址空间
1. 物理地址空间 物理内存空间
- 物理地址空间通常指:系统总线地址空间
-- 系统总线连接内存,也连接其他设备,每个设备都占一块地址空间
2. 读内存示例:LOAD 1742,R1
-
总线上的设备可以向总线发起请求,称为事务(Transaction)。处理器-2向总线发起事务 {1742, READ, 102} ,总线上所有设备均可见
-
内存-1发现地址在自己的范围(仅需检查地址高位即可)
-
内存-1 ACK,处理器-2释放总线,内存-1在内部读取位于1742地址的数据
-
内存-1 ACK,处理器-2释放总线,内存-1在内部读取位于1742地址的数据
-
处理器-2正在等待结果,将数据从总线复制到寄存器R1中
-
处理器-2 ACK,内存释放总线
3. Chcore启动
4. 页表初始化
开启页表前后
执行267行,为何能顺利执行?
- 页表不是在低地址区域(0-1G)么?
- 虚拟地址和物理地址完全相同
- 回想下页表中的映射(TTBR1)
start_kernel位于高地址段:
- 0xffffff0000000000 + init_end
- 从 init_c (低地址范围)跳过去后
- 高地址范围的地址已经被映射
- 栈在 start_kernel 已经换成了高地址
5 异常向量表初始化
6 小结
- 设置CPU异常级别为EL1
- 设置页表并开启虚拟内存机制
-- TTBR0_EL1: 虚拟地址 = 物理地址
-- TTBR1_EL1: 虚拟地址 = 物理地址 + OFFSET - 设置异常向量表
-- 每个异常向量表项跳转到对应的异常处理函数
-- 处理异常前保存进程上下文、返回进程前恢复其上下文
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了