【问题标题】:Access block level storage via kernel通过内核访问块级存储
【发布时间】:2011-05-10 22:06:34
【问题描述】:

如何通过内核访问块级存储(不使用 scsi 库)?

我的意图是通过网络实现块级存储协议以用于学习目的,几乎与 SCSI 的工作方式相同。请求将由发起者生成并发送到目标(两个用户空间程序),目标调用内核模块并使用 TCP 协议将数据返回给发起者。

到目前为止,我已经设法构建了一个简单的“Hello”模块并运行它(我是内核编程的新手),但无法继续进行块访问。

找了好久,在linux/fs.h中找到了struct buffer_head * bread(int dev,int block),但是编译器报错。

 error: implicit declaration of function ‘bread’

请帮忙,也请随时就内核编程提出建议。
谢谢!


bread 在旧内核中使用。

linux/blkdev.h 中查看struct request *blk_get_request(struct request_queue *, int, gfp_t);


访问块设备必须通过内核完成。

【问题讨论】:

  • 奇怪! SO 上没有内核开发人员吗?

标签: c linux-kernel kernel-module


【解决方案1】:

不是内核开发者,而是几个cmets:

  • 隐式声明错误意味着当您调用该函数时,您以某种方式找到的定义不在范围内。也许它隐藏在 #ifdef 中,或者您可能忘记包含 linux/fs.h

  • 关于 Linux 内核编程的建议,您可能需要查看 kernelnewbies.org

  • 有很多关于内核编程的书籍,但请注意内核中的细节变化非常快。旧书中的大部分概念仍然有效,但至少某些领域的一些细节会发生变化。

  • 最后,您可能不得不勇敢地访问 linux 内核邮件列表。很抱歉,这有点吓人,所以在发布问题之前,请尽量考虑周全。

  • 块级存储协议本身就是一项相当大的工作。也许您希望首先在用户空间中建立协议,让目标在进入内核之前直接访问例如/dev/sdc

当我更仔细地阅读您的问题时,您的主要兴趣似乎是该项目的存储协议方面。如果是这样,为什么需要修改内核。如果你有一个本地连接的磁盘,比如目标上的/dev/sdX,那么你可以在用户空间做这样的事情:

fd = open("/dev/sdX", O_RDWR);
pwrite(fd, buf, len, offset);
pread(fd, buf, len, offset);

所以,除非你特别有兴趣在内核中玩耍,否则我认为你不需要做任何内核模块来在用户进程之间建立基本的存储协议。

【讨论】:

  • bread 实际上用于较旧的内核(大约 0.1),我已经更新了这个问题。 (我查看了 kernelnewbies.org 和相关站点,还阅读了 Linux 设备驱动程序,但问题是内容要么非常简单,比如编写 Hello world 模块,要么已经过时)。能否请您详细说明最后一点?
  • 我其实只是想通过内核访问块存储。请求将在用户空间程序中生成,该程序会将其委托给内核,内核将完成所有工作。我怎样才能以这种方式访问​​说/dev/sdc
  • 您的问题有两个部分:(1)用户空间启动器和目标程序以及它们之间的协议,以及(b)如何访问目标上的存储设备。根据您想了解更多信息的领域,例如,您可以执行 (1),但只需通过 openreadwrite 等从用户空间对 /dev/sdX 执行常规 i/o。即,可以在用户空间中执行块设备 i/o。如果您的主要兴趣是内核的东西,那么从 (2) 开始,但将启动器/目标程序放在一边。这有帮助吗?
  • 不,我只需要通过内核访问设备。
  • 为什么只需要通过内核访问设备?那给你买什么?该设备有什么特别之处吗?你关心性能吗?当然,如果这是一个个人兴趣项目(到目前为止听起来很像),那么“因为我想要”的答案也很好。无论如何,如果您坚持通过内核获取设备,那很好,但恐怕我对 linux 内核的了解不够详细,无法提供帮助。
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2018-05-20
  • 2012-01-15
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多