u-boot2011中初始化函数实现的巧妙方法

原创 2015年11月18日 19:55:20

下面这段函数出现在在u-boot启动的流程中

sw_patch_t **sw_patch = &LS_sw_patch_start;
while (sw_patch!=&LS_bootm_stack) {
   (*sw_patch)();
   ++sw_patch;
}

LS_sw_patch_start 出现在u-boot.lds中

. = ALIGN(4);
    .soft_patch : {
        LS_sw_patch_start = .;
        KEEP(*(.soft_patch.0));
        KEEP(*(.soft_patch.1));
        KEEP(*(.soft_patch.2));
        KEEP(*(.soft_patch.3));
        KEEP(*(.soft_patch.4));
        KEEP(*(.soft_patch.5));
        KEEP(*(.soft_patch.6));
        KEEP(*(.soft_patch.7));
        KEEP(*(.soft_patch.8));
        KEEP(*(.soft_patch.9));
        KEEP(*(.soft_patch.10));
        KEEP(*(.soft_patch.11));
        KEEP(*(.soft_patch.12));
        KEEP(*(.soft_patch.13));
        KEEP(*(.soft_patch.14));
        KEEP(*(.soft_patch.15));        
        KEEP(*(.soft_patch.16));
        KEEP(*(.soft_patch.17));
        KEEP(*(.soft_patch.18));
        KEEP(*(.soft_patch.19));
        KEEP(*(.soft_patch.20));
        KEEP(*(.soft_patch.21));
        KEEP(*(.soft_patch.22));
        KEEP(*(.soft_patch.23));
        LS_bootm_stack = .;                
        KEEP(*(.soft_patch.99));         
        LS_sw_patch_end = .;
    }

那么 KEEP(*(.soft_patch.18));这些代表什么呢?

PATCH_REG(swp_flash_init, 1);
PATCH_REG(swp_env, 3);
PATCH_REG(swp_uart, 5);
#ifdef CONFIG_OTTO_FLASH_LAYOUT
PATCH_REG(swp_gen_fl, 5);
#endif /* #ifdef CONFIG_OTTO_FLASH_LAYOUT */
PATCH_REG(swp_pci, 7);
PATCH_REG(swp_studio, 9);
PATCH_REG(swp_console_r, 11);
PATCH_REG(swp_env_set, 13);
PATCH_REG(swp_spi, 15);
PATCH_REG(swp_misc, 17);
PATCH_REG(swp_post, 19);
PATCH_REG(swp_eth, 21);

PATCH_REG是一个宏,定义在include/common.h中

#define PATCH_REG(x, lvl) \
void_func * __swp_##x __attribute__ ((section (".soft_patch." #lvl))) = x


在c语言中##表示连接前后两个字符串 

__attribute__是GNU的新特性,它可以定义函数和结构,联合体之类的属性。在这里就是把函数编译连接到.soft_patch段之中。所以,上面的函数经过宏展开后就是void_func * __swp_swp_eth = swp_eth,并且在soft_patch段中。所以u-boot的主流程函数中就是定位到soft_patch的地址,然后依次执行这一段代码对应的每个指针指向的函数。

感觉好神奇

详解U-Boot中printf函数的实现

详解U-Boot中printf函数的实现一、printf函数调用关系1.1fputc和srial_putc的关系/* * Output a single byte to the serial por...
  • ce123
  • ce123
  • 2012年04月29日 19:18
  • 9081

U-BOOT下使用bootm引导内核方法

  • 2008年10月29日 10:43
  • 46KB
  • 下载

函数main_loop和u-boot命令执行

一.main_loop函数执行流程和命令解释器 run_main_loop是board_r中函数运行列表init_fnc_t init_sequence_r[]最后一个函数,它又调用了main_loo...

指针函数用法,参考u-boot1.1.6

function_pointer.c cc function_pointer.c
  • ychongx
  • ychongx
  • 2014年04月29日 18:17
  • 279

u-boot.bin4480初始化

  • 2012年12月21日 20:21
  • 133KB
  • 下载

U-boot代码函数调用关系

U-boot代码函数调用关系 本文以arm926ejs为例,分析了整个uboot代码的启动过程。 /cpu/arm926ejs/start.S //设置堆栈,申请中断,开辟内存空间 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:u-boot2011中初始化函数实现的巧妙方法
举报原因:
原因补充:

(最多只允许输入30个字)