Como chamar uma função de nível do kernel no espaço do usuário [closed]

2

Eu desenvolvi algumas funções auxiliares no kernel. Eles são chamados por outras funções no kernel. Atualmente, eles fazem meu kernel panic customizado: (

Para depuração, eu os criei como um código passivo apenas no kernel, sem efeito na funcionalidade do kernel. Eu estou querendo saber se existe uma maneira de chamar essas funções no espaço do usuário depois de construir e executar?

    
por Ali Abbasinasab 20.07.2015 / 20:00

2 respostas

2

Você não pode fazer isso facilmente (chamar funções do kernel diretamente do espaço do usuário).

Você poderia fazer um módulo de kernel - fornecendo algum dispositivo - que, através da interface do dispositivo (por exemplo, read , write , ioctl naquele dispositivo) está chamando suas funções de kernel.

Você pode corrigir o kernel (mas eu não recomendo fazer isso) para adicionar um novo syscall chamando suas funções de kernel.

Você pode querer executar seu kernel com patches em um hipervisor ou em alguma VM

    
por 20.07.2015 / 20:51
2

Esta não é uma resposta direta à sua pergunta - eu acho que @BasileStarynkevitch está certo que, em geral, isso não é algo que você possa fazer facilmente / confiantemente, embora, pelo menos em teoria, seu código seja suficientemente abstrato (não realmente em quaisquer dependências do kernel), então eu suponho que você poderia vinculá-lo a um processo de espaço de usuário stub e testar dessa maneira.

Tendo dito que o kernel oferece algo que pode ser útil para você - UML (User Mode Linux) ( observe que, no momento em que este livro foi escrito, esta página parece estar inativa devido a problemas de infra-estrutura do sourceforge - esperamos que volte em breve)

A UML é um Linux ARCH especial que constrói todo o kernel como um executável do espaço do usuário. Quando este executável é executado, ele é acionado como o kernel normalmente faz, mas está contido no espaço de um processo do espaço do usuário. Isso significa que você pode ligar o GDB diretamente ao processo UML como faria com qualquer outro processo do userspace e depurar como normal, sem precisar mexer nos depuradores de kernel.

Você precisará pelo menos do seguinte:

  • A árvore de origem do kernel para qualquer sabor de kernel que você esteja usando.
  • Construa o kernel usando ARCH=um . Isso pode ou não ser fácil com qualquer kernel e configuração que você tenha. Etapas detalhadas estão na página do sourceforge, se isso voltar. Também mais informações aqui .
  • Para ativar este kernel, você também precisará de um sistema de arquivos para inicializar. Existem alguns pré-construídos aqui . Note que nem todos os sistemas de arquivos funcionarão com todos os kernels, então você deve escolher e escolher criteriosamente.
  • Estou assumindo que seu código faz parte de um módulo do kernel. Se assim for, você também terá que construir este módulo usando ARCH=um e insmod quando o processo do kernel UML estiver em execução.
por 20.07.2015 / 23:04