linux - /sys/dev/char 如何在 Linux 中填充?
问题描述
我正在学习编写一个简单的内核模块,该模块实现open, read, write, close, ioctl
用于在内核内存中读/写的系统调用(类似于共享内存/IPC 演示)。
我曾经呼吁mknod
将驱动程序分配的主要/次要编号与字符文件绑定。但是我问自己为什么当我们将 USB pendrive 连接到系统时,我们并不总是需要手动这样做,我发现udev
.
我知道如何在tree 和 notify中使用kobject_init_and_add()
和kobject_uevent()
创建节点,但是在浏览文件夹时我注意到了该文件夹,其中包含指向设备的符号链接,名为. 我不明白为什么我在这里找不到我的驱动程序的主要/次要夫妇......我应该从模块内部手动执行其他操作吗?sysfs
udev
/sys
/sys/dev/char
major:minor
如何在 sysfs 树中找到关于如何正确描述和处理我的“虚拟”设备的完整但简单的示例?
解决方案
在阅读了John Madieu的《 Linux 设备驱动开发》第 4 章后,我发现它比我想象的要容易:
为了自动实例化正确的字符设备抽象,您只需要在/sys
函数的帮助下/dev
创建一个,然后使用.struct class
class_create(...)
device_create(...)
效果:假设你有一个类被调用并用主设备号和次设备号my_class
调用设备,my_device
xx
yy
/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
在里面写,内核会重新发出add
uevents;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.c
drivers/base/core.c
推荐阅读
- c# - 如何解决“尚未为此应用程序或请求配置会话”。
- audio - ALSA-Sound:捕获线路输入
- docker - docker容器上的HDFS - 有可能吗?
- react-native - 从网站检索数据并在 React Native 上切换屏幕时出现问题
- vpn - 如何在 Google Colab 上连接 NordVPN?
- python - 如何遍历 JSON 对象?
- php - 带有 webhook 的 symfony 并发请求
- java - 如何在 JSONObject 中一一追加 HashMap
- html - 如何设置 Bootstrap div col 从中心开始?
- c++ - 使用 boost 进程间时查找共享内存的进程数