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
#incluirMakefile
Obj-m = Hello-World.otodos:
make -c/lib/módulos/$ (shell uname -r)/build/m = $ (pwd) móduloslimpar:
make -c/lib/módulos/$ (shell uname -r)/build m = $ (pwd) limpoConclusã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.