Lec 06 系统初始化

Lec 06 系统初始化

Contents

1.启动过程和系统初始化

1.从上电到等待输入

a

2. 计算机上电到内核启动

  1. 上电后,开始执行BIOS ROM中的代码(早期设备)
    -- 自检(POST: Power-On Self Test)
    -- 找到第一个可启动设备(如第一块磁盘)
    -- 将可启动设备的第一个块(Master Boot Record )加载到内存固定地址中
    -- 跳转到bootloader的内存地址(MBR中包含bootloader)并继续执行
  2. bootloader开始执行
    -- 将内核的二进制文件从启动设备加载到内存中
    -- 若内核文件是压缩包,则对其进行解压
    -- 跳转到(解压后的)内核加载地址(物理地址)并继续执行
  3. 内核代码开始执行

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

a

6. ARMv8架构下内核启动的3个主要任务

  1. 设置CPU异常级别(特权级别)
    -- 内核通常运行在EL1,CPU上电后的异常级别不一定是EL1,如何切换异常级别?
  2. 设置页表并开启虚拟内存机制
    -- 页表究竟改如何具体配置?
    -- 难点:开启地址翻译的前一行指令使用物理地址,开启后立即使用虚拟地址,前后如何衔接?
  3. 设置异常向量表并打开中断
    -- 异常向量表如何配置?
    -- 打开后,异常处理的指令流如何流动?

2. 物理地址空间

1. 物理地址空间物理内存空间

  • 物理地址空间通常指:系统总线地址空间
    -- 系统总线连接内存,也连接其他设备,每个设备都占一块地址空间

2. 读内存示例:LOAD 1742,R1

  1. 总线上的设备可以向总线发起请求,称为事务(Transaction)。处理器-2向总线发起事务 {1742, READ, 102} ,总线上所有设备均可见

  2. 内存-1发现地址在自己的范围(仅需检查地址高位即可)

  3. 内存-1 ACK,处理器-2释放总线,内存-1在内部读取位于1742地址的数据

  4. 内存-1 ACK,处理器-2释放总线,内存-1在内部读取位于1742地址的数据

  5. 处理器-2正在等待结果,将数据从总线复制到寄存器R1中

  6. 处理器-2 ACK,内存释放总线

a

a

3. Chcore启动

a

a

a

a

a

a

a

a

4. 页表初始化

a

a

a

开启页表前后

a

执行267行,为何能顺利执行?

  • 页表不是在低地址区域(0-1G)么?
  • 虚拟地址和物理地址完全相同
  • 回想下页表中的映射(TTBR1)

a

start_kernel位于高地址段:

  • 0xffffff0000000000 + init_end
  • 从 init_c (低地址范围)跳过去后
  • 高地址范围的地址已经被映射
  • 栈在 start_kernel 已经换成了高地址

5 异常向量表初始化

a

a

a

a

a

a

6 小结

  • 设置CPU异常级别为EL1
  • 设置页表并开启虚拟内存机制
    -- TTBR0_EL1: 虚拟地址 = 物理地址
    -- TTBR1_EL1: 虚拟地址 = 物理地址 + OFFSET
  • 设置异常向量表
    -- 每个异常向量表项跳转到对应的异常处理函数
    -- 处理异常前保存进程上下文、返回进程前恢复其上下文
posted @   木木ちゃん  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示