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

时间:2015-03-31 14:18:41

标签: linux linux-device-driver sysfs

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

传统上,如果我想创建字符设备,我只需要实现read writeioctl函数,并通过register_chrdev_region和相应的{{1}进行注册}}。然后使用Major device ID创建mknod的设备文件。然后在用户空间中调用Major device ID read write,然后通过内核调用相应的函数。

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

  1. 如何在/ sys中创建char设备?更具体地说,如何像/dev filesystem
  2. 一样创建一个空设备
  3. 如何从用户空间调用我的字符设备驱动程序功能?
  4. 我听说/dev/null基于udevsys filesystem中创建设备文件。为什么?由于我已告知"如果可能,请勿使用/dev",为什么/dev filesystem使用udev在{{1}中创建文件}}?
  5. /sys中的文件是否包含/devsys等概念?
  6. char device file中,来自用户空间的block device /dev将最终映射到我定义的open中的函数,然后在我打开或写入时将调用哪些函数write中的文件?

1 个答案:

答案 0 :(得分:4)

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

  1. 您无法在sysfs上创建char设备。 sysfs的主要目的是导出信息并允许用户调整单个值(仅针对某些示例在/sys/下导航)。 Char设备通常会做很多复杂的事情。

  2. 如果你的意思是你打电话给你的司机打开,读,写,ioctl,......好吧,做开(2),读(2),写(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,其中open,read和write由内核管理,而不是由驱动程序管理。为了创建sysfs属性,您必须提供一对函数 show store 来从/向驱动程序读取/写入内容。然后内核会将请求路由到您正确的属性