如何使用 linux 设备型号和 /sys 文件系统?

How to use linux device model and /sys filesystem?

我是开发 Linux 驱动程序的新手。

传统上,如果我想创建字符设备,我只需要实现 read writeioctl 函数,并通过 register_chrdev_region 注册它与相应的 Major device ID。然后使用 mknod 创建那个 Major device ID 的设备文件。然后调用read write open in user space 会被内核调用相应的函数。

但是我现在正在研究Linux device modelsys filesystem,它们是在内核2.6中添加的。有人告诉我,如果可能的话,不要使用 /dev filesystem,因为 linux 现在有一个很好的设备模型来处理设备并且 driver.This 使我感到困惑,所以我将我的困惑总结为一些问题:

  1. 如何在 /sys 中创建字符设备?更具体地说,如何创建一个空设备,就像 /dev/null?
  2. 如何从用户space调用我的字符设备驱动函数?
  3. 听说udev是在sys filesystem的基础上在/dev中创建设备文件的。为什么?既然有人告诉我 "If possible, Don't use /dev filesystem",为什么 udev 使用 /sys/dev 中创建文件?
  4. sys 中的文件是否有类似 char device fileblock device 的概念?
  5. /dev中,用户space的openwrite最终会映射到我定义的file operation structure中的函数,那么会调用哪些函数当我打开或写入 /ssy?
  6. 中的文件时

没有上下文 你的 关于 /dev 的陈述不清楚。不管怎样:

  1. 您不能在 sysfs 上创建字符设备。 sysfs 的主要目的是导出信息并允许用户调整单个值(对于某些示例,只需在 /sys/ 下导航)。字符设备通常会做很多复杂的事情。

  2. 如果你的意思是你如何调用你的 driver 的打开、读取、写入、ioctl,...好吧,通过打开(2)、读取(2)、写入(2)、ioctl(2)(查看这些命令的手册页)

  3. 当设备出现时,内核会在/sys 下创建一个目录。例如看看 ls /sys/bus/usb/devices/。所有这些目录都是在 USB 设备出现时创建的。您可以尝试 plug/unplug 个 USB 设备。 udev 关注 sysfs 以检测新设备,并根据来自 sysfs 的信息在 /dev 下创建设备。当 driver 以某种方式调用 device_add() 时,就会发生这种情况。通常此函数由其他寄存器函数调用,例如:device_createdevice_register 或来自其他 sub-systems.

  4. 的其他函数
  5. sysfs 的想法是提供有关设备和加载的 driver 的信息。因此您可以更改设备、总线和 driver 选项。或者手动将设备附加到模块

  6. 其实在sysfs的属性后面有一组file_operation,其中的打开、读写是由内核管理的,而不是你的driver。为了创建一个 sysfs 属性,你必须提供一对函数 showstore 到 read/write something from/to driver。然后内核会将请求路由到您正确的属性