问题 如何在为设备驱动程序加载内核模块时自动在/ dev中创建设备?


我正在尝试开发Linux设备驱动程序,并且作为我的第一次尝试,我正在尝试开发具有以下文件选项的char设备驱动程序,

struct file_operations fops{  
.open=open_fun,  
.release=release_fun,  
.write=write_fun,  
.read=read_fun,  
};  

当我使用加载驱动程序时 insmod, 我看到 /proc/devices 列出char设备下的驱动程序,但我找不到它 /dev。谷歌搜索建议使用 mknod 在...创造一个deivce /dev 并将其与司机的主要和未成年人联系起来。但是,尝试这样做会导致“权限被拒绝”错误,即使以超级用户身份完成也是如此。

我该怎么做才能让设备出现 /dev 什么时候加载内核模块?我试过两个旧的(register_chrdev)和更新的版本(cdev_init & cdev_add注册设备,但没有一个工作。

谢谢,
米尔


11659
2018-01-02 04:03


起源

也可以看看: stackoverflow.com/questions/5970595/... - Eugene
可能重复 如何从Linux内核模块的init_module代码创建设备节点? - Ciro Santilli 新疆改造中心 六四事件 法轮功


答案:


你可能不得不这样做 创建一些udev规则 告诉系统您需要创建哪些设备节点。


3
2018-01-02 04:33





我可以看到其中的条目 /dev 通过在控制台上运行以下命令创建节点后

sudo mknod -m 0666 / dev / msio c 22 0

用户不是root用户,所以我不得不使用sudo。我的条目是 msio,分别是主要和次要编号22,0的字符设备。

如果可以以编程方式实现,我会告诉您。


3
2018-01-02 04:53



是的,可以通过编程方式创建设备节点。您可以使用 class_create() 和 device_create 为了那个原因。 @duskwuff提到的Udev系统将负责其余部分。 - Eugene
@Eugene谢谢。这有很大帮助。谢谢其他人。 - Mir


如果您可以在发行版中使用它,那么CONFIG_DEVTMPFS非常好用。您可以在启动时使用内核自动挂载(CONFIG_DEVTMPFS_MOUNT)或手动挂载(mount -t devtmpfs none / dev)。


2
2018-01-13 15:48





  • 包括头文件 LINUX / device.h中 和 LINUX / kdev_t.h

  • static struct class c_dev;

  • static struct dev_t dev;

添加以下API的驱动程序内部__init功能

  • cl = class_create(THIS_MODULE,“x”);

其中x - 加载驱动程序时在/ sys / class /中显示的名称。

  • 将device_create()内核api与device_create一起使用(cl,NULL,dev,NULL,“d”);

其中d - 在/ dev下创建的设备文件。

其中dev对于在使用期间初始化的第一个设备号是可变的 alloc_chrdev_region 用于动态分配驱动程序主要编号的API

如需进一步参考,请浏览链接 http://opensourceforu.com/2011/04/character-device-files-creation-operations/ 


2
2018-02-02 07:22





首先你必须使用: sudo mknod / dev / devicename c 81 0

它在/ dev中创建设备文件,但您必须赋予它读/写权限。这样做,

sudo chmod 777 / dev / devicename

完成!!!


0
2017-10-19 06:18