1

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

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

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

经过大量搜索,我在 中找到struct buffer_head * bread(int dev,int block)linux/fs.h,但编译器抛出错误。

 error: implicit declaration of function ‘bread’

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


bread在旧内核中使用。

调查struct request *blk_get_request(struct request_queue *, int, gfp_t);_linux/blkdev.h


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

4

1 回答 1

0

不是内核开发人员,但有一些评论:

  • 隐式声明错误意味着您在调用函数时以某种方式找到的定义不在范围内。也许它隐藏在一个中,#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);

所以,除非你对在内核内部玩转特别感兴趣,否则我认为你不需要做任何内核模块来在用户进程之间做一个基本的存储协议。

于 2010-04-25T00:30:40.203 回答