1.kernel 入口函数:
/*B.*/kernel/init/main.c://开始kernel的初始化等动作
asmlinkage void __init start_kernel(void)--->>rest_init();-->>do_basic_setup();
first====>>>driver_init();(初始化各种总线bus等)
then====>>>do_initcalls();
--即:调用"arch/arm/kernel/vmlinux.lds"里面的函数,施行各模块的初始化
--按照顺序调用的规则:
在不同的优先级中,数字越小,优先级越高。
同一优先级的驱动,初始化是和编译顺序有关的,并不是和设备列表一致。
(看来如果使用同一级别的初始化,执行顺序与编译顺序有关,如两个module_init模块,查看编译makefile)
__initcall_start = .;
*(.initcall1.init)
*(.initcall2.init)
*(.initcall3.init)
*(.initcall4.init) ____________kernel/drivers/module0
*(.initcall5.init) (仅仅限于build-in module) |___________kernel/drivers/module1
*(.initcall6.init)----build-in module 模块存放代码的位置-----|___________.....................
*(.initcall7.init) (为什么存放在第6段,可以另外查询资料) |__________kernel/drivers/moduleN
__initcall_end = .;
【补充定义】 在init.h 中有如下定义
#define pure_initcall(fn) __define_initcall("0",fn,1)
#define core_initcall(fn) __define_initcall("1",fn,1)
#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
#define postcore_initcall(fn) __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn) __define_initcall("3",fn,3)
#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn) __define_initcall("6",fn,6)///
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn) __define_initcall("7",fn,7)///
#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)
#define module_init(x) __initcall(x);
#define __initcall(fn) device_initcall(fn)
2.最后这些驱动加载的顺序,可以查文件system.map
(1).preloader/system.map@@@@./out/target/product/sangfei82_cwe_kk/obj/PRELOADER_OBJ/system.map
Archive member included because of file (symbol)
/home/tonylau/tony-workspace/new-v387/my-ap/mediatek/platform/mt6582/preloader/src/SecLib.a(seclib_boot.o)
../../out/target/product/sangfei82_cwe_kk/obj/PRELOADER_OBJ/obj/sec_boot.o (seclib_sec_boot_enabled)
/home/tonylau/tony-workspace/new-v387/my-ap/mediatek/platform/mt6582/preloader/src/SecLib.a(seclib_dl.o)
../../out/target/product/sangfei82_cwe_kk/obj/PRELOADER_OBJ/obj/download.o (seclib_sec_usbdl_enabled)
/home/tonylau/tony-workspace/new-v387/my-ap/mediatek/platform/mt6582/preloader/src/SecLib.a(seclib_img_hash.o)
../../out/target/product/sangfei82_cwe_kk/obj/PRELOADER_OBJ/obj/sec_auth.o (seclib_image_hash_compute)
/home/tonylau/tony-workspace/new-v387/my-ap/mediatek/platform/mt6582/preloader/src/SecLib.a(seclib_img_verify.o)
/home/tonylau/tony-workspace/new-v387/my-ap/mediatek/platform/mt6582/preloader/src/SecLib.a(seclib_boot.o) (seclib_image_verify)
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
(2).kernel/System.map@@@./out/target/product/sangfei82_cwe_kk/obj/KERNEL_OBJ/System.map
00000020 A cpu_v7_suspend_size
c0004000 A swapper_pg_dir
c0008000 T _text =============表示内核代码第一个字节的地址
c0008000 T stext
c0008050 t __create_page_tables
c0008104 t __turn_mmu_on_loc
c0008110 t __vet_atags
c0008180 T __exception_text_start
c0008180 T _stext
c0008180 T do_undefinstr
c0008354 T do_DataAbort
c000846c T do_PrefetchAbort
...................
...................
c0b194c0 r __modver_attr
c0b194c4 r __modver_attr
c0b194c8 r __modver_attr
c0b194cc R __stop___modver
c0b1a000 R __end_rodata
c0b1a000 t __fixup_smp
c0b1a000 T __init_