我是开发Linux驱动程序的新手。
传统上,如果我想创建字符设备,我只需要实现read
write
和ioctl
函数,并通过register_chrdev_region
和相应的{{1}进行注册}}。然后使用Major device ID
创建mknod
的设备文件。然后在用户空间中调用Major device ID
read
write
,然后通过内核调用相应的函数。
但现在我正在学习open
和Linux device model
,这是在内核2.6中添加的。我告诉我,如果可能,请不要使用sys filesystem
,因为Linux现在有一个很好的设备模型来处理设备和驱动程序。这让我很困惑,所以我将我的困惑归结为一些问题:
/dev filesystem
?/dev/null
基于udev
在sys filesystem
中创建设备文件。为什么?由于我已告知"如果可能,请勿使用/dev
",为什么/dev filesystem
使用udev
在{{1}中创建文件}}?/sys
中的文件是否包含/dev
或sys
等概念?char device file
中,来自用户空间的block device
/dev
将最终映射到我定义的open
中的函数,然后在我打开或写入时将调用哪些函数write
中的文件?答案 0 :(得分:4)
没有上下文您的关于/dev
的陈述不清楚。无论如何:
您无法在sysfs上创建char设备。 sysfs的主要目的是导出信息并允许用户调整单个值(仅针对某些示例在/sys/
下导航)。 Char设备通常会做很多复杂的事情。
如果你的意思是你打电话给你的司机打开,读,写,ioctl,......好吧,做开(2),读(2),写(2),ioctl( 2)(查看这些命令的手册页)
当设备出现时,内核在/ sys下创建一个目录。例如,看看ls /sys/bus/usb/devices/
。出现USB设备时会创建所有目录。您可以尝试插拔USB设备。 udev
关注sysfs以检测新设备,并根据sysfs中的信息在/dev
下创建设备。当驱动程序以某种方式调用device_add()
时会发生这种情况。通常,此函数由其他寄存器函数调用,例如:device_create
,device_register
或其他子系统中的其他函数。
sysfs的想法是提供有关加载的设备和驱动程序的信息。因此,您可以更改设备,总线和驱动程序选项。或者手动将设备连接到模块
实际上,在sysfs属性后面有一组file_operation,其中open,read和write由内核管理,而不是由驱动程序管理。为了创建sysfs属性,您必须提供一对函数 show 和 store 来从/向驱动程序读取/写入内容。然后内核会将请求路由到您正确的属性