linux内核加载顺序(system.mp)

这篇博客详细介绍了Linux内核的加载顺序,从kernel入口函数start_kernel开始,包括driver_init、do_initcalls等阶段,按照不同优先级的initcall进行模块初始化。通过分析System.map文件,揭示了驱动加载顺序,解释了符号表的作用和内核中不同类型的符号(如全局函数、变量、静态函数等)。
摘要由CSDN通过智能技术生成


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_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值