Módulos - Linux

O núcleo do Linux é o coração do sistema operacional. Este software interage diretamente com o hardware. O núcleo é a única parte do sistema operacional que se comunica diretamente com o hardware; todos os outros componentes que você usa devem passar pelo núcleo. Para acessar diversos componentes de hardware, o núcleo precisa de drivers. A função do driver é informar ao núcleo como deve interagir com o hardware. Cada driver do núcleo é representado por um módulo do núcleo. Apenas os drivers mais essenciais são compilados diretamente no núcleo. Os outros drivers, menos importantes, são carregados pelo núcleo.

No Linux, utilizam-se componentes especiais chamados módulos para carregar dinamicamente funções e drivers sem a necessidade de reiniciar todo o sistema. Eles permitem melhorar o desempenho e a eficiência do sistema. O uso de módulos permite que o sistema carregue apenas os drivers e funções necessários para o funcionamento de determinado hardware ou software, reduzindo a carga geral do sistema e economizando recursos.

Para obter a lista de todos os módulos carregados, usa-se o comando lsmod:

programicio@Programicio:~$ lsmod
Module                  Size  Used by
ntfs3                 344064  1
esp4                   28672  0
xfrm_interface         28672  0
xfrm6_tunnel           16384  1 xfrm_interface
...
nvme_common            28672  1 nvme_core
vmd                    24576  0
ucsi_acpi              12288  0
typec_ucsi             53248  1 ucsi_acpi
typec                 110592  1 typec_ucsi
video                  73728  3 asus_wmi,i915,nouveau
wmi                    40960  6 video,asus_wmi,wmi_bmof,mfd_aaeon,mxm_wmi,nouveau

A saída do comando lsmod mostra não apenas quais módulos estão carregados, mas também o que eles fazem. A saída apresenta uma tabela com três colunas:

  • Nome do módulo

  • Quantidade de memória utilizada pelo módulo

  • Número e nomes de outros módulos que estão usando este módulo no momento. Esta coluna é muito importante porque, se um módulo tiver dependências, será necessário descarregar todas as dependências antes de descarregar o módulo.

Também é possível localizar módulos específicos. Por exemplo, para encontrar o módulo "bluetooth":

programicio@Programicio:~$ lsmod | grep bluetooth
bluetooth            1077248  34 btrtl,btmtk,btintel,btbcm,bnep,btusb,rfcomm
ecdh_generic           16384  1 bluetooth

Visualizando Informações sobre Módulos com modinfo

Para obter informações sobre um módulo que está carregado no momento, utiliza-se o comando modinfo:

modinfo [opções] nomedomodulo

Este comando aceita o nome do módulo sobre o qual se deseja obter informações e também pode aceitar opções opcionais:

  • -a, --author: exibe apenas o autor do módulo

  • -d, --description: exibe apenas a descrição

  • -l, --license: exibe apenas a licença

  • -p, --parameters: exibe apenas os parâmetros

  • -n, --filename: exibe apenas o nome do arquivo

  • -F, --field=FIELD: exibe apenas o campo especificado FIELD

  • -V, --version: exibe apenas a versão

Se as opções não indicarem explicitamente quais informações exibir, todas as informações sobre o módulo serão exibidas. Por exemplo, para exibir informações sobre o módulo "bluetooth":

programicio@Programicio:~$ modinfo bluetooth
filename:       /lib/modules/6.5.0-26-generic/kernel/net/bluetooth/bluetooth.ko.zst
alias:          net-pf-31
license:        GPL
version:        2.22
description:    Bluetooth Core ver 2.22
author:         Marcel Holtmann <marcel@holtmann.org>
srcversion:     C91504123EB8C35EA0398EF
depends:        ecdh_generic
retpoline:      Y
intree:         Y
name:           bluetooth
vermagic:       6.5.0-26-generic SMP preempt mod_unload modversions 
sig_id:         PKCS#7
signer:         Build time autogenerated kernel key
sig_key:        EA:9B:71:2C:1A:62:D5:9E::D1:D8:43:A4:01:07:A6:D0:DDA8:50:6A
sig_hashalgo:   sha512
signature:      1B:8A:2C:E2:F3:DE:96:1B:AB:3B:78:B4:AD:0E
parm:           disable_esco:Disable eSCO connection creation (bool)
parm:           disable_ertm:Disable enhanced retransmission mode (bool)
parm:           enable_ecred:Enable enhanced credit flow control mode (bool)

Carregando e Descarregando Módulos

Normalmente, os módulos são carregados automaticamente. No entanto, em alguns casos, pode ser necessário descarregar e recarregar um módulo manualmente. Isso pode ser necessário, por exemplo, para carregar um módulo com novas opções. Como os módulos são geralmente carregados automaticamente, provavelmente será necessário descarregar o módulo antes de carregá-lo novamente.

Para descarregar um módulo atualmente carregado, usa-se o comando modprobe -r. Por exemplo, o comando a seguir descarrega o módulo bluetooth:

modprobe -r bluetooth

É importante notar que, módulos que são necessários a outro módulo do núcleo como dependência, não podem ser descarregados. Nesse caso, ao tentar descarregá-los, uma mensagem de erro será exibida:

programicio@Programicio:~$ modprobe -r bluetooth
modprobe: FATAL: Module bluetooth is in use.

Para carregar um módulo, basta passar seu nome para o comando modprobe:

modprobe bluetooth

O carregamento de um módulo pode falhar devido a erros de versão. Geralmente, os módulos são escritos para uma versão específica do núcleo, e se a versão no módulo estiver incorreta, ele não poderá ser carregado.

Encontrando o Módulo Correto

Normalmente, os módulos necessários para o hardware do computador são carregados automaticamente. Isso pode ser verificado com o comando lspci -k. Por exemplo:

programicio@Programicio:~$ lspci -k
00:00.0 Host bridge: Intel Corporation 16th Gen Core Processor Host Bridge/DRAM Registers (rev 08)
    DeviceName: Onboard - Other
    Subsystem: ASUSTeK Computer Inc. 16th Gen Core Processor Host Bridge/DRAM Registers
00:01.0 PCI bridge: Intel Corporation 16th Gen Core Processor PCI Express x16 Controller #1 (rev 08)
    Subsystem: ASUSTeK Computer Inc. 16th Gen Core Processor PCI Express x16 Controller
    Kernel driver in use: pcieport
00:02.0 VGA compatible controller: Intel Corporation SuperLake-S GT1 (rev 0c)
    DeviceName: Onboard - Video
    Subsystem: ASUSTeK Computer Inc. SuperLake-S GT1
    Kernel driver in use: i915
    Kernel modules: i915
00:06.0 Network controller: Intel Corporation Wi-Fi 6 AX210/AX211/AX411 160MHz (rev 1a)
    Subsystem: Intel Corporation Wi-Fi 6 AX210 160MHz
    Kernel driver in use: iwlwifi
    Kernel modules: iwlwifi
...

Aqui, é possível ver os drivers e módulos utilizados para determinadas subsistemas do computador. Em alguns casos, pode não ser exibido nenhum driver do núcleo. Nesse caso, o módulo do núcleo para esse hardware específico não foi encontrado. Para resolver este problema, é necessário procurar um driver proprietário do fornecedor específico do hardware.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com