Я хотел бы записать драйвер блочного устройства Linux. Драйвер не должен был бы получать доступ к аппаратным средствам, таким образом, это может быть в пространстве пользователя.
Для запуска я попытался создать драйвер блочного устройства в качестве примера с этим Make-файлом:
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
Не существует "официального" способа создания блочных драйверов в пользовательском пространстве, однако люди часто делают это, (ab) используя драйвер NBD для связи по петлевой сети с демоном, который прослушивает обычный сокет и сообщает Протокол NBD. Дополнительную информацию см. В документации NBD.
Ваш пример относится к блочному устройству режима ядра, которое должно быть построено как модуль ядра. И поскольку внутреннее устройство ядра постоянно меняется, оно, по-видимому, теперь несовместимо.
Всегда смотрит на первую ошибку:
В вашем случае это похоже на проблему с включаемыми файлами, например request_queue_t не определен.
Поскольку это устаревший тип, вы, вероятно, используете более новую версию linux / blkdev.h, чем в примере кода.
Попробуйте добавить typedef struct request_queue request_queue_t;