Как написать драйвер устройства блока userspace linux?

Я хотел бы написать драйвер устройства блока linux. Драйверу не нужно будет обращаться к оборудованию, чтобы оно могло быть в пространстве пользователей.

для начала я попытался построить пример драйвера блочного устройства С этим Makefile:

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

любая помощь будет принята с благодарностью.

спасибо, Андреас!--3-->

4 ответов


нет "официального" способа делать драйверы блоков в пользовательском пространстве, однако люди часто делают это с помощью (ab), используя драйвер NBD, чтобы поговорить по петлевой сети с демоном, который слушает обычный сокет и говорит протокол NBD. Дополнительную информацию см. В документах NBD.

ваш пример для блочного устройства в режиме ядра, которое необходимо будет построить как модуль ядра. И поскольку внутренние органы ядра всегда меняются, это, по-видимому, теперь несовместимо.


следуя предложению Маркра, можно даже обсудить протокол NBD через AF_UNIX пара сокетов, поэтому дополнительный локальный демон не нужен. Программа, реализующая этот протокол, должна будет настроить пару сокетов и разветвить ребенка. И родитель, и ребенок закрывают один конец пары сокетов. Один из них начинает принимать запросы на своем конце сокета, а другой подключает драйвер NBD к его концу сокета.


всегда смотрит на первую ошибку:

в вашем случае это выглядит как проблема с включенными файлами, например request_queue_t не определен.

поскольку это устаревший тип, вы, вероятно, используете версию linux / blkdev.h это новее, чем пример кода.

попробуйте добавить typedef struct request_queue request_queue_t;


при использовании NBD, как предлагалось ранее, хорошо, возможно, лучший способ (используемый, например, virtualbox-fuse) - сделать файловую систему FUSE, которая экспортирует один файл, который вы можете использовать через losetup.