(4-1)linux内核中,对于内核的各个模块的初始化,正是通过使用__define_initcall()的衍生宏定义接口API将初始化函数放置到__initcall##id.initsection中,不同模块的初始化函数按照调用级别顺序排列。在内核启动阶段,这些放置到这个section中的函数指针将被do_initcalls()按顺序依次调用,进而完成各个模块的初始化。 linu...
start_kernel -> rest_init -> kernel_thread -> init -> do_basic_setup -> do_initcalls 这里要分析两个函数: kernel_thread和do_initcalls,这两个函数都定义在init/main.c内 1) kernel_thread 1.static void noinline rest_init(void) 2. __releases(kernel_lock) 3.{ 4. system_state = SYSTEM_...
从上述代码可见,initcall_levels数组中的元素为initcall_t类型的指针,回到do_initcalls()函数中,该函数的核心操作是:按顺序从__initcall0_start开始,到__initcall_end结束的节段(称为初始化调用段)中取出不同段之间的函数,并执行。 存在这几个初始化调用段之间的函数都是内核中各个模块的初始化函数,而这些函数是...
do_initcalls()将按顺序从由__initcall_start开始,到__initcall_end结束的section中以函数指针的形式取出这些编译到内核的驱动模块中初始化函数起始地址,来依次完成相应的初始化。而这些初始化函数由__define_initcall(level,fn)指示编译器在编译的时候,将这些初始化函数的起始地址值按照一定的顺序放在这个section中。由...
的指针(即:函数起始地址)按照顺序放置一个名为 .initcall.init 的 section中,这个section又被分成了7个子section,它们按顺序排 列。 在内核初始化阶段,这些放置到这个section中的函数指针将供 do_initcalls() 按顺序依次调用,来完成相应初始化。
即: do_initcalls 会一次执行上面的链接脚本指定的段中的函数,其中在arch/arm/kernel/setup.c中: staticint__init customize_machine(void) {/*customizes platform devices, or adds new ones*/if(machine_desc->init_machine)machine_desc->init_machine(); // 执行了smdk4x12_machine_init ...
原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)作者:tekkamanninja 转自:http://blog.chinaunix.net/uid-25909619-id-4938396.html 在基本分析完内核启动流程的之后,还有一个比较重要的初始化函数没有分析,那就是do_basic_setup。在内核init线程中调用了do_basic...
而do_initcalls将调用__initcall_start到__initcall_end中的所有函数 __initcall_start和__initcall_end定义在arch/arm/kernel/vmlinux.lds.S中 它是这样定义的: __initcall_start = .; *(.initcall1.init) *(.initcall2.init) *(.initcall3.init) ...
--->do_initcalls 在do_initcalls函数中,kernel会依次执行各个initcall函数,在这个过程中,会调用 customize_machine,具体如下: staticint__init customize_machine(void) { /* * customizes platform devices, or adds new ones * On DT based machines, we fall back to populating the ...
[调用路径:start_kernel --> rest_init --> kernel_init --> kernel_init_freeable --> do_basic_setup --> do_initcalls --> do_initcall_level --> do_one_initcall --> populate_rootfs --> unpack_to_rootfs],在内存中构造出根文件系统结构,mkbootfs工具是Android自己实现的,支持的功能也比cpio弱...