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

and*_*asw 6 c linux compiler-errors linux-device-driver

我想写一个linux块设备驱动程序.驱动程序不需要访问硬件,因此它可以在用户空间中.

首先,我尝试使用此Makefile 构建示例块设备驱动程序:

obj-m = sbd.o
KVERSION = $(shell pwd)
PWD = $(shell pwd)

all:
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
Run Code Online (Sandbox Code Playgroud)

然而,我得到这些错误,我不知道如何解决.这是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
Run Code Online (Sandbox Code Playgroud)

任何有关这方面的帮助将不胜感激.

谢谢,安德烈亚斯

Mar*_*rkR 10

在用户空间中没有"官方"方式来执行块驱动程序,但人们通常通过(ab)使用NBD驱动程序通过环回网络与守护程序进行通信,该守护程序侦听普通套接字并说出NBD协议.有关详细信息,请参阅NBD文档.

您的示例是针对内核模式块设备,需要将其构建为内核模块.由于内核内部总是在变化,所以现在可能是不兼容的.


hil*_*llu 6

根据MarkR的建议,甚至可以通过AF_UNIX套接字对来讨论NBD协议,因此不需要额外的本地守护进程.实现此协议的程序将需要设置套接字对并分叉子进程.父级和子级都关闭套接字对的一端.其中一个开始在套接字的末端接受请求,而另一个将NBD驱动程序连接到套接字的末尾.


Ofi*_*fir 5

总是查看第一个错误:

在您的情况下,它看起来像是包含文件的问题,例如 request_queue_t 未定义。

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

尝试添加typedef struct request_queue request_queue_t;


sch*_*uer 5

虽然按照之前的建议使用 NBD 很好,但也许更好的方法(例如 virtualbox-fuse 使用)是创建一个导出一个文件的 FUSE 文件系统,然后您可以通过 losetup 使用该文件。