从char驱动程序

时间:2016-07-06 08:10:38

标签: linux-kernel filesystems linux-device-driver

我有一个现有的Linux设备驱动程序,它将一个基本的char设备暴露给userland。 (我不是原作者,但我试图修改它。)

目前它提供了一个迷宫的ioctl函数来做各种事情(虽然也包含在一个方便的库中,所以大多数用户代码都不需要处理它的细节)。

它所做的一件事就是提供一个子流接口,给出一堆特定于设备的识别信息(包括字符串和一些数字ID),它可以读取或写入(但不能同时读取或写入)一些严格按顺序排列的数据(最多可达少量MB)。目前,它使用明确的ioctls。

我想知道是否有办法利用现有的file_operations基础设施或类似工具来提供虚拟文件系统或仅提供可以返回新的已打开的fd的ioctl然后可以与用户专区的read / write / close(但不是lseek)一起使用,正如您通常所期望的那样?

设备确实有一个文件名的概念(即字符串)但是不可能枚举现有的有效文件名(只是尝试打开一个特定的文件名并查看它是否给出错误) ,文件名不足以自行打开流,这就是为什么我现在更倾向于特别开放"在父设备上进行ioctl而不是尝试直接在某些用户可见的fs中直接显示内容,这些fs可以直接open。 (此外,没有子目录的概念,只有基本的写保护权限,所以无论如何,完整的fs似乎有点过分。)但是,如果有更好的方法,我愿意被说服。它

我之前从头开始编写基本的字符驱动程序,所以我有理由相信我可以读取/写入操作和其他支持的工作;我只是不确定如何最好地处理打开手柄的初始步骤。

我目前正在定位内核3.2 +。

编辑:我认为制作一个实际的文件系统(或尝试通过procfs或sysfs公开它)的主要原因是无法工作的是没有办法填充一个目录 - 唯一可用的操作是"打开读取"并且"打开写入",并且在打开尝试之前无法确定哪些名称有效(文件存储在外部硬件中并通过我无法更改的协议访问)。如果我遗漏了某些东西,并且有可能支持这类事情,那么这也是有用的。

1 个答案:

答案 0 :(得分:0)

你当然可以创建一个文件系统,其中没有实现readdir(),但是open()方法是。它通常没有完成,因为它不是特别用户友好,但它确实是可行的。

如果您正在查看3.2,那么您将瞄准真正古老的内核 - 上游内核开发人员甚至不愿意尝试来向后推送安全修复程序,所以我当然不会推荐像3.2这样古老的东西,但它在技术上是可行的。

您需要做的就是在目录的inode_operations结构中实现lookup()方法。您需要找出一些创建具有唯一inode编号的inode的方法,其中包含私有信息,以便您可以识别子流。 inode将具有file_operations结构,该结构实现读/写方法以读取和写入子流。

您可以尝试查看一个简单的文件系统,例如cramfs或minix,看看事情是如何完成的。