【问题标题】:module init function does nothing but a print in linux device driver, is the driver initialized during device tree parsing?模块 init 函数只在 linux 设备驱动程序中打印,驱动程序是否在设备树解析期间初始化?
【发布时间】:2021-03-01 18:57:53
【问题描述】:

在linux kernel 3.3中,drivers/mmc/host/dw-mmc.c文件有这部分。

static int __init dw_mci_init(void)
{
    return platform_driver_probe(&dw_mci_driver, dw_mci_probe);
}

static void __exit dw_mci_exit(void)
{
    platform_driver_unregister(&dw_mci_driver);
}

module_init(dw_mci_init);
module_exit(dw_mci_exit);

在内核启动过程中的某个时刻(实际上是在 start_kernel() 中,在 init_call 循环中),dw_mci_init 被调用(因为它带有 __init 标签),并且探测函数探测设备并安装驱动程序。几年前我修改了这个驱动来实现我们自己的 SD 卡控制器驱动。

现在,当我查看 linux 内核 5.4.21 时,同一文件的上述部分已更改为:

static int __init dw_mci_init(void)
{
    pr_info("Synopsys Designware Multimedia Card Interface Driver\n");
    return 0;
}

static void __exit dw_mci_exit(void)
{
}

module_init(dw_mci_init);
module_exit(dw_mci_exit);

驱动程序初始化函数只做一个打印。发生了什么?我猜在内核初始化的某个地方,内核会解析“设备树”(扁平设备树,.dtb 文件),然后找到并调用匹配的平台驱动程序来初始化设备和驱动程序。它是否正确?如果有,在内核源码哪里可以找到设备树(flattend device tree)解析和设备驱动安装操作?

【问题讨论】:

    标签: linux arm linux-device-driver device-driver


    【解决方案1】:

    发生了什么?

    驱动程序已拆分为单独的模块,以处理来自不同总线类型的设备。平台驱动程序位于“dw_mmc-pltfrm”模块中。 (这也处理由设备树节点配置的设备。)“dw_mmc-pci”模块中还有一个 PCI 驱动程序。旧的“dw_mmc”模块导出与总线类型特定的驱动程序模块相同的功能。

    在“dw_mmc-pltfrm.c”中,模块初始化和退出函数由辅助宏调用定义:

    module_platform_driver(dw_mci_pltfm_driver);
    

    【讨论】:

    • 谢谢,我搜索了 start_kernel() 但找不到它初始化驱动程序的位置(5.4 版中 init 调用的位置)您能否详细说明如何使用 module_platform_driver() 或 builtin_platform_driver初始化?
    • 啊,我找到了 start_kernel-> arch_call_rest_init -> rest_init -> kernel_init(a kernel_thread) -> kernet_init_freeable -> basic_setup -> do_initcalls。这是调用带有 builtin_platform_driver 宏的驱动程序的地方吗? (也许对于带有 device_initcall 宏的驱动程序来说似乎不是......放在 init.. 部分..)我不知道在哪里调用了带有 builtin_platform_driver 宏的驱动程序。
    • 我做了功课:从programmersought.com/article/22512423913stackoverflow.com/questions/18605653/… 我发现module_platform_driver 只是module_init,它只是在do_initcalls 后期调用的device_initcall。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多