在我的内核驱动程序项目中,我通过调用
注册一个动态主编号 register_chrdev(0, "xxxxx", &xxxxx);
并使用
取消注册我的模块 unregister_chrdev(0. "xxxxx");
当我使用insmod
加载我的驱动程序时,我收到了动态主编号,例如243,以及rmmod
之后的成功删除模块。
但是,删除模块/proc/devices
后仍显示主要编号(243)。
如何删除我的驱动程序以从/proc/devices
列表中删除其主要号码?
答案 0 :(得分:3)
当您使用0作为请求分配动态主编号的第一个参数调用register_chrdev()时,返回值将是您应保存的指定主编号。
然后当你调用unregister_chrdev()时,你应该将保存的主要号码作为参数传递,而不是你原来的0。还要确保设备名称参数匹配。请注意,此函数返回一个结果,您可以检查状态/失败 - 在后一种情况下,您肯定希望printk()一条消息,以便您知道您的代码不已完成其目标
您可以在http://www.tldp.org/LDP/lkmpg/2.6/html/x569.html看到一个完整的示例,关键部分是:
static int Major; /* Major number assigned to our device driver */
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
if (Major < 0) {
printk(KERN_ALERT "Registering char device failed with %d\n", Major);
return Major;
}
return SUCCESS;
}
void cleanup_module(void)
{
int ret = unregister_chrdev(Major, DEVICE_NAME);
if (ret < 0)
printk(KERN_ALERT "Error in unregister_chrdev: %d\n", ret);
}
另请注意,这种注册设备的方法被认为已过时 - 您可能希望研究更新的方法。