"云原生发展白皮书(2020)中的两个重要数据结构——gd_t结构体和u-boot启动过程"
在云原生计算环境中,基础软件组件如引导加载程序(Bootloader)扮演着至关重要的角色。本文将详细讨论u-boot中涉及的两个关键数据结构以及u-boot的启动流程。
首先,让我们关注gd_t结构体。这个结构体在u-boot中用于存储系统启动时所需的配置信息。gd_t的各个字段如下:
1. `bd_t *bd` - 指向board info的指针,包含了关于板子的详细信息,如硬件配置等。
2. `unsigned long flags` - 一组指示标志,用于标记设备的状态或完成的初始化步骤。
3. `unsigned long baudrate` - 串行通信的波特率,用于设置调试接口的通信速度。
4. `unsigned long have_console` - 表示串口初始化是否完成的标志。
5. `unsigned long reloc_off` - 重定位偏移,用于记录实际地址与预期地址之间的差异。
6. `unsigned long env_addr` - 环境变量结构体的地址,这些变量通常在启动过程中用malloc动态分配。
7. `unsigned long env_valid` - 环境变量的CRC校验,用于验证其有效性。
8. `unsigned long fb_base` - 帧缓冲区的基地址,用于图形显示。
9. `void **jt` - 跳转表,包含函数调用的地址,简化了函数查找和调用的过程。
在u-boot的源代码中,gd_t结构体的指针被声明为全局变量,并且存储在r8寄存器中,这样可以快速访问这些重要数据。
接下来,我们探讨u-boot的启动流程。启动流程从汇编语言的启动文件开始,例如在CPU/s5pc11x/start.S中:
1. 文件头:在入口点前有16字节的预定义区域,可能包含长度、校验和等信息。
2. 异常中断向量入口:定义了各种异常和中断的处理程序入口,例如Undefined Instruction、Software Interrupt、Prefetch Abort、Data Abort等,以及IRQ和FIQ中断的处理程序。
3. 数据填充:为了满足16字节对齐,代码会填充特定的数据,确保后续代码的执行效率。
然后是复位异常处理(reset)部分,这里主要设置了一些地址变量的值,并进行必要的初始化操作。在启动流程中,u-boot会逐步初始化硬件、设置内存映射、加载环境变量、启动引导加载程序的主要功能,并最终准备将控制权交给操作系统。
gd_t结构体和u-boot启动流程的深入了解对于系统级开发、故障排查和性能优化至关重要。在云原生环境下,这类底层知识有助于更好地理解和管理基础设施,确保系统的稳定性和可靠性。