1

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

传统上,如果我想创建 char 设备,我只需要实现read writeioctl功能,并通过register_chrdev_region相应的Major device ID. 然后mknod用来创建那个的设备文件Major device ID。然后read write open在用户空间调用就会被内核调用相应的函数。

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

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

1 回答 1

3

没有上下文,您的陈述/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_create、、device_register或来自其他子系统的其他函数。

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

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

于 2015-03-31T20:53:44.293 回答