Como posso testar meu motorista é carregado e depois acessar minhas funções de driver no kernel Linux?

StackOverflow https://stackoverflow.com/questions/1693575

Pergunta

Eu tenho um driver que compila e carrega no kernel Linux muito bem. Nesse driver estão algumas funções que eu gostaria de acessar do arquivo do kernel 'fs/readdir.c'. Além disso, como posso testar se um driver é carregado?

Eu preciso de algo como o seguinte.

if(myDriver is loaded){
    myDriver.functionCall();
}

Todos os exemplos que encontrei nas pesquisas na Internet estão fazendo isso nos aplicativos do UsuáriosPace.

Foi útil?

Solução

A outra possibilidade é usar EXPORT_SYMBOL(functionCall); No seu módulo, que fará sua função aparecer na tabela de símbolos do kernel. Você pode então usar find_symbol("functionCall", blah, blah) Para verificar se o símbolo existe e encontrar seu valor/localização dinamicamente.

Consulte Linux/kernel/module.c e módulo.h

Outras dicas

fs/readdir.c não vincularia se o functionCall O símbolo ainda não está no kernel. Você só pode fazer isso através da indireção. Configure alguns ops estrutura no código principal do kernel, inicie -o para funções fictícias, ou apenas NULLS para dizer ao restante do kernel que seu motorista ainda não está carregado. Na rotina de inicialização do driver, defina os ponteiros de função nessa estrutura como funções no seu módulo (redefinir para os padrões em desinitos). A estrutura precisará de alguma forma de proteção de raça, então você provavelmente acabaria tendo um semáforo como um de seus membros. Isso pode ser expandido para a estrutura por dispositivo, etc.

Você pode adicionar um ponteiro de função a functionCall No kernel, inicialize-o para NULL e aguarde o módulo definir o ponteiro como um valor não nulo. O código no Readdir verificaria o ponteiro não-nulo antes de desreferencia-o. Isso exige que o módulo saiba sobre o ponteiro da função no kernel, tornando o ponteiro global ou igualmente fácil de acessar de um módulo.

Se você não deseja que o motorista saiba sobre essa modificação no kernel, você pode modificar o ReadDir para procurar o motorista para carregar e depois usar find_symbol (como mencionado por @chrisharris) para obter o endereço de functionCall, e atribua o valor retornado a algum ponteiro de função privada em algum lugar do ReadDir.

Uma maneira de responder à pergunta "é o driver carregado" seria usar register_module_notifier()

static int
my_load_notify(struct notifier_block *self, unsigned long val, void *data)
{
 struct module *m = data;
 if (0 == strcmp(m->name, "myDriver")) {
  // set function pointer(s)
 }
}
static struct notifier_block module_load_nb = {
 .notifier_call = my_load_notify,
};

static int
my_init(void)
{
 ...
 register_module_notifier(&module_load_nb);
 ...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top