UBoot第二阶段解析:初始化与传参机制

需积分: 0 0 下载量 24 浏览量 更新于2024-08-05 收藏 6KB TXT 举报
"uboot第二阶段涉及的关键点包括全局数据结构gd_t的定义、DM9000网卡的预初始化、启动参数的传递、环境变量的初始化与重定位以及串口初始化。" 在UBoot的第二阶段,系统进一步进行硬件初始化和设置,以便为Linux内核的启动做好准备。以下是对各个知识点的详细解释: 1. **gd_t宏定义**: DECLARE_GLOBAL_DATA_PTR 宏定义了一个全局数据指针gd_t,它是一个volatile类型的指针,存储在寄存器r8中。gd_t结构体包含了关于系统状态和配置的重要信息,如内存配置、设备状态等,是UBoot与硬件交互的核心数据结构。 2. **DM9000网卡预初始化**: DM9000_pre_init 是针对DM9000网络控制器的初始化函数,它主要负责配置GPIO和端口设置,这些工作是硬件相关的,确保网卡能正确地与外部总线通信。网卡的驱动通常被假设为正确无误,因此在移植时不需要改动,重点在于这个基本的初始化过程。 3. **启动参数的传递**: gd->bd->bi_boot_params 指向UBoot传递给Linux内核的启动参数的内存地址。UBoot将 bootargs 字符串准备好并存放在特定地址(bi_boot_params),然后通过寄存器r0、r1、r2传递给内核,其中一个寄存器包含bi_boot_params值。内核启动后,通过读取寄存器找到这些参数在内存的位置。 4. **环境变量初始化与重定位**: env_init 函数是环境变量的初步初始化,检查是否存在可用的环境变量。然而,在env_relocate函数被start_armboot调用之前,环境变量仍存储在SD卡上,不可直接使用。重定位后,环境变量被复制到DDR内存中,此时才能从DDR中访问和修改环境变量。 5. **串口初始化**: serial_init 函数负责初始化串口通信。虽然在start.S中通过lowlevel_init.S已经进行了初步的串口设置,但这里的serial_init可能是为了进行更高级别的配置或适应特定平台的需求。UBoot中有多个serial_init实现,具体使用哪个取决于CPU或平台类型。在这个例子中,使用的是uboot/cpu/s5pc11x/serial.c中的实现。 以上五个方面构成了UBoot第二阶段的主要任务,它们确保硬件的正确配置,启动参数的有效传递,并为Linux内核的启动打下基础。这一阶段的工作对于整个系统的稳定运行至关重要。