zoukankan      html  css  js  c++  java
  • Kernel启动时 驱动是如何加载的module_init,加载的次序如何;略见本文

    Init.h中有相关initcall的启动次序,在system.map中可看出具体的__initcall指针的前后次序

    #define pure_initcall(fn) __define_initcall("0",fn,0)

    #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)

    module_init在的启动序号为6,它的展开后就是__define_initcall("6",fn,6)

    #definedevice_initcall(fn) __define_initcall("6",fn,6)

    #define__initcall(fn) device_initcall(fn)

    #definemodule_init(x) __initcall(x);


    Kernel通过调用do_initcalls(void)加载模块,具体流程如下图:

    static void__init do_initcalls(void)

    {

    initcall_t*fn;

    for (fn =__early_initcall_end; fn < __initcall_end; fn++)

    do_one_initcall(*fn);

    /* Makesure there is no pending stuff from the initcall sequence */

    flush_scheduled_work();

    }

    因此驱动模块在Kernel启动过程中的启动次序是非常靠后的

    具体的每个驱动的启动次序可以从system.map看出,特别对于同一个优先级的各类驱动:

    c003288ct __initcall_i2c_init2

    c00328b0 t__initcall_video_early_init3

    c00328b4 t__initcall_video2_early_init3

    c00328b8t __initcall_aml_i2c_init3

    c0032c18t __initcall_i2c_dev_init6

    c0032c28 t__initcall_videodev_init6

    c0032c30t __initcall_v4l2_i2c_drv_init6

    c0032c34t __initcall_v4l2_i2c_drv_init6

    c0032d24 t__initcall_video_init6

    c0032d28 t__initcall_video2_init6

    对于同一级别的 __initcall的次序 主要由MakeFile中.o文件的链接次序决定,具体看Kernel下的主Makefile ---- Build vmlinux

    以及kernel/driver 下的obj-y

    /* end */

  • 相关阅读:
    SpringBoot异步处理请求
    5本最佳的 Java 面向对象理论和设计模式的书籍
    彻底弄懂 HTTP 缓存机制 —— 基于缓存策略三要素分解法
    Java 性能优化的五大技巧
    Java 8 最佳技巧
    Java 并发的四种风味:Thread、Executor、ForkJoin 和 Actor
    在 Java 8 中避免 Null 检查
    关于创建java线程池问题的思考
    LuoguP1858 多人背包(DP)
    Luogu[YNOI2019]排序(DP,线段树)
  • 原文地址:https://www.cnblogs.com/Ph-one/p/6097953.html
Copyright © 2011-2022 走看看