O kernel tem uma função main ()? [fechadas]

51

Estou aprendendo drivers de dispositivos e programação de kernel. De acordo com o livro de Jonathan Corbet, não há função main() nos drivers de dispositivos.

Então eu faço duas perguntas:

  • Por que não precisamos de uma função main() nos drivers de dispositivos?
  • O próprio kernel tem uma função main() ?

Alguém pode me explicar isso?

    
por someone 16.08.2013 / 07:17

3 respostas

81

Nos programas de espaço do usuário, main() é o ponto de entrada para o programa que é chamado pelo código de inicialização da libc quando o binário é executado. O código do kernel não tem o luxo de depender da libc, já que a própria libc depende da interface syscall do kernel para alocação de memória, E / S, gerenciamento de processos, etc.

Dito isso, o equivalente a main() no código do kernel é start_kernel() , que é chamado pelo gerenciador de inicialização depois de ter carregado a imagem do kernel, descomprimiu-a na memória e configurou o hardware essencial e a paginação de memória. start_kernel() realiza a maioria da configuração do sistema e, eventualmente, gera o processo init.

O ponto de entrada para os módulos do kernel Linux é uma função init registrada no kernel chamando a macro module_init() . A função init do módulo registrado é então chamado pelo código do kernel através do do_initcalls() função durante a inicialização do kernel.

    
por 16.08.2013 / 08:15
17

O kernel não possui uma função main . main é um conceito da linguagem C. O kernel é escrito em C e assembly. O código de entrada do kernel é escrito por assembly.

A sequência de inicialização é organizada da seguinte forma:

  1. A BIOS geralmente carrega um carregador de inicialização de um dispositivo de bloco de inicialização. Um gerenciador de inicialização popular agora é o grub.
  2. O Grub carrega uma imagem do kernel no RAM, possível com um dispositivo raiz inicial ( initrd ). Então o código em algum endereço é executado.
  3. A imagem do kernel tem alguns módulos do kernel, por exemplo: módulos do sistema de arquivos, drivers de dispositivos. A imagem do kernel usa o módulo do sistema de arquivos para montar o sistema de arquivos raiz. Agora o kernel pode carregar e executar todos os módulos do kernel a partir do disco.
  4. O kernel executa tarefas de inicialização. Por exemplo: percorra o barramento PCI e encontre todos os dispositivos PCI, inicialize todos os drivers de dispositivos.
  5. Finalmente, o kernel cria o processo 0 e o processo 1 (o processo init ), alterna o contexto da CPU do anel 0 para o anel 3 e inicia o processo init (o ID do processo é 1). Agora a inicialização do kernel terminou!
  6. O programa init executa todos os scripts de inicialização. Todos os serviços são iniciados. Shell é chamado. Os usuários podem fazer login.

A função main é uma função C. Na verdade, o método principal não é o ponto de entrada dos programas em C. O tempo de execução C chama muitas funções antes de main . O GCC possui um recurso de extensão: construtores. Funções declaradas "construtor" são chamadas antes de main .

Por exemplo:

/* This should not be used directly. Use block_init etc. instead. */ 
#define module_init(function, type) \
    static void _attribute__((constructor)) do_qemu_init ## function(void) { \
    register_module_init(function, type); \
} 

Esta macro é do projeto qemu.

    
por 16.08.2013 / 08:08
9

Existe, e. uma função main () em arch / x86 / boot / main.c para preparar o sistema para mudar do modo real para o modo protegido, mas outras arquiteturas não possuem esse código. Existe uma boa visão geral de como o boot do kernel do Linux 2.6.x na plataforma x86 funciona. Vale a pena lê-lo.

De acordo com o documento COMO fazer o desenvolvimento do kernel do Linux , o kernel do Linux é

a freestanding C environment, with no reliance on the standard C library, so some portions of the C standard are not supported.

o que de acordo com o padrão C BTW significa que

It is implementation-defined whether a program in a freestanding environment is required to define a 'main' function.

    
por 16.08.2013 / 08:29