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 */

  • 相关阅读:
    numpy 基础 —— np.linalg
    图像旋转后显示不完全
    opencv ---getRotationMatrix2D函数
    PS1--cannot be loaded because the execution of scripts is disabled on this system
    打开jnlp Faild to validate certificate, the application will not be executed.
    BATCH(BAT批处理命令语法)
    oracle vm virtualbox 如何让虚拟机可以上网
    merge 实现
    Windows batch,echo到文件不成功,只打印出ECHO is on.
    python2.7.6 , setuptools pip install, 报错:UnicodeDecodeError:'ascii' codec can't decode byte
  • 原文地址:https://www.cnblogs.com/Ph-one/p/6097953.html
Copyright © 2011-2022 走看看