kernel版本: 3.0.35
之前有提过u-boot将tags作为启动kernel的第三个参数传递:
int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images)
{
......
theKernel (0, machid, bd->bi_boot_params);
/* does not return */
return 1;
}
kernel对tags的解析有如下流程:
start_kernel -> main.c
setup_arch -> setup.c
setup_machine_tags ->
mdesc->fixup //读取commondline
parse_tags ->
parse_tag -> //解析每一个tag
t->parse //调用各个注册的tag对应的处理函数,这些都被存放在__tagtable_begin和__tagtable_end区间。
那么__tagtable_begin又是在哪里定义的呢?
看arch/arm/kernel/vmlinux-lds.S
__tagtable_begin = .;
*(.taglist.init)
__tagtable_end = .;
也就是说代码中被定义在.taglist.init段的都属于整个区间。
.taglist.int如何被用到?看一个例子:
static int __init p