Как исправить зависимость от devm_kmallo c для драйвера phy? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь создать собственный phyDriver на моей машине с Ubuntu - 18.04. Версия ядра - 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);

Вот мой make-файл.

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.

1 Ответ

0 голосов
/ 05 марта 2020

Функции из ядра, которое вы хотите использовать, лицензированы по лицензии GPL, см. Ex. здесь . Чтобы использовать лицензированные по GPL функции из вашего модуля, ваш модуль также должен быть лицензирован по лицензии GPL. Вот что означает, что GPL является лицензией с «левым авторским правом» - чтобы использовать код, написанный под GPL (ie. Эти функции), вы должны написать свой код по лицензии, совместимой с GPL.

Так что если вы чувствую, что это лицензия вашего модуля под лицензией GPL:

MODULE_LICENSE("GPL");
...