我正在学习如何将字符设备驱动程序编写为 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 允许更换。