Como o kernel foi escrito?

Como o kernel foi escrito?

A execução de um programa no modo kernel proíbe o uso da biblioteca C padrão porque a única coisa à qual seu programa está vinculado é o próprio kernel. Então estou autorizado a usar funções definidas no kernel. Mas o próprio kernel é um programa escrito em C e compilado para alguma arquitetura específica. E não deve usar a biblioteca padrão C, mas também não deve usar nenhum driver, pois os drivers são módulos carregáveis. Então, minha pergunta é quais funções C reais são usadas ao escrever um kernel? Como você pode interagir com o hardware não através do kernel? Não me diga para olhar as fontes, é um nível muito próximo para mim, TY.

Responder1

O kernel Unix tradicionalmente incluialgunscódigo em linguagem assembly. Não olhei seu código-fonte recentemente, mas suspeito que isso ainda seja verdade.

VerComo um driver realmente se comunica com um dispositivo de hardware? para uma visão geral desse tópico. As respostas a essa pergunta discutem dois tipos de arquitetura de computador. Em um sistema que usa E/S mapeada por porta (PMIO), o kerneldeveser escrito parcialmente em linguagem assembly - embora você possa sobreviver com algumas rotinas muito curtas. Em um sistema que usa E/S mapeada em memória (MMIO), até mesmo drivers de dispositivo podem ser escritos inteiramente em C. Tudo o que eles precisam fazer é declarar um ponteiro, defini-lo igual ao endereço virtual do dispositivo e então usá-lo. manipular o dispositivo como se estivesse acessando a memória.

Responder2

Nem todos os drivers são módulos carregáveis, ser carregável é simplesmente uma opção, mas alguns drivers cruciais não são carregados dinamicamente, eles fazem parte do kernel.

Responder3

O kernel reproduz um monte de funcionalidades fornecidas pela libc estaticamente, dentro de si.

Assim como na programação C no modo de usuário, uma função pode ser definida em uma unidade de compilação e outra unidade pode simplesmente referenciá-la (geralmente por meio de um arquivo de cabeçalho), o compilador a tornará uma referência indefinida e o vinculador a vinculará ao unidade de compilação que realmente fornece o símbolo.

Carregar módulos do kernel funciona com o mesmo princípio quecarregamento dinâmicoe está descrito aqui: http://www.tldp.org/LDP/tlk/modules/modules.html

informação relacionada