Como o kernel foi escrito? [fechadas]

3

A execução de um programa no modo kernel proíbe o uso da biblioteca C padrão, porque a única coisa com a qual seu programa está vinculado é o próprio kernel. Então, posso usar funções definidas no kernel. Mas o próprio kernel é um programa escrito em C e compilado para uma arquitetura particular. E ele 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 é que funções C atuais 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 ver as fontes, é muito próximo para mim, TY.

    
por user30167 27.06.2016 / 00:36

3 respostas

2

O kernel Unix incluiu tradicionalmente alguns código da linguagem assembly. Eu não olhei para o código fonte recentemente, mas suspeito que isso ainda seja verdade.

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

    
por 27.06.2016 / 04:02
0

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

    
por 27.06.2016 / 00:38
0

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

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

O carregamento de módulos do kernel funciona de acordo com o mesmo princípio do carregamento dinâmico e é descrito aqui: link

    
por 27.06.2016 / 01:11