【问题标题】:How to write a userspace linux block device driver?如何编写用户空间 linux 块设备驱动程序?
【发布时间】:2011-01-17 00:34:21
【问题描述】:

我想写一个 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

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

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

标签: c linux compiler-errors linux-device-driver


【解决方案1】:

总是查看第一个错误:

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

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

尝试添加typedef struct request_queue request_queue_t;

【讨论】:

    【解决方案2】:

    在用户空间中并没有“官方”的方式来执行块驱动程序,但是人们通常通过(ab)使用 NBD 驱动程序通过环回网络与监听正常套接字并说出NBD 协议。有关详细信息,请参阅 NBD 文档。

    您的示例适用于内核模式块设备,需要将其构建为内核模块。而且由于内核内部总是在变化,它现在大概是不兼容的。

    【讨论】:

      【解决方案3】:

      按照 MarkR 的建议,甚至可以通过 AF_UNIX 套接字对来使用 NBD 协议,因此不需要额外的本地守护程序。实现此协议的程序将需要设置套接字对并派生一个子节点。父母和孩子都关闭套接字对的一端。其中一个开始在其套接字末端接受请求,而另一个将 NBD 驱动程序连接到其套接字末端。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          您可以使用 NBD。使用nbdkit,您甚至可以用shell script 或其他脚本语言编写虚拟块设备(如果您想要获得最佳性能,请坚持使用C)。 I gave a talk about this topic at FOSDEM 2019 在那里我做了一个现场演示,用 shell 脚本编写 Linux 内核块设备。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-29
            相关资源
            最近更新 更多