O que eu quero saber especificamente aqui é: independentemente do hardware subjacente, trata-se de como o kernel do Linux consegue funcionar em todos os PCs diferentes.
Ou, em geral, como qualquer kernel pode (kernel NT da Microsoft, Mac OS e Linux) funcionar em qualquer PC, independentemente da configuração de hardware do PC.
Para explicar minha dúvida aqui está um cenário: comparado ao PC-2, o bluetooth, teclado, wifi, etc do PC-1 são de configurações diferentes e desenvolvidos por fabricantes diferentes. Para tornar todo esse hardware funcional, acho que o kernel deve ter código específico de hardware para habilitá-lo. Acredito que o kernel tenha uma camada de driver de dispositivo onde deve habilitar esses hardwares? Ou apenas carrega firmware específico do dispositivo de outro lugar? Onde exatamente está o código específico do hardware no kernel? Além disso, ao esclarecer minhas dúvidas, me deparei com HAL, BSP. O que são e onde estão essas camadas no kernel?
Responder1
O que eu quero saber especificamente aqui é, independentemente dos hardwares subjacentes, como o kernel do Linux consegue funcionar em todos os computadores diferentes.
Antes de mais nada, o kernel pode rodar em qualquer PC, desde que seja compilado para aquela arquitetura específica. Com seus computadores de uso geral, a arquitetura tende a ser a mesma (x86_64/amd64), mas isso muda quando você lida com dispositivos incorporados.
Árvore de dispositivos
Além da compilação, o próprio kernel é independente de hardware. eu te dou oárvore de dispositivos!
A maneira como o kernel do Linux cuida do hardware não detectável é através da árvore de dispositivos. Isso informa ao kernel informações sobre CPU, memória, barramentos, dispositivos conectados via I2C, SPI e outros itens. Em vez de o layout do dispositivo ser codificado, ele pode ser alterado por meio da árvore de dispositivos. É tudo realmente mágico quando você entende. A árvore de dispositivos também informa ao kernel qual driver ele deve usar para um dispositivo específico através do compatible
parâmetro.
A árvore de dispositivos pode ser armazenada de várias maneiras diferentes, dependendo de como o kernel foi compilado, mas geralmente a hierarquia pode ser vista em /proc/device-tree
ou /sys/firmware/devicetree/base
.
Para coisas como dispositivos USB, tudo é resolvido pelo driver USB. O kernel possui código básico para controlar coisas como teclados e mouses. Alguns fornecedores possuem drivers personalizados que são enviados com o dispositivo.
Módulos
Para drivers, o kernel do Linux usa algo chamadomódulos do kernel. Todos os módulos podem ser encontrados em /lib/modules
. Existem dois tipos de módulos: módulos carregáveis e módulos integrados. Você pode visualizar todos os módulos carregados usando o lsmod
comando. Quando o kernel encontra um determinado dispositivo na árvore de dispositivos ou mesmo quando você conecta um dispositivo a um periférico, ele verifica se há um módulo que pode carregar para esse dispositivo e o módulo se torna o driver para esse dispositivo.
O bom dos módulos carregáveis é que eles mantêm a imagem do kernel menor. Os módulos podem ser compilados separadamente. Os módulos integrados são compilados no kernel e, portanto, aumentam o tamanho real da imagem. Você também pode compilar e carregar módulos no kernel enquanto ele está em execução, mas esse é um tópico totalmente diferente.
BSP
Você entra no BSP (Board Support Package) quando um fornecedor envia o kernel e vários módulos específicos para seu próprio hardware (isso inclui o processador e o hardware conectado). Às vezes, os fornecedores fazem alterações nos módulos existentes ou enviam módulos personalizados com o kernel. Alguns fornecedores fazem alterações no próprio kernel e todo esse pacote personalizado se torna o BSP. Isso acontece muito no mundo incorporado.
HAL
HAL (Hardware Abstraction Layer) pode ser sinônimo de BSP. Eu não vi isso sendo muito usado no mundo Linux, mas quando você entra em microcontroladores, ele é usado com bastante frequência. Essencialmente, o HAL é um conjunto de bibliotecas usadas para acessar o hardware, facilitando muito a interface com o hardware. Por exemplo, com um chip wifi, ele fornecerá rotinas básicas para conectar-se a um AP, escanear a rede, criar um ponto de acesso, etc. Ele meio que atua como um driver nesse sentido.