簡體   English   中英

如何修復 phy 驅動程序對 devm_kmalloc 的依賴?

[英]How to fix dependency on devm_kmalloc for the phy driver?

我正在嘗試在我的 Ubuntu 機器 - 18.04 中構建一個自定義的 phyDriver。 內核版本為 5.3.0-40。 但是,我在 insmod 上遇到錯誤,例如 -

dmesg 告訴我 -

57810.400155] phyDriver: module license 'unspecified' taints kernel.
[57810.400156] Disabling lock debugging due to kernel taint
[57810.400196] phyDriver: Unknown symbol devm_kmalloc (err -2)
[57810.400234] phyDriver: Unknown symbol platform_driver_unregister (err -2)
[57810.400555] phyDriver: Unknown symbol __platform_driver_register (err -2)

我不確定為什么會收到devm_kmalloc()未知符號。 我正在使用devm_kzalloc()並且我相信這是在抱怨devm_kzalloc() 我的問題是如何解決這個問題。 我需要構建內核來添加這些調試符號還是有其他簡單的方法? 如果我必須構建內核,那么我需要在內核中啟用什么,以便我的驅動程序可以訪問這些符號,例如 - devm_kzalloc() platform_driver_register()

這是我的代碼片段:

static int phy_platform_probe(struct platform_device *pdev) { 

  struct custom_port_phy_platform_local *lp;
    int ret;

    lp  = devm_kzalloc(&pdev->dev,sizeof(struct custom_port_phy_platform_local),GFP_KERNEL);
    if (!lp) {
      dev_err(&(pdev->dev),"Failed to allocatate platform_local\n");
        return -ENOMEM;
    }
    platform_set_drvdata(pdev, lp);

    lp->dev = &pdev->dev;
    ret = custom_port_phy_mdio_setup(lp, pdev->dev.of_node);
    if (ret < 0) {
      dev_err(&(pdev->dev),"Failed to setup MDIO bus\n");
      return ret;
    }

    return 0;
}


static int __init phy_init(void)
{
   int ret = 0;
   ret = phy_driver_register(&custom_phy_driver, THIS_MODULE);
   if(ret < 0) {
       printk(KERN_ALERT "custom phy driver registration failed\r\n");
       return ret;
   }

   ret = platform_driver_register(&custom_phy_platform_driver);
   if(ret < 0) {
       phy_driver_unregister(&custom_phy_driver);
       printk("%s: Failed to register as Platform Driver\r\n", __func__);
       return ret;
   }

   return ret;
}

static struct platform_driver custom_phy_platform_driver = {
 .probe = phy_platform_probe,
 .remove = phy_platform_remove,
 #if 0
 .driver = {
    .name = "custom_port_phy"
    .of_match_table = port_phy_of_match,
 }
 #endif
};

module_init(phy_init);

這是我的makefile。

obj-m += phyDriver.o

all:
    make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build SUBDIRS=$(PWD) clean

我運行'make all'來構建phydriver.ko。 之后,我執行了 sudo insmod phydriver.ko,我在 dmesg 中看到了這些錯誤。

您要使用的內核中的功能在 GPL 下獲得許可,請參見示例。 在這里 要從您的模塊使用 GPL 許可的功能,您的模塊也需要在 GPL 許可下獲得許可。 這就是 GPL 是“copyleft”許可證的意思——要使用在 GPL 下編寫的代碼(即那些函數),您必須在與 GPL 兼容的許可證下編寫代碼。

因此,如果您覺得它在 GPL 下許可您的模塊:

MODULE_LICENSE("GPL");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM