首页 > 解决方案 > /sys/dev/char 如何在 Linux 中填充?

问题描述

我正在学习编写一个简单的内核模块,该模块实现open, read, write, close, ioctl用于在内核内存中读/写的系统调用(类似于共享内存/IPC 演示)。

我曾经呼吁mknod将驱动程序分配的主要/次要编号与字符文件绑定。但是我问自己为什么当我们将 USB pendrive 连接到系统时,我们并不总是需要手动这样做,我发现udev.

我知道如何在tree 和 notify中使用kobject_init_and_add()kobject_uevent()创建节点,但是在浏览文件夹时我注意到了该文件夹,其中包含指向设备的符号链接,名为. 我不明白为什么我在这里找不到我的驱动程序的主要/次要夫妇......我应该从模块内部手动执行其他操作吗?sysfsudev/sys/sys/dev/charmajor:minor

如何在 sysfs 树中找到关于如何正确描述和处理我的“虚拟”设备的完整但简单的示例?

标签: linuxlinux-kernelkerneldriverkernel-module

解决方案


在阅读了John Madieu的《 Linux 设备驱动开发》第 4 章后,我发现它比我想象的要容易:

为了自动实例化正确的字符设备抽象,您只需要在/sys函数的帮助下/dev创建一个,然后使用.struct classclass_create(...)device_create(...)

效果:假设你有一个类被调用并用主设备号和次设备号my_class调用设备,my_devicexxyy

  • /sys/class/my_class创建文件夹;
  • /sys/devices/virtual/my_class/my_device创建文件夹;
  • /sys/class/my_class/my_device符号链接指向/sys/class/my_class/my_device;
  • /sys/dev/char/xx:yy符号链接指向/sys/class/my_class/my_device;
  • /dev/my_device创建字符设备(因此不再mknod调用);

/sys/class/my_class/my_device文件夹非常有趣。它有:

  • dev文件:它包含major:minor数字;
  • uevent文件:如果你add在里面写,内核会重新发出adduevents;uevents 用于向用户空间守护进程发送信号,例如udev在 sysfs 树中创建/修改/删除内核对象;
  • subsystem符号链接:它指向/sys/class/my_class;
  • power文件夹:可能是这样的东西的一些接口。

永远记住在模块的退出函数中将每个 *_create 调用与 *destroy 调用匹配。

class_create, class_destroy, device_create,分别在和(内核源代码树中的路径)device_destroy中声明include/linux/device.h和定义。这些源文件中有很好的文档。drivers/base/class.cdrivers/base/core.c


推荐阅读