Adicionando módulo ao kernel

Adicionando módulo ao kernel
Passaremos pelo processo ou etapas necessárias para adicionar um módulo de kernel enquanto o kernel está funcionando. Também discutiremos os poucos utilitários linux úteis disponíveis. Esses utilitários podem ser empregados para obter informações sobre o módulo já presentes no kernel Linux, adicionar um novo módulo e obter as informações sobre o módulo fornecido.

Descrição

Vamos começar com o módulo do kernel; O módulo do kernel é a funcionalidade lógica separada que pode ser adicionada posteriormente no kernel em execução. Isso estende os recursos/funções do kernel Linux.

Esses módulos são arquivos com a extensão como “.ko ”, que significa objetos de kernel. Se encontrarmos algum arquivo com “.ko ”como uma extensão, indica claramente que é um módulo de kernel.

Alguns exemplos de nomes de módulos são: módulos i2c.Ko, Hello-World.ko, etc.

O processo de adição de um módulo de kernel ao kernel também é conhecido como carregamento de um módulo de kernel. O módulo do kernel só pode ser carregado se for compatível com a árvore de origem do kernel. Isso significa que o módulo do kernel não é independente da plataforma. Estes podem ser carregados apenas no kernel com a mesma árvore de origem e construir configuração.

Adicionando/carregando o módulo do kernel

Linux fornece um utilitário conhecido como "insmod". Este é o utilitário que pode ser usado para carregar o módulo do kernel no kernel em execução.

Para carregar o módulo do kernel, basta executar o comando como insmod seguido pelo nome do arquivo do módulo.

Vamos dar um exemplo de Hello-World.Ko, um módulo que é o exemplo clássico e apenas imprime a mensagem do Hello World. Para carregar o módulo Hello World Kernel, abaixo está o comando que pode ser usado:

Um instantâneo de amostra está conectado abaixo; O arquivo destacado é o módulo do kernel:

$ sudo insmod hello-world.Ko

Exemplo de instantâneo:

Com a execução bem-sucedida do comando acima, nosso módulo é adicionado ao kernel Linux, e veremos a mensagem de impressão do módulo Hello World Kernel no buffer Printk. Para verificar a mensagem do Hello-World, use o comando DMESG. Se o comando resultar em nenhuma mensagem de erro, poderá ser considerado a adição do módulo é bem -sucedida. À medida que estamos ampliando as funções do kernel, é necessário que os privilégios de super usuários executem o "insmod". Exemplo de saída do comando DMESG está como abaixo:

Sushilrathore-2: ~/Hello-World $ sudo Insmod Hello-World.Ko
Sushilrathore-2: ~/Hello-World $ dmesg
[10500712.434672] Hello World
Cienauser@haxv-srathore-2: ~/hello-world $

Confirmando o módulo está carregado

Para confirmar se o módulo está carregado e presente entre os outros módulos no kernel Linux. O comando "lsmod" pode ser usado para listar todos os módulos do kernel. Emitir o comando no shell Linux e veremos a lista completa dos módulos carregados no kernel Linux. Emitindo o LSMOD no meu sistema, vejo a saída abaixo no console:

Sushilrathore-2: ~/Hello-World $ lsmod
Tamanho do módulo usado por
hello_world 16384 0
nf_conntrack_ipv6 20480 0
nf_defrag_ipv6 20480 1 nf_conntrack_ipv6
ip6table_filter 16384 0
ip6_tables 28672 1 ip6table_filter
nf_conntrack_ipv4 16384 0
nf_defrag_ipv4 16384 1 nf_conntrack_ipv4
xt_recent 20480 0
xt_conntrack 16384 0
nf_conntrack 135168 3 xt_conntrack, nf_conntrack_ipv6, nf_conntrack_ipv4
CPUID 16384 0
iptable_filter 16384 1
ipmi_devintf 20480 0
ipmi_msghandler 53248 1 ipmi_devintf

Como podemos ver nos logs acima, existem muitos módulos listados, e nosso módulo Hello-World também está na lista; e eu o destaquei para fácil manchas.

Por isso confirmamos que nosso módulo está carregado no kernel com sucesso.

Removendo/descarregando o módulo do kernel

Para remover ou descarregar o módulo do kernel, podemos usar o comando linux "rmmod". Este é o comando que é usado para remover o módulo de kernel carregado e listado por lsmod. Esta operação também requer privilégios de superusuário. Voltando ao nosso exemplo do Hello-World, se desejarmos remover o módulo do kernel do Hello World, que carregamos anteriormente. Precisamos emitir o comando abaixo:

