Estou aprendendo drivers de dispositivo e programação do Kernel. De acordo com o livro de Jonathan Corbet, não há main()
função nos drivers de dispositivo.
Então, eu duas perguntas:
- Por que não precisamos de uma
main()
função nos drivers de dispositivo? - O próprio kernel tem uma
main()
função?
Alguém pode me explicar isso?
linux-kernel
drivers
alguém
fonte
fonte
Respostas:
Nos programas de espaço do usuário,
main()
é o ponto de entrada para o programa chamado pelo código de inicialização libc quando o binário é executado. O código do kernel não tem o luxo de confiar na libc, pois a própria libc depende da interface syscall do kernel para alocação de memória, E / S, gerenciamento de processos etc.Dito isto, o equivalente
main()
no código do kernel éstart_kernel()
, chamado pelo gerenciador de inicialização após carregar a imagem do kernel, descompactada na memória e configurando hardware e paginação de memória essenciais.start_kernel()
executa a maior parte da configuração do sistema e, eventualmente, gera o processo de inicialização.O ponto de entrada para os módulos do kernel do Linux é uma função init registrada no kernel chamando a
module_init()
macro. A função init do módulo registrado é chamada pelo código do kernel através dado_initcalls()
função durante a inicialização do kernel.fonte
main
método em C. (É um equívoco muito comum que o SO faz uma chamada diretamain
, o que não é o caso e ainda menos em, por exemplo, C ++.) Eu daria a você outro voto positivo, se eu pudesse apenas por isso.O kernel não tem uma
main
função.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 está organizada da seguinte maneira:
initrd
). Em seguida, o código em algum endereço é executado.init
processo), alterna o contexto da CPU do anel 0 para o anel 3 e inicia o processo init (a identificação do processo é 1). Agora a inicialização do kernel está concluída!init
programa executa todos os scripts de inicialização. Todos os serviços são iniciados. Shell é chamado. Os usuários podem fazer login.A
main
função é uma função C. Na verdade, o método principal não é o ponto de entrada dos programas C. O tempo de execução C chama muitas funções antesmain
. O GCC possui um recurso de extensão: construtores. As funções declaradas "construtor" são chamadas antesmain
.Por exemplo:
Essa macro é do projeto qemu.
fonte
initrd.img
NÃO é a imagem do kernel. É um conjunto de módulos carregados pelo kernel na inicialização. As imagens do kernel geralmente têm nomes começando com "vmlinuz", mas diferem de distribuição para distribuição.Existe, por exemplo, 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. Há uma boa visão geral de como funciona a inicialização do kernel Linux 2.6.x na plataforma x86. Realmente vale a pena ler.
De acordo com o documento COMO FAZER o desenvolvimento do kernel Linux , o kernel Linux é
o que de acordo com o padrão C BTW significa que
fonte