Как написать драйвер блочного устройства linux пользователя? - PullRequest
6 голосов
/ 15 февраля 2010

Я хотел бы написать драйвер блочного устройства 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

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

Спасибо, Andreas

Ответы [ 5 ]

10 голосов
/ 16 февраля 2010

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

Ваш пример относится к блочному устройству в режиме ядра, которое необходимо будет построить как модуль ядра. А поскольку внутреннее ядро ​​постоянно меняется, то, по-видимому, теперь оно несовместимо.

6 голосов
/ 14 октября 2010

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

4 голосов
/ 15 февраля 2010

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

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

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

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

3 голосов
/ 17 ноября 2013

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

0 голосов
/ 13 апреля 2019

Вы можете использовать NBD. Используя nbdkit , вы даже можете писать виртуальные блочные устройства на сценарии оболочки или других языках сценариев (хотя придерживайтесь C, если вы хотите наилучшую производительность). Я выступил с докладом на эту тему на FOSDEM 2019 , где я сделал живую демонстрацию написания блочного устройства ядра Linux в сценарии оболочки.

...