2010-02-15 2 views
5

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

Для начала, я пытался построить an example block device driver с этим 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 

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

Спасибо, Andreas

+0

'sbd.c: 72: ошибка: ожидается ')' перед '*' токеном' – mre

ответ

10

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

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

4

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

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

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

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

6

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

3

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

Смежные вопросы