Pergunta

Eu gostaria de escrever um driver de dispositivo de bloco Linux. O motorista não precisaria acessar o hardware para que possa estar no espaço do usuário.

Para começar, eu tentei construir um exemplo de driver de dispositivo bloco Com este makefile:

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

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

No entanto, recebo esses erros que não sei corrigir. Aqui está o stdout e o 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

Qualquer ajuda neste assunto seria altamente apreciada.

Obrigado, Andreas

Foi útil?

Solução

Não existe uma maneira "oficial" de fazer drivers em bloco no espaço de usuários, no entanto, as pessoas costumam fazer isso por (AB) usando o driver da NBD para conversar sobre uma rede de loopback com um daemon que ouve em um soquete normal e fala o protocolo NBD. Veja os documentos da NBD para obter mais informações.

Seu exemplo é para um dispositivo de bloco de modo de kernel, que precisará ser construído como um módulo do kernel. E como os internos do kernel estão sempre mudando, presumivelmente agora é incompatível.

Outras dicas

Após a sugestão de Markr, é até possível conversar sobre o protocolo NBD sobre um AF_UNIX Par de soquete, então não é necessário daemon local extra. O programa que implementa esse protocolo precisará configurar o par de soquete e tirar uma criança. Pai e filho fecham uma extremidade do par de soquete. Um deles começa a receber pedidos na extremidade do soquete, enquanto o outro conecta o driver NBD à extremidade do soquete.

Sempre olha para o primeiro erro:

No seu caso, parece um problema com arquivos incluídos, por exemplo, request_queue_t não está definido.

Como esse é um tipo depreciado, você provavelmente está usando uma versão do Linux/Blkdev.h que é mais recente que o exemplo de código.

Tente adicionar typedef struct request_queue request_queue_t;

Enquanto o uso da NBD, como sugerido antes, é bom, talvez uma maneira melhor (usada por, por exemplo, o VirtualBox-Fuse) é fazer um sistema de arquivos de fusível que exporte um arquivo, que você pode usar via Losetup.

Você pode usar o NBD. Usando nbdkit Você pode até escrever dispositivos de bloco virtual em script de shell ou outros idiomas de script (embora siga C se você quiser o melhor desempenho). Eu dei uma palestra sobre este tópico no Fosdem 2019 onde fiz uma demonstração ao vivo escrevendo um dispositivo de bloco de kernel Linux no script de shell.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top