"U-Boot启动过程分析"
U-Boot是一个广泛应用的开源Bootloader,主要负责在嵌入式系统中引导操作系统。它的启动过程分为两个阶段,对于Linux系统下的U-Boot,我们通常从NOR Flash启动。这里我们将深入探讨U-Boot的启动流程,以及涉及的源代码分析。
首先,U-Boot的第一阶段由`cpu/arm920t/start.S`和`board/smdk2410/lowlevel_init.S`两个文件组成。`start.S`包含了平台相关的初始化代码,而`lowlevel_init.S`则针对具体的开发板进行定制。在这一阶段,U-Boot会执行以下关键任务:
1. **硬件设备初始化**:初始化CPU,将其设置为管理模式(svc),关闭WATCHDOG定时器,调整FCLK、HCLK、PCLK的时钟比例,关闭MMU和CACHE。这些操作都是在`start.S`中完成的,可以通过查阅相关硬件实验章节获取更多细节。
2. **内存初始化**:为了加载Bootloader的第二阶段代码,需要对外部内存(如SDRAM)进行初始化。在S3C2410或S3C2440处理器上,这通常是通过调用`lowlevel_init`函数来设置存储控制器。由于`lowlevel_init.S`是开发板特定的,因此可以根据不同的外设进行相应的修改。在这个阶段,代码和数据都还存储在NOR Flash中,所以在读取时需要考虑地址转换。
在`lowlevel_init.S`的代码示例中,可以看到如下的操作:
```asm
139 ldr r1, =BWSCON /* BusWidthStatusController */
140 add r2, r0, #0x1E0 /* Address of BWSCON register in SMC */
```
这段代码表明,U-Boot正在设置Bus Width Status Controller(BWSCON),这是控制SDRAM时序和宽度的寄存器,以便使其可用。
进入第二阶段后,U-Boot会继续执行以下任务:
1. **加载第二阶段Bootloader**:通常是从NOR Flash复制到RAM中执行。这部分代码通常包含更多的系统检测、设备初始化、网络支持、文件系统处理等。
2. **引导操作系统**:一旦第二阶段Bootloader运行,它会加载并启动Linux内核。这涉及到解析内核映像、设置参数,并将控制权传递给内核。
理解U-Boot的启动流程对开发和调试嵌入式系统至关重要。通过分析源代码,我们可以更好地了解硬件初始化的细节,以及如何根据不同的硬件配置进行调整。此外,这也为定制Bootloader功能提供了基础,比如添加新的设备驱动或支持不同类型的存储介质。