如何使用 linux 设备型号和 /sys 文件系统?
How to use linux device model and /sys filesystem?
我是开发 Linux 驱动程序的新手。
传统上,如果我想创建字符设备,我只需要实现 read
write
和 ioctl
函数,并通过 register_chrdev_region
注册它与相应的 Major device ID
。然后使用 mknod
创建那个 Major device ID
的设备文件。然后调用read
write
open
in user space 会被内核调用相应的函数。
但是我现在正在研究Linux device model
和sys filesystem
,它们是在内核2.6中添加的。有人告诉我,如果可能的话,不要使用 /dev filesystem
,因为 linux 现在有一个很好的设备模型来处理设备并且 driver.This 使我感到困惑,所以我将我的困惑总结为一些问题:
- 如何在 /sys 中创建字符设备?更具体地说,如何创建一个空设备,就像
/dev/null
?
- 如何从用户space调用我的字符设备驱动函数?
- 听说
udev
是在sys filesystem
的基础上在/dev
中创建设备文件的。为什么?既然有人告诉我 "If possible, Don't use /dev filesystem
",为什么 udev
使用 /sys
在 /dev
中创建文件?
sys
中的文件是否有类似 char device file
或 block device
的概念?
- 在
/dev
中,用户space的open
write
最终会映射到我定义的file operation structure
中的函数,那么会调用哪些函数当我打开或写入 /ssy
? 中的文件时
没有上下文 你的 关于 /dev
的陈述不清楚。不管怎样:
您不能在 sysfs 上创建字符设备。 sysfs 的主要目的是导出信息并允许用户调整单个值(对于某些示例,只需在 /sys/
下导航)。字符设备通常会做很多复杂的事情。
如果你的意思是你如何调用你的 driver 的打开、读取、写入、ioctl,...好吧,通过打开(2)、读取(2)、写入(2)、ioctl(2)(查看这些命令的手册页)
当设备出现时,内核会在/sys 下创建一个目录。例如看看 ls /sys/bus/usb/devices/
。所有这些目录都是在 USB 设备出现时创建的。您可以尝试 plug/unplug 个 USB 设备。 udev
关注 sysfs 以检测新设备,并根据来自 sysfs 的信息在 /dev
下创建设备。当 driver 以某种方式调用 device_add()
时,就会发生这种情况。通常此函数由其他寄存器函数调用,例如:device_create
、device_register
或来自其他 sub-systems.
的其他函数
sysfs 的想法是提供有关设备和加载的 driver 的信息。因此您可以更改设备、总线和 driver 选项。或者手动将设备附加到模块
其实在sysfs的属性后面有一组file_operation,其中的打开、读写是由内核管理的,而不是你的driver。为了创建一个 sysfs 属性,你必须提供一对函数 show 和 store 到 read/write something from/to driver。然后内核会将请求路由到您正确的属性
我是开发 Linux 驱动程序的新手。
传统上,如果我想创建字符设备,我只需要实现 read
write
和 ioctl
函数,并通过 register_chrdev_region
注册它与相应的 Major device ID
。然后使用 mknod
创建那个 Major device ID
的设备文件。然后调用read
write
open
in user space 会被内核调用相应的函数。
但是我现在正在研究Linux device model
和sys filesystem
,它们是在内核2.6中添加的。有人告诉我,如果可能的话,不要使用 /dev filesystem
,因为 linux 现在有一个很好的设备模型来处理设备并且 driver.This 使我感到困惑,所以我将我的困惑总结为一些问题:
- 如何在 /sys 中创建字符设备?更具体地说,如何创建一个空设备,就像
/dev/null
? - 如何从用户space调用我的字符设备驱动函数?
- 听说
udev
是在sys filesystem
的基础上在/dev
中创建设备文件的。为什么?既然有人告诉我 "If possible, Don't use/dev filesystem
",为什么udev
使用/sys
在/dev
中创建文件? sys
中的文件是否有类似char device file
或block device
的概念?- 在
/dev
中,用户space的open
write
最终会映射到我定义的file operation structure
中的函数,那么会调用哪些函数当我打开或写入/ssy
? 中的文件时
没有上下文 你的 关于 /dev
的陈述不清楚。不管怎样:
您不能在 sysfs 上创建字符设备。 sysfs 的主要目的是导出信息并允许用户调整单个值(对于某些示例,只需在
/sys/
下导航)。字符设备通常会做很多复杂的事情。如果你的意思是你如何调用你的 driver 的打开、读取、写入、ioctl,...好吧,通过打开(2)、读取(2)、写入(2)、ioctl(2)(查看这些命令的手册页)
当设备出现时,内核会在/sys 下创建一个目录。例如看看
ls /sys/bus/usb/devices/
。所有这些目录都是在 USB 设备出现时创建的。您可以尝试 plug/unplug 个 USB 设备。udev
关注 sysfs 以检测新设备,并根据来自 sysfs 的信息在/dev
下创建设备。当 driver 以某种方式调用device_add()
时,就会发生这种情况。通常此函数由其他寄存器函数调用,例如:device_create
、device_register
或来自其他 sub-systems. 的其他函数
sysfs 的想法是提供有关设备和加载的 driver 的信息。因此您可以更改设备、总线和 driver 选项。或者手动将设备附加到模块
其实在sysfs的属性后面有一组file_operation,其中的打开、读写是由内核管理的,而不是你的driver。为了创建一个 sysfs 属性,你必须提供一对函数 show 和 store 到 read/write something from/to driver。然后内核会将请求路由到您正确的属性