我想写一个linux块设备驱动程序。驱动程序不需要访问硬件,因此它可以在用户空间中。
首先,我尝试使用此Makefile构建an example block device driver:
obj-m = sbd.o
KVERSION = $(shell pwd)
PWD = $(shell pwd)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
然而,我得到了这些我不知道如何修复的错误。这是stdout和stderr:
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
对此的任何帮助将不胜感激。
谢谢, 安德烈亚斯
答案 0 :(得分:10)
在用户空间中没有“官方”方式来执行块驱动程序,但人们经常通过(ab)使用NBD驱动程序通过环回网络与监听正常套接字的守护程序进行通信并说出NBD协议。有关详细信息,请参阅NBD文档。
您的示例适用于内核模式块设备,需要将其构建为内核模块。因为内核内部总是在变化,所以现在可能是不兼容的。
答案 1 :(得分:6)
遵循MarkR的建议,甚至可以通过AF_UNIX
套接字对谈论NBD协议,因此不需要额外的本地守护进程。实现此协议的程序将需要设置套接字对并分叉子进程。父级和子级都关闭套接字对的一端。其中一个开始在套接字的末尾接受请求,而另一个将NBD驱动程序连接到套接字的末尾。
答案 2 :(得分:4)
始终查看第一个错误:
在您的情况下,它看起来像包含文件的问题,例如request_queue_t未定义。
由于这是一个不推荐使用的类型,你可能正在使用比代码示例更新的linux / blkdev.h版本。
尝试添加typedef struct request_queue request_queue_t;
答案 3 :(得分:3)
虽然使用NBD,如前所述,很好,也许更好的方法(例如,用于virtualbox-fuse)是制作导出一个文件的FUSE文件系统,然后可以通过losetup使用。
答案 4 :(得分:0)
您可以使用NBD。使用nbdkit甚至可以用shell script或其他脚本语言编写虚拟块设备(尽管如果要获得最佳性能,请坚持使用C)。 I gave a talk about this topic at FOSDEM 2019,我进行了现场演示,用shell脚本编写了Linux内核块设备。