如何编写用户空间Linux块设备驱动程序?

9
我想编写一个Linux块设备驱动程序。该驱动程序不需要访问硬件,因此可以在用户空间中运行。
首先,我尝试使用以下Makefile构建一个示例块设备驱动程序
obj-m = sbd.o
KVERSION = $(shell pwd)
PWD = $(shell pwd)

all:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules

然而,我遇到了这些错误,不知道该如何解决。以下是标准输出和标准错误:

make -C /lib/modules/2.6.31-19-generic/build M=/home/andreas/sp/nivoa/src/driver/sbd modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.31-19-generic'
  CC [M]  /home/andreas/sp/nivoa/src/driver/sbd/sbd.o
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:72: error: expected ‘)’ before ‘*’ token
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:128: warning: initialization from incompatible pointer type
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c: In function ‘sbd_init’:
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: ‘sbd_request’ undeclared (first use in this function)
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: (Each undeclared identifier is reported only once
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:143: error: for each function it appears in.)
/home/andreas/sp/nivoa/src/driver/sbd/sbd.c:146: error: implicit declaration of function ‘blk_queue_hardsect_size’
make[2]: *** [/home/andreas/sp/nivoa/src/driver/sbd/sbd.o] Error 1
make[1]: *** [_module_/home/andreas/sp/nivoa/src/driver/sbd] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.31-19-generic'
make: *** [all] Error 2

任何关于此的帮助将不胜感激。
谢谢, 安德烈亚斯

sbd.c:72: error: expected ‘)’ before ‘*’ token - mre
6个回答

15

目前没有一种“官方”的方法可以在用户空间中实现块驱动程序,然而人们经常通过(滥用)NBD驱动程序来进行操作,该驱动程序通过环回网络与一个守护进程通信,该守护进程监听普通套接字并使用NBD协议进行通信。有关更多信息,请参见NBD文档。

您的示例是针对内核模式块设备的,它需要构建为内核模块。由于内核内部始终在变化,因此可能不兼容。


7

根据MarkR的建议,甚至可以通过一个AF_UNIX套接字对话来使用NBD协议,因此不需要额外的本地守护程序。实现该协议的程序将需要设置套接字对并分叉出一个子进程。父进程和子进程都关闭套接字对的一端。其中之一开始在其套接字端口上处理请求,而另一个则将NBD驱动程序连接到其套接字端口上。


5

始终查看第一个错误:

在您的情况下,似乎是包含文件的问题,例如 request_queue_t 未定义。

由于这是一种已弃用的类型,您可能正在使用比代码示例更新的 linux/blkdev.h 版本。

尝试添加 typedef struct request_queue request_queue_t;


5
使用NBD,正如之前建议的那样,是不错的选择,但可能更好的方式(例如virtualbox-fuse使用的方式)是创建一个FUSE文件系统,导出一个文件,然后通过losetup使用该文件。

这是一个聪明而有趣的选择。可能性能上不会比通过nbd差太多(但这只是猜测)。 - Nande

1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接