2

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

4

3 回答 3

2

所有的设备驱动程序/dev(在 一种方法是使用:

#include <unistd.h>  // for F_OK and access()

...

if( access( "/dev/null", F_OK ) != -1 ) {
    printf("File already exists!\n");
} else {
    printf("File doesn't exist!\n");
    // create new dev here
}

由于/dev/null 确实存在,您将看到“文件存在!” 这里

于 2013-03-15T13:41:13.337 回答
1
This resulted in /dev/null being replaced by my character device file

您可以使用 mknod 实用程序创建一个新的 NULL 设备文件

sudo mknod -m 0666 /dev/null c 1 3

于 2013-03-15T13:45:07.460 回答
0

设备节点的创建通常由用户空间操作处理。这是目的:通过解释来自的数据udev来填充和处理用户空间目录。/dev/sysfm

传递给device_create函数的名称只是一个建议的默认名称,它sysfm与有关设备的其他数据一起出现;最终由用户空间实用程序或用户决定如何处理该数据。

udev碰巧遇到同名设备时的默认行为是用新设备节点覆盖旧设备节点:http://marc.info/?l=linux-hotplug&m= 125559736630729

于 2013-03-15T18:25:10.757 回答