【问题标题】:Read/Write block directly to disk in linux kernel在linux内核中直接读/写块到磁盘
【发布时间】:2014-04-17 11:23:53
【问题描述】:

正如标题所说,我正在寻找如何在 linux 内核空间中直接将块读/写到磁盘(绕过文件系统)并直接与块 IO 层交互。

在阅读了一些内核代码后,我意识到 bio 是我应该使用的结构,以在块 IO 层实现这样的目标。但我不太了解 bio 的结构,也没有弄清楚我究竟是如何做到这一点的。

有什么帮助吗?谢谢

【问题讨论】:

  • 你是如何最终将块访问挂接到磁盘的?
  • 看看下面接受的答案。

标签: linux io operating-system kernel block


【解决方案1】:

如果你只是做一些简单的事情,你真的不需要搞 BIO。您可以做的是简单地打开块设备 (/dev/whatever),就好像它是一个文件一样。内核会做正确的事,并会为您提供用于读/写操作的“瘦”包装器。

关于从内核空间打开文件,这里有几个问题,已经回答了,比如这个:

How to read/write files within a Linux kernel module?

如果你想做一些更花哨的事情,你将不得不研究 FS 驱动程序的来源(在 fs/ 子目录中)以寻找示例。

【讨论】:

  • 我查看了上面的链接。该解决方案不再适用于 linux 2.6 及更高版本, vfs_read() 需要来自用户空间的缓冲区指针。并且该用户空间指针已被更深入地传递到 mm/filemap.c 中的 do_generic_file_aio_read() 中。我从这个地方迷路了。我正在考虑如何将数据放入内核空间而不是用户空间。有什么提示吗? THX
  • lxr.free-electrons.com/source/fs/exec.c#L799 - 看来, set_fs 完全符合您的要求(如链接问题中所述)。
  • 已经试过了。奇迹般有效!!!谢谢你,奥卡德。如需更多信息,如果其他人正在查看此问题,另一个有用的链接是:linuxjournal.com/article/8110?page=0,1 虽然链接谈到这不是您想要做的事情,但它会在本文后面显示如何做。
【解决方案2】:

如果有人对使用 Node.js 执行此操作感兴趣,我们昨天发布了一个原生插件,其中包含用于打开和使用块设备的帮助程序:https://github.com/ronomon/direct-io

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2015-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多