【问题标题】:Own RS232 device as linux filesystem device自己的 RS232 设备作为 linux 文件系统设备
【发布时间】:2017-09-24 19:19:34
【问题描述】:

有没有办法将自己的 RS232 AVR 设备公开为 Linux 文件系统设备,例如/dev/avr_device?程序必须写成内核空间模块还是用户空间? libfuse 可以做到这一点吗?也许我应该使用 FIFO 管道作为与设备的通信通道?

【问题讨论】:

  • 你的问题没什么意义。内核仅具有用于连接到 CPU 和/或受该 CPU 直接控制的控制器和外围设备的设备驱动程序。既然 “自己的 RS232 AVR 设备” 似乎是指 Linux 系统外部的一些 SBC,为什么那个 Linux 内核会有一个驱动程序和一个设备节点用于该板?顺便说一句,您似乎有点关注设备可以表示为文件的方面。
  • 如果有足够的工作量,您可能可以使用 Fuse 来做到这一点。但这种努力可能只有在您确实需要将您的设备建模为文件系统时才是合理的,并且并非所有硬件都可以从这种处理中受益。

标签: linux serial-port driver


【解决方案1】:

为了能够挂载一个您已经安装了 linux 文件系统的设备,您需要该设备是 块设备,但串行 tty 设备是 char 设备,不兼容。

为了能够在系统的经典视图中解决该问题,您需要开发一个块设备驱动程序,该驱动程序附加到该字符设备(串行端口)并使用它来控制块设备仿真协议,这意味着将块号和块数据转换为数据包,通过串行线路发送到另一端的接收器,实现作为某种存储设备的块设备细节。这可以通过一些努力来完成....问题是如果使用慢速串行线路来模拟任何类型的存储是有意义的。

最后一种方法的优点是您只需要模拟一个块设备,就可以创建任何可用于 linux 的本地文件系统。

在更高的层次上,你可以实现一个文件系统类型,它是一个更高层次的抽象(fuse 允许你这样做),但这使得这个问题变得更加困难,因为你必须实现每个文件系统原语(相信我,模拟文件系统的原语比块设备多得多)将每个远程原语实现为一组本地原语(这仅对单个程序员来说是不可行的)

第二种方法完全修复了文件系统的功能,并将您可以对文件执行的操作集完全修复为您编写的已实现原语。这要困难得多,并且通常与系统的其他部分缺乏一致性,因此我不建议您采用这种方法。

第二种方法只有一个优点,那就是:由于文件系统使用高级原语,这些原语可以更紧凑地编码到网络消息中,并且可以更有效地通过线路传输,从而为慢速连接提供更快的速度。但代价是必须实现所有文件系统功能,并失去使用这些文件系统的统一性(您必须实现用户访问、安全、请求缓存等)。

在第一种方法中,您只需实现 4 或 5 个原语,即可获得可安装在块设备上的任何文件系统的所有功能。

【讨论】:

    最近更新 更多