linux板级初始化

来源:互联网 发布:广东省干部培训网络 编辑:程序博客网 时间:2024/06/05 03:48

linux板级初始化

2017-07-26

开发板:IMAX6Q

内核:3.0.35

 

最近拿到了明远智睿 的EK314开发板,以前主要用2440,眼界过于狭隘,借此机会练习下。

首先看看它的板级文件

/arch/arm/mach-mx6/board-myimx6ek314.c

在他的末尾指定了map_io、init_irq、init_machine、timer等初始化函数,MACHINE_START是个宏定义,他的展开我列了出来

 

 

这里的话,是定义了一个struct machine_desc __mach_desc__MYIMX6EK314 的结构体

这个结构体存放的段是.arch.info.init,这里注意一下,后边匹配machine_desc的时候就是到这个段中寻找,然后根据nr的值匹配。

这里的machine_desc指定的初始化函数的调用分别在以下阶段

main.c/start_kernel(void)  —>setup_arch(&command_line);

init_irq:
/init/main.c/start_kernel(void)->init_IRQ()->machine_desc->init_irq()
(mdesc) ->devicemaps_init() -> mdesc->map_io()
time_init:
start_kernel() –> time_init()->system_timer = machine_desc->timer;system_timer->init()

init_machine:

他是用了arch/arm/kernel/setup.c

@729

这个arch_initcall 执行了machine_desc->init_machine(),那么arch_initcall 是何时调用的呢?

在main.c ->do_basic_setup();->do_initcalls();中

这里的一个for循环do_one_initcall,调用了所有的 xxxx_initcall,在include/linux/init.h 中

以下代码是对标号进行处理,方便统一调用

 

initcall_t 的原型是typedef int (*initcall_t)(void);  就是个函数指针

__define_initcall就是把函数指针指向xxx_initcall() ,对应我们的初始化函数

而属性 __attribute__((__section__())) 则表示把对象放在一个这个由括号中的名称所指代的section中。

所以__define_initcall的含义是:

1) 声明一个名称为__initcall_##fn的函数指针;

2) 将这个函数指针初始化为fn;

3) 编译的时候需要把这个函数指针变量放置到名称为 “.initcall” level “.init”的section中。

这个section是在/include/asm-generic/vmlinux.lds.h中

而这些SECTION里的函数在初始化时被顺序执行(init内核线程->do_basic_setup()[main.C#778]->do_initcalls())。

程序(init/main.c文件do_initcalls()函数)do_initcalls()把.initcallXX.init中的函数按顺序都执行一遍。

 

原创粉丝点击