Dentro de cada programa, há um main.c
. Dentro do main, há uma main
função que é chamada antes de qualquer outra função. Lembro que dentro dos compiladores, há também uma diretiva que chama uma função definida antes de main
.
__attribute__ ((constructor))
É assim que a maioria dos programas funciona. Tenho certeza de que o Linux Kernel é um caso diferente. Depois de olhar o main.c
arquivo em init/kernel
, não parece haver uma main
função.
Funções são declaradas com uma __init
diretiva. Veja o exemplo abaixo:
asmlinkage __visible __init __no_sanitize_address __noreturn __no_stack_protector
void start_kernel(void)
Qual é a ordem em que o código é chamado dentro do main.c
procedimento de inicialização do Linux?
O termo que você está procurando é "ponto de entrada".
Como você destaca, em programas C o ponto de entrada é
main()
embora alguns compiladores possam oferecer código que roda antes dele. Caso em questão:__attribute__
é um recurso do GCC , não do C em si.Pesquisando no Google, posso encontrar referências a uma função chamada
start_kernel
( aqui ).No entanto!, a documentação que vi é clara de que este não é o primeiro ponto no código a ser executado. Ele é apenas pretendido como o primeiro ponto independente de arquitetura no código. ( Referência ).
Então parece ( pelas referências que li ) que o ponto de entrada real pode variar dependendo da arquitetura e do possível método de inicialização (EFI stub, ...)