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.

Respostas:


76

include/linux/init.h


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.


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


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


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.