2010-02-15 10 views
5

Me gustaría escribir un controlador de dispositivo de bloque de Linux. El controlador no necesitaría acceder al hardware para que pueda estar en el espacio de usuario.Cómo escribir un controlador de dispositivo de bloque de usuario de Linux?

Para empezar, he intentado construir an example block device driver con este Makefile:

obj-m = sbd.o 
KVERSION = $(shell pwd) 
PWD = $(shell pwd) 

all: 
    make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules 

sin embargo consigo estos errores, que no sé cómo solucionarlo. Aquí está la stdout y 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 

Cualquier ayuda sobre esto sería muy apreciada.

Gracias, Andreas

+0

'sbd.c: 72: error: expected ')' before '*' token' – mre

Respuesta

10

No hay una manera "oficial" de hacer los conductores de bloque en el espacio de usuario, sin embargo, la gente a menudo lo hacen por (ab) utilizando el controlador NBD para hablar sobre una red de bucle de retorno a un demonio que escucha en un socket normal y habla el protocolo NBD. Consulte los documentos de NBD para obtener más información.

Su ejemplo es para un dispositivo de bloque en modo kernel, que tendrá que ser construido como un módulo kernel. Y como las partes internas del núcleo siempre están cambiando, presumiblemente ahora es incompatible.

4

siempre se ve en el primer error:

En su caso se ve como un problema incluir archivos, por ejemplo, request_queue_t no está definido.

Dado que es un tipo obsoleto, probablemente esté utilizando una versión de linux/blkdev.h que es más reciente que el ejemplo del código.

Trate de añadir typedef struct request_queue request_queue_t;

6

Siguiendo la sugerencia de MarkR, incluso es posible hablar el protocolo NBD sobre un par de sockets AF_UNIX, por lo que no se necesita un daemon local adicional. El programa que implementa este protocolo necesitará configurar el par de socket y bifurcar a un niño. Tanto el padre como el hijo cierran un extremo del par de sockets. Uno de ellos comienza a recibir solicitudes en el extremo del zócalo, mientras que el otro conecta el controlador NBD a su extremo del zócalo.

3

Si bien utilizar NBD, como se sugirió anteriormente, es bueno, quizás una mejor manera (utilizada por, por ejemplo, virtualbox-fuse) es crear un sistema de archivos FUSE que exporte un archivo, que luego puede usar vía losetup.

Cuestiones relacionadas