Pergunta

É possível compilar um Kernel Linux (2.6) módulo que inclui funcionalidade definida pelo não-kernel inclui?

Por exemplo:


kernelmodule.h

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>   // printk()
// ...
#include <openssl/sha.h>
// ...

Makefile

obj-m := kernelmodule.o
all:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` modules

clean:
    $(MAKE) -C /lib/modules/`uname -r`/build M=`pwd` clean
    $(RM) Module.markers modules.order

O módulo do kernel que tenho escrito e estão tentando compilação contém funcionalidade encontrada em um número de openssl incluir arquivos.

O makefile padrão apresentado acima não permite que inclui fora dos cabeçalhos do Linux. É possível incluir essa funcionalidade, e se assim for, você poderia por favor me aponte na direção certa.

Obrigado, Mike

Foi útil?

Solução

O kernel não pode usar o código de espaço do usuário e deve ficar sozinho (isto é, ser completamente auto-contido, sem bibliotecas), portanto, não pegar cabeçalhos padrão.

Não está claro qual o benefício tentando pegar cabeçalhos do espaço do usuário está. Se há coisas lá que seria válido para uso (constantes, alguns macros, talvez, desde que não chamar as funções do espaço do usuário), então ele pode ser melhor para duplicá-los e incluir partes apenas o kernel compatível que você precisa.

Não é possível ligar o kernel com bibliotecas projetadas para uso no espaço do usuário - mesmo se eles não fazem quaisquer chamadas OS -. Porque o ambiente ligando no kernel não pode buscá-las

Em vez disso, recompilação quaisquer funções para ser usado no kernel (assumindo que eles não fazem qualquer sistema operacional ou chamadas de biblioteca - por exemplo malloc - caso em que eles precisam ser modificados de qualquer maneira). Incorporá-las em sua própria biblioteca para ser usado em seus módulos do kernel.


As versões recentes do Linux contêm funções criptográficas de qualquer maneira, incluindo vários hashes SHA - talvez você pode usar um desses em vez

.

Outra idéia seria parar de tentar fazer criptografia no espaço do kernel e mover o código para userspace. código Userspace é mais fácil de escrever / debug / manter etc.

Outras dicas

Eu tomei pedaços de código userspace que tenho escrito e converteu-o para trabalhar no espaço do kernel (ou seja, usando kmalloc (), etc), não é tão difícil. No entanto, você está confinado a compreensão do núcleo de C, não userspace, que difere ligeiramente .. especialmente com vários tipos int padrão.

Apenas ligando contra o espaço do usuário DSO de não é possível - o kernel Linux é monolítico, completamente auto-contido. Ele não usa userspace libc, bibliotecas ou outros bits como os outros.

9/10 vezes, você vai encontrar o que você precisa em algum lugar no kernel. É muito provável que alguém correu para a mesma necessidade que você tem e escreveu algumas funções estáticas em algum módulo para fazer o que quiser .. basta pegar os e re-utilizá-los.

No caso de criptografia, como já foi dito, é só usar o que está no kernel. Uma coisa a nota, você vai precisar deles para estar habilitado KConfig que pode ou não acontecer dependendo do que o usuário seleciona quando construí-la. Então, atente para as dependências e ser explícito, você pode ter que cortar algumas entradas em KConfig que também selecionar a criptografia API que você quer quando seu módulo é selecionado. Fazer isso pode ser um pouco de dor quando a construção de fora da árvore.

Assim, no lado que temos "basta copiar e material de mudança de nome, acrescentando inchaço geral", por outro você tem "dizer às pessoas que devem ter o código fonte do kernel completo". É uma das peculiaridades que vêm com um kernel monolítico.

Com um Microkernel, quase tudo é executado em espaço de usuário, não se preocupe que ligam contra um DSO por algum motorista ... é um problema não. Por favor, não tome essa declaração como uma sugestão para re-início do kernel filosofia de design nos comentários, que não está no âmbito desta questão.

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