Os módulos do kernel são específicos para Linux ou um mecanismo geral?

Os módulos do kernel são específicos para Linux ou um mecanismo geral?

Li no livro de Tanenbaum sobre sistemas operacionais que existem anéis de proteção e o anel 0 pertence ao kernel. Em geral, pode-se dizer que "módulos do kernel lidam com E/S e gerenciamento de memória do anel 0" ou "módulo do kernel" é específico para Linux e não aplicável, por exemplo, para OpenBSD e MULTICS?

Responder1

As ideias apresentadas por Andrew Tanenbaum geralmente não são diretamente aplicáveis ​​ao Linux (ou a qualquer kernel Unix monolítico tradicional). A resposta à sua pergunta é muito mais simples do que você sugere: um módulo do kernel Linux é um código do kernel que foi compilado e vinculado a um arquivo separado, em vez de ser vinculado à imagem do kernel. Este arquivo de objeto do kernel separado (.ko) pode ser carregado no espaço de endereço do kernel, sob demanda, em tempo de execução. Praticamente todos os drivers que podem ser compilados como módulos do kernel também podem ser vinculados estaticamente à imagem do kernel, sem qualquer diferença na funcionalidade depois que o código for carregado.

O código do módulo é o código do kernel e é executado com o mesmo privilégio que todos os outros códigos do kernel. Um módulo do kernel pode, em princípio, substituir qualquer código do kernel, mas para fazer isso de forma limpa, o kernel propriamente dito deve fornecer um mecanismo ao qual o módulo possa se conectar.

Uma observação lateral sobre a terminologia: anéis de proteção são um conceito introduzido com o sistema operacional Multics. "Anel 0" a "Anel 3" são termos específicos dos processadores Intel. Outras arquiteturas de processador usam outros termos, como modo Usuário/Supervisor. Embora os processadores Intel forneçam quatro níveis diferentes de privilégio, a maioria dos sistemas operacionais usa apenas dois: Anel 3 para código de nível de usuário e Anel 0 para código de kernel, espelhando os modos Usuário/Supervisor de outros processadores. (A exceção é o OS/2, que utilizava três níveis de privilégio.)

O conceito de nível de privilégio foi expandido recentemente com o advento da tecnologia de virtualização em nível de hardware. Por exemplo, a arquitetura ARM define três níveis de privilégio: Usuário, Supervisor e Hipervisor. Brincando, foi dito que finalmente quatro anéis são usados ​​em máquinas baseadas em Intel: Anel 3 para código de nível de usuário, Anel 0 para código de kernel (máquina virtual), Anel -1 para código de hipervisor e Anel -2 para modo SMM.

Responder2

O conceito de kernel não se aplica a todos os sistemas operacionais. É difundido, mas exatamente como aplicá-lo a um sistema específico pode ser uma questão de debate.

No caso de sistemas de multiprogramação onde os programas estão isolados uns dos outros, existe uma definição precisa de kernel: o kernel é a parte do sistema que tem acesso a tudo. O kernel é a parte que não está isolada. O papel do kernel é pelo menos fornecer o mecanismo de isolamento, mas ele pode fazer mais. Em uma arquitetura tradicional de kernel Unix, que inclui Linux, o kernel também contém drivers de hardware, protocolos de rede, drivers de sistema de arquivos, etc.

Na maioria dos sistemas, o isolamento entre programas em execução depende de recursos de hardware (modos de privilégio do processador, unidade de gerenciamento de memória). O kernel é então a parte do sistema que roda no modo de privilégio mais alto do processador, o modo onde os privilégios de todo o sistema podem ser controlados. Em processadores x86, esse modo é chamado de “anel 0”; observe que “anel 0” é uma terminologia x86, não um conceito geral. O conceito geral é denominado “modo kernel” ou “modo privilegiado” ou “modo supervisor”.

A afirmação “módulos do kernel lidam com E/S e gerenciamento de memória do anel 0” não faz sentido. O kernel, como um todo, cuida do gerenciamento de memória (no nível de decidir qual processo possui qual memória e em qual endereço ele a acessa) e de E/S (no nível de cópia de dados para dentro e para fora dos periféricos). O kernel, como um todo, é executado no modo kernel do processador, que é o anel 0 em um processador x86.

Um módulo do kernel é uma parte do kernel que é carregada após o boot. A única diferença entre um módulo e um código de inicialização é como ele é carregado. O código em um módulo do kernel é executado no mesmo nível de privilégios que o código do kernel carregado no momento da inicialização e pode executar as mesmas funções (qualquer código que possa ser carregado como um módulo também pode ser incluído na imagem no momento da inicialização). Muitos sistemas Unix modernos possuem módulos de kernel, incluindo Solaris, *BSD, Linux, etc.

informação relacionada