Я пытаюсь создать собственный 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.