如何修复 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 下获得许可,请参见 ex。 here。要从您的模块使用 GPL 许可功能,您的模块也需要根据 GPL 许可获得许可。这就是 GPL 是 "copyleft" 许可证的意思——要使用在 GPL 下编写的代码(即那些函数),您必须在与 GPL 兼容的许可证下编写代码。
因此,如果您觉得它在 GPL 下许可您的模块:
MODULE_LICENSE("GPL");
我正在尝试在我的 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 下获得许可,请参见 ex。 here。要从您的模块使用 GPL 许可功能,您的模块也需要根据 GPL 许可获得许可。这就是 GPL 是 "copyleft" 许可证的意思——要使用在 GPL 下编写的代码(即那些函数),您必须在与 GPL 兼容的许可证下编写代码。
因此,如果您觉得它在 GPL 下许可您的模块:
MODULE_LICENSE("GPL");