我正在尝试为Linux编写一个简单的字符设备驱动程序。我想使用函数device_create()
创建多个节点。所以我使用了不同的次要号码和相同的主号码。
device_create(cls, NULL, MKDEV(MAJOR(first),0), NULL, "sou_dev1");
device_create(cls1, NULL, MKDEV(MAJOR(first),1), NULL, "sou_dev2");
cls和cls1是结构类类型变量,返回值为class_create()
。
当我制作.ko文件并使用" insmod"将其插入内核时命令,然后在/ dev /目录中只创建一个节点,即sou_dev1。
如何创建sou_dev1和sou_dev2
答案 0 :(得分:0)
建议始终使用动态分配。我建议使用更直接的misc_register()
和misc_unregister()
。请参阅标题linux/miscdevice.h。这是一些示例代码。
/*implemented these functions*/
const struct file_operations chr_fops = {
.write = chr_write,
.read = chr_read,
.owner = THIS_MODULE,
};
static struct miscdevice my_dev1 = {
.minor = MISC_DYNAMIC_MINOR,
.name = "/dev/MYDEVNAME1",
.fops = &chr_fops
};
static struct miscdevice my_dev2 = {
.minor = MISC_DYNAMIC_MINOR,
.name = "/dev/MYDEVNAME2",
.fops = &chr_fops
};
int init_module(void)
{
int ret;
ret = misc_register(&my_dev1);
if (ret != 0) {
pr_err("misc_register() failed");
return ret;
}
pr_info("device registered: %s\n", "/dev/MYDEVNAME1");
ret = misc_register(&my_dev2);
if (ret != 0) {
pr_err("misc_register() failed");
return ret;
}
pr_info("device registered: %s\n", "/dev/MYDEVNAME2");
return ret;
}
void cleanup_module(void)
{
do_cleanup_func();
misc_deregister(&my_dev);
pr_info("device unregistered\n");
}