UBOOT源码分析的第二阶段分析(1)

今天来分析一下uboot启动的第二阶段,这个start_armboot()函数比较长,有500多行。我们来分析一下启动的第二阶段。

我们来分析一下uboot第二阶段要做什么:简单的将就是第一阶段没有做的一些初始化。

主要是SOC外部硬件(比如emmc,网卡芯片)uboot本身的一些东西(uboot命令、环境变量)然后最终初始化完必要的东西后进入uboot命令行。

UBOOT源码分析的第二阶段分析(1)_第1张图片

 

细节分析:

定义在

typedef int (init_fnc_t) (void);    这是一个函数类型

init_fnc_ptr是一个二重函数指针,二重指针的作用有2个(其中一个是用来指向一重指针),一个是用来指向指针数组。因此这里的init_fuc_ptr可以用来指向一个函数指针数组。

 

#define DECLARE_GLOBAL_DATA_PTR     register volatile gd_t *gd asm ("r8")

(1)这里的意思是定义了一个全局变量,变量名叫做gd,是一个指针变量类型,占四个字节,用volatile修饰表示可变的,用register修饰表示这个变量尽量放到寄存器中,后面的asm("r8")是gcc支持的一种语法,意思就是要把gd放到寄存器r8中。

(2)DECLARE_GLOBAL_DATA_PTR就是定义了一个要放在寄存器r8中的全局变量,名字叫gd,类型是一个指向gd_t类型变量的指针。

(3)gd_t定义在include/asm-arm/global_data.h中。
gd_t中定义了很多全局变量,都是整个uboot使用的;其中有一个bd_t类型的指针,指向一个bd_t类型的变量,这个bd是开发板的板级信息的结构体,baudrate:波特率,have_console :控制台,reloc_off:重定位的偏移;env_addr 环境变量地址,env_valid环境变量的值,fb_base 缓存的初始地址

 

UBOOT源码分析的第二阶段分析(1)_第2张图片

bd_t结构体如下:

UBOOT源码分析的第二阶段分析(1)_第3张图片

bi_baudrate:开发板波特率

bi_ip_adr:开发板的ip地址

bi_enetaddr:开发板MAC地址

  struct environment_s           *bi_env:环境变量的指针

bi_arch_number:开发板的机器码

bi_boot_param:传递给内核的启动参数

 

struct                /* RAM configuration */
    {
    ulong start;
    ulong size;
    }            bi_dram[CONFIG_NR_DRAM_BANKS]:开发板的ram信息

 

#ifdef CONFIG_HAS_ETH1
    /* second onboard ethernet port */
    unsigned char   bi_enet1addr[6]:开发板的第二个网卡

gd_t中定义了很多全局变量,都是整个uboot使用的:其中有一个bd_t类型的指针,指向一个bd_t类型的变量,这个bd_t是开发板的板级信息,里面有不少的硬件相关的参数。

 

你可能感兴趣的:(嵌入式Linux)