2010-02-15 8 views
5

Vorrei scrivere un driver di periferica di blocco linux. Il driver non avrebbe bisogno di accedere all'hardware in modo che possa essere nello spazio utente.Come scrivere un driver del dispositivo a blocco di spazio utente in spazio libero?

Per iniziare, ho cercato di costruire an example block device driver 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 lo stdout e lo 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

+0

'sbd.c: 72: errore: previsto ')' prima del token '*' – mre

risposta

10

Non c'è 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 una presa normale e parla il protocollo NBD. Vedi i documenti NBD per maggiori informazioni.

L'esempio è per un dispositivo a blocchi in modalità kernel, che dovrà essere compilato come modulo del kernel. E poiché gli interni del kernel cambiano sempre, è presumibilmente ora incompatibile.

4

guarda sempre al primo errore:

Nel tuo caso sembra un problema con file include, ad esempio, request_queue_t non è definito.

Poiché si tratta di un tipo deprecato, si sta probabilmente utilizzando una versione di linux/blkdev.h che è più recente dell'esempio di codice.

Prova ad aggiungere typedef struct request_queue request_queue_t;

6

Seguendo il suggerimento di MarkR, è persino possibile parlare del protocollo NBD su una coppia di socket AF_UNIX, quindi non è necessario alcun daemon locale aggiuntivo. Il programma che implementa questo protocollo dovrà impostare la coppia di socket e lanciare un bambino. Sia il genitore che il bambino chiudono un'estremità della coppia di socket. Uno di questi inizia a ricevere richieste sulla sua estremità del socket mentre l'altro collega il driver NBD alla sua estremità del socket.

3

Durante l'utilizzo di NBD, come suggerito in precedenza, è bello, forse un modo migliore (utilizzato, ad esempio, virtualbox-fuse) è di creare un filesystem FUSE che esporta un file, che è possibile utilizzare tramite losetup.