启动流程和链接脚本

本节目录

一般启动流程

对于 Risc-V 开发板,我们仍然以 Linux 系统为例,其一般的启动流程如下:

  • 板子上电后,CPU 从固定地址运行 ROM 中的代码
  • ROM 包含简单的设备驱动,从 fash 或者 SD 卡中加载 bootloader
  • 再由 bootloader 加载内核、initramfs 等到内存,跳转到 Linux 内核启动

在一个基于全志 D1 硬件平台的启动流程内,主要涉及到 SPL(Secondary Program Loader)、U-Boot 和 Linux 操作系统。在这个流程中,它们的角色和各自的加载地址如下:

SPL,二级程序加载器,通常位于设备的 ROM(只读存储器)中。它是最先被执行的代码,负责执行一些基本的硬件初始化和准备工作。SPL 的任务主要就是将下一级的引导加载器(如 U-Boot)从存储设备加载到 RAM 中。

U-Boot,一个开源的引导加载器,广泛用于嵌入式系统。在这个流程中,U-Boot 是由 SPL 从存储设备加载到 RAM 中,并从物理地址 0x4a00_0000 开始执行。U-Boot 会将 Linux 内核镜像从存储设备加载到 RAM 中的某个位置,并设置必要的启动参数,然后将控制权传递给 Linux 内核。

Linux 是最终要执行的操作系统。在这个流程中,Linux 内核从物理地址 0x4200_0000 开始执行。

感兴趣的同学们可以通过以下资料获取相关内容: 参考资料

链接脚本

链接脚本(Linker Script)是用于定义如何将程序的不同部分(如代码、数据、栈等)映射到内存中的文件。在嵌入式系统和操作系统开发中,链接脚本是一个非常重要的文件,因为它决定了程序在内存中的布局和大小。

在 Risc-V 系统中,链接脚本通常使用特定的语法来描述内存布局和符号地址。它定义了程序的各个段(如代码段、数据段、BSS 段等)的起始地址和大小,以及它们之间的相对位置。链接器(Linker)在编译过程中使用链接脚本来确定程序的最终内存布局,并生成可执行文件或镜像文件。

对于链接脚本来说,同学们需要了解程序的编译过程,具体要了解到代码段的更细的划分、数据段的更细的划分,需要同学们进行自学,可以在下面资料进行参考:参考资料

内核代码

内核代码是操作系统的核心部分,负责管理硬件资源、提供系统服务以及运行用户程序。在 Risc-V 系统中,内核代码通常使用 C 语言(或汇编语言)编写,并遵循特定的编程规范和接口标准。

对于内核代码,其二进制从.head.text 开始,剩余内容,请同学们跟着老师的课程进行学习,主要会讲解到 Linux 下的地址映射、内核运行的代码顺序等知识点。