【问题标题】:How to use linux device model and /sys filesystem?如何使用 linux 设备模型和 /sys 文件系统?
【发布时间】:2015-04-01 21:02:00
【问题描述】:

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

传统上,如果我想创建char设备,我只需要实现readwriteioctl函数,并通过register_chrdev_region注册它对应的Major device ID。然后使用mknod 创建那个Major device ID 的设备文件。然后在用户空间调用readwriteopen会被内核调用相应的函数。

但现在我正在研究 Linux device modelsys filesystem,它们是在内核 2.6 中添加的。如果可能的话,我被告知不要使用/dev filesystem,因为 linux 现在有一个很好的设备模型来处理设备和驱动程序。这让我很困惑,所以我将我的困惑总结为一些问题:

  1. 如何在 /sys 中创建字符设备?更具体地说,如何像/dev/null一样创建一个空设备?
  2. 如何从用户空间调用我的字符设备驱动程序函数?
  3. 听说udev是基于sys filesystem/dev创建设备文件。为什么?既然有人告诉我“如果可能,不要使用/dev filesystem”,为什么udev 使用/sys/dev 中创建文件?
  4. sys 中的文件是否有 char device fileblock device 之类的概念?
  5. /dev中,来自用户空间的openwrite最终会映射到我定义的file operation structure中的函数,那么当我打开或写入/ssy中的文件时会调用哪些函数?李>

【问题讨论】:

    标签: linux linux-device-driver sysfs


    【解决方案1】:

    没有上下文你的关于/dev的陈述不清楚。无论如何:

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

    2. 如果你的意思是你如何调用你的驱动程序的 open,read,write,ioctl, ... 好吧,通过执行 open(2), read(2), write(2), ioctl(2)(看在这些命令的手册页中)

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

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

    5. 实际上,在 sysfs 属性后面有一组 file_operation,其中打开、读取和写入由内核管理,而不是由您的驱动程序管理。为了创建 sysfs 属性,您必须提供一对函数 showstore 以从驱动程序读取/写入某些内容。然后内核会将请求路由到您的正确属性

    【讨论】:

    • 你提到的第三项是我所关心的。 “当设备出现时”是什么意思?在我打电话给register_chrdev_regioncdev_initcdev_add 之后,我可以从cat /proc/devices 获得信息,但似乎/sys 没有任何反应。我在/sys/dev/char中找不到我设备的任何信息
    • 我在第 3 点改进了我的答案。无论如何,当您执行 device_create() 时,如果您不这样做,请执行 :) 遵循网络上的随机示例 opensourceforu.com/2011/04/…
    相关资源