【发布时间】:2013-03-15 13:24:00
【问题描述】:
我正在学习如何将字符设备驱动程序编写为 Linux 的可动态加载模块。通常,我使用以下函数调用序列来注册设备并创建出现在/dev/ 下的设备文件:
alloc_chrdev_region(&first, 0, 1, "myclass");
myclass = class_create(THIS_MODULE, "myclass");
device_create(myclass, NULL, first, NULL, "mydevicefile");
cdev_init(&c_dev, &fops);
cdev_add(&c_dev, first, 1);
然后设备文件出现在/dev/mydevicefile,我可以与之交互。
这让我想知道如果传递一个现有的设备文件名而不是 "mydevicefile" 会发生什么:
device_create(myclass, NULL, first, NULL, "null");
这导致/dev/null 被我的字符设备文件替换——更令人担忧的是:我的控制台中出现了来自预期原始/dev/null 的守护进程的错误消息。甚至没有删除我的假 null 模块来解决这个问题。
虽然实际上不应该存在与我的模块使用的同名设备文件,但理论上可以覆盖另一个设备文件这一事实仍然困扰着我。
如何防止已经存在与我打算使用的设备文件同名的设备文件?
更新:我想我真正想知道的是为什么 udev 允许替换。
【问题讨论】:
标签: c linux linux-kernel linux-device-driver device-driver