O que __init significa no código do kernel Linux?

91

No código-fonte do kernel do Linux, encontrei esta função:

Aqui eu não consigo entender o que __initsignifica.

Jeegar Patel
fonte

Respostas:

76

include/linux/init.h

Sangeeth Saravanaraj
fonte
55

Essas são apenas macros para localizar algumas partes do código Linux em áreas especiais no binário de execução final. __init, por exemplo (ou melhor, para que __attribute__ ((__section__ (".init.text")))esta macro se expanda) instrui o compilador a marcar esta função de uma maneira especial. No final, o vinculador coleta todas as funções com esta marca no final (ou início) do arquivo binário.

Quando o kernel é iniciado, este código é executado apenas uma vez (inicialização). Depois de executado, o kernel pode liberar essa memória para reutilizá-la e você verá a mensagem do kernel:

Liberando memória do kernel não utilizada: 108k liberados

Para usar esse recurso, você precisa de um arquivo de script de vinculador especial, que informa ao vinculador onde localizar todas as funções marcadas.

sashoalm
fonte
11
Esperto! Então é isso que "Liberando memória do kernel não utilizada: 108k liberados" significava. :-) Eu meio que me perguntei todos esses anos. Presumi que fosse algum tipo de buffer ou algo assim, não código.
Prof. Falken
6

Isso demonstra um recurso do kernel 2.2 e posterior. Observe a mudança nas definições das funções inite cleanup. A __initmacro faz com que a initfunção seja descartada e sua memória seja liberada quando a initfunção for concluída para drivers embutidos, mas não para módulos carregáveis. Se você pensar em quando a initfunção é invocada, isso faz todo o sentido.

fonte

naveen kumar r
fonte
5

__init é uma macro definida em ./include/linux/init.h que se expande para __attribute__ ((__section__(".init.text"))).

Ele instrui o compilador a marcar essa função de uma maneira especial. No final, o vinculador coleta todas as funções com esta marca no final (ou início) do arquivo binário. Quando o kernel é iniciado, este código é executado apenas uma vez (inicialização). Depois de executado, o kernel pode liberar essa memória para reutilizá-la e você verá o kernel

Geoffroy
fonte
3

Leia comentários (e documentos ao mesmo tempo) em linux / init.h .

Você também deve saber que o gcc tem algumas extensões feitas especialmente para o código do kernel do Linux e parece que esta macro usa uma delas.

elmo
fonte
1

Quando você compila e insere um módulo do kernel do Linux no kernel, a primeira função a ser executada é __init. Esta função é basicamente usada para executar a inicialização antes de você realizar as operações principais, como registrar um driver de dispositivo, etc. Há outra função com o efeito oposto __exit que é chamado quando você remove o módulo do kernel que é novamente usado para remover algum dispositivo registrado ou qualquer função semelhante

Nnaik
fonte