module_init 函数体内的函数一定会执行吗?

在kernel4.4下,添加模块时,使用module_init来进行注册,发现在module_init中的一句log信息打印不出来,具体代码如下:

static const struct i2c_device_id xxxx_i2c_id[] = {
    {XXXX_I2C_NAME, 0},
    {}
};

static const struct of_device_id extpa_of_match[] = {
    {.compatible = "xxxx,xxxx_pa"},
    {}
};

static struct i2c_driver xxxx_i2c_driver = {
    .driver = {
           .owner = THIS_MODULE,
           .name = xxxxx_I2C_NAME,
           .of_match_table = extpa_of_match,
           },
    .probe = xxxx_i2c_probe,
    .remove = xxxx_i2c_remove,
    .id_table = xxxx_i2c_id,
};

static int __init xxxx_pa_init(void)
{
    int ret;

    // 就是这里的这句log信息,没有打印出来
    pr_info("%s enter, driver version: %s\n", __func__, XXXX_DRIVER_VERSION);

    ret = i2c_add_driver(&xxxx_i2c_driver);
    if (ret) {
        pr_info("%s Unable to register driver (%d)\n", __func__, ret);
        return ret;
    }
    return 0;
}

static void __exit xxxx_pa_exit(void)
{
    pr_info("%s enter\n", __func__);
    i2c_del_driver(&xxxx_i2c_driver);
}

module_init(xxxx_pa_init);
module_exit(xxxx_pa_exit);
static void __exit xxxx_pa_exit(void)
{
    pr_info("%s enter\n", __func__);
    i2c_del_driver(&xxxx_i2c_driver);
}

module_init(xxxx_pa_init);
module_exit(xxxx_pa_exit);

问题就是在xxxx_pa_init()中的这句

“pr_info("%s enter, driver version: %s\n", func, XXXX_DRIVER_VERSION);”

按照我的理解,kernel启动时,会按照一定的顺序优先级去执行通过module_init注册的函数体内的内容,那log应该是要打印出来的。

然而,神奇的事情发生了,(为了保密,将vendor信息用XXXX代替了),在上述代码中compatible中,定义的名字为" xxxx, xxxx_pa",其实原先dtsi里定义的名字就只有"xxxx, xxxx",并没有末尾的"_pa",后来我将这两者保持统一后,xxxx_pa_init()中的那句log又能打印出来了!!!

对此,有了疑惑:

compatible影响的应该只是我I2C设备能不能成功挂载上,为什么compatible不匹配,会影响前面语句的执行呢?这在内核启动的时候,是不是还存在着某些限定?

https://www.phpfans.net/ask/answer1/2137958802.html