Come scrivere un driver di periferica a blocchi userspace Linux?
-
20-09-2019 - |
Domanda
Vorrei scrivere un driver di periferica a blocchi di Linux. Il conducente non avrebbe bisogno di accedere all'hardware modo che possa essere nello spazio utente.
Per iniziare, ho cercato di costruire un driver di periferica a blocchi esempio con questo Makefile:
obj-m = sbd.o
KVERSION = $(shell pwd)
PWD = $(shell pwd)
all:
make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
Io però ottengo questi errori, che non so come risolvere. Ecco l'stdout e 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
Qualsiasi aiuto su questo sarebbe molto apprezzato.
Grazie, Andreas
Soluzione
Non è un modo "ufficiale" di fare i driver a blocchi in spazio utente, tuttavia la gente spesso lo fanno da (ab) utilizzando il driver NBD a parlare su una rete di loopback a un demone che ascolta su un socket normale e parla la protocollo NBD. Vedere la documentazione NBD per maggiori informazioni.
Il vostro esempio è per un dispositivo a blocchi in modalità kernel, che dovrà essere costruito come un modulo del kernel. E mentre le parti interne del kernel sono in continua evoluzione, è presumibilmente ormai incompatibili.
Altri suggerimenti
Seguendo il suggerimento di MarkR, è ancora possibile parlare il protocollo NBD su una coppia di socket AF_UNIX
, quindi non è necessario daemon extra in loco. Il programma implementazione di questo protocollo dovrà impostare la coppia di socket e fork di un bambino. Sia padre e figlio si chiudono un'estremità della coppia di socket. Uno di loro inizia a prendere le richieste sulla sua estremità del socket, mentre l'altro collega il conducente NBD alla sua fine della presa.
guarda sempre al primo errore:
Nel tuo caso si presenta come un problema di includere i file, ad esempio, request_queue_t non è definito.
Dal momento che questo è un tipo deprecato, probabilmente si sta utilizzando una versione di Linux / blkdev.h che è più recente l'esempio di codice.
Prova ad aggiungere typedef struct request_queue request_queue_t;
Mentre si utilizza NBD, come suggerito in precedenza, è bello, forse un modo migliore (utilizzato, ad esempio, virtualbox-fusibile) è quello di rendere un file system FUSE che esporta un file, che è possibile utilizzare tramite losetup.
È possibile utilizzare NBD. Utilizzando nbdkit si può anche scrivere dispositivi a blocchi virtuali in script di shell o altri linguaggi di scripting (anche se bastone per C se si desidera che le migliori prestazioni) . ho tenuto una conferenza su questo argomento al FOSDEM 2019 dove ho fatto una scrittura demo live un dispositivo a blocchi del kernel di Linux in script di shell.