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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top