Sushilrathore-2: ~/Hello-World $ sudo rmmod hello_world
Sushilrathore-2: ~/Hello-World $

Após a execução do comando, se nada for visto no console, eu.e. não há nenhuma mensagem de erro. Isso significa que a descarga/remoção do módulo do kernel é bem -sucedida.

Confirmando a remoção/descarregamento do módulo

Novamente para confirmar se o módulo está descarregado com sucesso, podemos usar o comando lsmod. Após a remoção do módulo do kernel, não devemos ver o módulo presente na lista de módulos fornecidos por "lsmod".

A seguir, é apresentado o exemplo de saída do meu sistema:

Sushilrathore-2: ~/Hello-World $ lsmod
Tamanho do módulo usado por
nf_conntrack_ipv6 20480 0
nf_defrag_ipv6 20480 1 nf_conntrack_ipv6
ip6table_filter 16384 0
ip6_tables 28672 1 ip6table_filter
nf_conntrack_ipv4 16384 0
nf_defrag_ipv4 16384 1 nf_conntrack_ipv4
xt_recent 20480 0
xt_conntrack 16384 0
nf_conntrack 135168 3 xt_conntrack, nf_conntrack_ipv6, nf_conntrack_ipv4
CPUID 16384 0
iptable_filter 16384 1
ipmi_devintf 20480 0
ipmi_msghandler 53248 1 ipmi_devintf
vmw_vsock_vmci_transport 32768 1
vsock 36864 2 vmw_vsock_vmci_transport
Binfmt_misc 20480 1
Intel_RAPL_PERF 16384 0
Joydev 24576 0
input_leds 16384 0
vmw_ballon 20480 0
Serio_raw 16384 0
SHPCHP 36864 0
vmw_vmci 69632 2 vmw_ballon, vmw_vsock_vmci_transport

Na lista acima, se verificarmos, não encontraremos o módulo Hello World Kernel. Este duplo confirma que o módulo é removido do sistema.

Há mais uma utilidade muito importante oferecida, que pode ser usada para obter as informações do arquivo do módulo do kernel. "Modinfo" é o comando fornecido para obter os detalhes do módulo de kernel já presente.

Executando o "Modinfo" com o módulo Hello World Kernel, obtemos a saída abaixo:

Sushilrathore-2: ~/Hello-World $ modinfo Hello-World.Ko
nome de arquivo:/home/sushilrathore/hello-world/hello-world.Ko
Descrição: Hello World!
Licença: Gpl
SRCVERSION: BBD5A60063B15C8D80048FD
depende:
retpoline: y
Nome: hello_world
Vermágico: 4.15.0-163 Modversões de Mod_unload de SMP genérico
Cienauser@haxv-srathore-2: ~/hello-world $

A informação acima são os detalhes do módulo do kernel. A informação importante a ser observada é que fornece a você a SrcVersion e o Vermagic. Esta informação pode ser usada para identificar o kernel com o qual este módulo é compatível e pode ser carregado em. Se tentarmos adicionar o módulo do kernel compilado para outras fontes do Linux ou kernel, obteremos o erro incompatível do comando insmod.

Abaixo está o código de amostra e o código Makefile que usamos em nossa discussão acima:

Olá Mundo.c

#incluir
#incluir
#incluir
Module_license ("GPL");
Module_Description ("Hello World!");
estático int __inithello_init (vazio)

printk (kern_info "Hello World \ n");
retornar 0;

estático vazio __exit hello_exit (vazio)

printk (Kern_info "Goodbye World \ n");

module_init (hello_init);
module_exit (hello_exit);

Makefile

Obj-m = Hello-World.o

todos:

make -c/lib/módulos/$ (shell uname -r)/build/m = $ (pwd) módulos

limpar:

make -c/lib/módulos/$ (shell uname -r)/build m = $ (pwd) limpo

Conclusão

Até agora, discutimos sobre o processo/etapas de módulos de kernel carregáveis ​​para adicionar o módulo do kernel. Insmod é o comando que discutimos para carregar o módulo do kernel. Para confirmar se o módulo é carregado com sucesso, podemos usar o comando lsmod e, finalmente, remover o comando rmmod pode ser usado. Há mais um modinfo de utilidade que pode ser usado para imprimir os detalhes do módulo do kernel.