Cosa significa __init nel codice del kernel Linux?


91

Nel codice sorgente del kernel Linux ho trovato questa funzione:

Qui non riesco a capire cosa __initsignifichi.

Risposte:


76

include/linux/init.h


55

Queste sono solo macro per localizzare alcune parti del codice di Linux in aree speciali nel binario di esecuzione finale. __init, ad esempio (o meglio la __attribute__ ((__section__ (".init.text")))macro this si espande a) indica al compilatore di contrassegnare questa funzione in un modo speciale. Alla fine il linker raccoglie tutte le funzioni con questo segno alla fine (o all'inizio) del file binario.

All'avvio del kernel, questo codice viene eseguito solo una volta (inizializzazione). Dopo che è stato eseguito, il kernel può liberare questa memoria per riutilizzarla e vedrai il messaggio del kernel:

Liberare la memoria del kernel inutilizzata: 108k liberati

Per utilizzare questa funzionalità, è necessario uno speciale file di script del linker, che indichi al linker dove individuare tutte le funzioni contrassegnate.


11
Intelligente! Questo è ciò che significa "Liberare la memoria del kernel inutilizzata: 108k liberati". :-) Mi sono quasi chiesto in tutti questi anni. Ho pensato che fosse una specie di buffer o qualcosa del genere, non codice.
Prof.Falken

6

Ciò dimostra una funzionalità del kernel 2.2 e versioni successive. Notare il cambiamento nelle definizioni delle funzioni inite cleanup. La __initmacro fa sì che la initfunzione venga eliminata e la sua memoria liberata al inittermine della funzione per i driver incorporati, ma non per i moduli caricabili. Se pensi a quando la initfunzione viene invocata, questo ha perfettamente senso.

fonte


5

__init è una macro definita in ./include/linux/init.h che si espande in __attribute__ ((__section__(".init.text"))).

Indica al compilatore di contrassegnare questa funzione in un modo speciale. Alla fine il linker raccoglie tutte le funzioni con questo segno alla fine (o all'inizio) del file binario. All'avvio del kernel, questo codice viene eseguito solo una volta (inizializzazione). Dopo che è stato eseguito, il kernel può liberare questa memoria per riutilizzarla e vedrai il kernel


3

Leggi il commento (e documenti allo stesso tempo) in linux / init.h .

Dovresti anche sapere che gcc ha alcune estensioni create appositamente per il codice del kernel Linux e sembra che questa macro ne usi una.


1

Quando si compila e si inserisce un modulo del kernel Linux nel kernel, la prima funzione da eseguire è __init Questa funzione è fondamentalmente utilizzata per eseguire l'inizializzazione prima di eseguire le operazioni principali come la registrazione di un driver di dispositivo ecc., C'è un'altra funzione con l'effetto opposto __exit che viene chiamato quando si rimuove il modulo del kernel che viene nuovamente utilizzato per rimuovere un dispositivo registrato o una funzione simile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.