【问题标题】:Block Device driver read/write from user application从用户应用程序读取/写入块设备驱动程序
【发布时间】:2015-05-15 15:26:01
【问题描述】:

根据我的个人经验,我正在尝试实现“简单文件系统”。为此,我创建了一个块设备驱动程序,我将使用它以块为单位执行读/写操作。现在我的问题是我应该如何从用户应用程序对块设备执行打开、读取、写入和关闭操作。

我真正在寻找的是一个函数,我可以使用它打开块设备/dev/sbd,如果成功,它会返回struct block_device。对于读/写功能,我可以向块设备struct request 发出请求,参数为“buffer,sectore_number,numbe_of_sectors”。

到目前为止,我只有 block_read()block_write() 函数。但似乎它们是特定于 BSD 的。我正在使用 Debain。

有人知道吗? 谢谢。

【问题讨论】:

  • 设备驱动程序由内核处理,用户应用程序永远无法直接访问。
  • 可以,但是在内核中加载设备驱动后,允许用户对驱动创建的文件/设备进行读/写操作。
  • 是的,但问题的编写方式并没有具体说明。此外,他没有指定这是他正在编写的用户模式代码还是内核模式代码,所以我必须假设用户模式。
  • 在第一段中,我提到我已经编写了设备驱动程序,并且我正在寻找在该设备上执行操作的函数。它是用户模式。
  • 这可能有点绕道,但是你知道FUSE吗?

标签: c linux-device-driver


【解决方案1】:

我一直在做类似的事情,编写一个与文件或设备一起工作的应用程序级文件系统。您正在编写的并不是真正的设备驱动程序,因为设备驱动程序由内核直接处理/使用。用户应用程序无法直接访问。无论如何,我想向您指出函数调用 open(2)、read(2)、write(2)、close(2)(所有这些函数的手册页第 2 节)。您将需要 unistd.h 头文件来使用它们。您可以在调用 read 和 write 时将读/写大小设置为块大小的倍数。但最终还是要经过内核。

编辑:经过进一步检查和 cmets,设备驱动程序确实在内核中。通常,驱动程序和应用程序之间没有直接联系,因为内核中有几层代码来抽象设备,因此它看起来与应用程序的其他所有内容相同。

有两种方法可以解决这个问题。一种是在系统调用树中建立一个或多个系统调用,将设备驱动程序的读/写例程暴露给应用程序。我的另一个想法是使用 ioctl(I/O 控制)系统调用来执行此操作,但此调用旨在控制实际设备。例如,硬盘使用读写命令来传输数据,但要与硬盘通信以获取有关它的信息,例如最后一个 LBA 是什么或获取它的身份,您将使用 IOCTL 来执行此操作。

希望这会有所帮助。

【讨论】:

  • 设备驱动我已经写好了。我正在寻找一种从用户应用程序访问该设备的方法。这些函数调用 open(2)、read(2)、write(2)、close(2) 没有用,因为它们在内部使用 vfs 调用。
  • 设备驱动是在内核还是应用程序?刚刚看到对原始问题的评论。由于代码是用户模式,因此您别无选择。您必须使用这些调用来打开、读取/写入和关闭您正在使用的文件/设备。
  • 你不能让它既是用户模式又是内核模式。这是一个或另一个。如果您的设备驱动程序确实在内核中,您可以建立一系列系统调用以允许应用程序直接访问它。有一个 ioctl 系统调用,但这些是特定于设备的,我对它们了解不多。
  • 我想你误会了。我在内核中有一个块设备驱动程序。我在用户模式下还有另一个用户应用程序(简单文件系统应用程序),它将打开块设备并执行读/写操作。
  • 我之前使用 KLM 向内核添加了系统调用。您所做的就是将入口点的地址加载到适当的向量中。确保先保存前一个,这样当您卸载 KLM 时,它可以恢复它。
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
相关资源
最近更新 更多