versiones tipos quimica que para instalar desde descargar cual c linux

c - tipos - que es el kernel de windows



¿Qué significa__init en el código del kernel de Linux? (5)

En el código fuente del kernel de Linux encontré esta función:

static int __init clk_disable_unused(void) { // some code }

Aquí no puedo entender qué significa __init .


Estas son solo macros para ubicar algunas partes del código de Linux en áreas especiales en el binario de ejecución final. __init , por ejemplo (o mejor, __attribute__ ((__section__ (".init.text"))) expande esta macro) instruye al compilador a marcar esta función de una manera especial. Al final, el enlazador recoge todas las funciones con esta marca al final (o comienza) del archivo binario.

Cuando se inicia el kernel, este código se ejecuta solo una vez (inicialización). Después de que se ejecuta, el kernel puede liberar esta memoria para reutilizarla y verá el mensaje del kernel:

Liberando la memoria del kernel no utilizada: 108k liberados

Para utilizar esta función, necesita un archivo de script del enlazador especial que le indique al vinculador dónde ubicar todas las funciones marcadas.


Esto demuestra una característica de kernel 2.2 y posterior. Observe el cambio en las definiciones de las funciones init y de cleanup . La macro __init hace que se descarte la función init y se libera su memoria una vez que la función init finaliza para los controladores incorporados, pero no para los módulos cargables. Si piensas en cuándo se invoca la función init , tiene mucho sentido.

source


Lea el comentario (y documentos al mismo tiempo) en linux/ini.h

También debe saber que gcc tiene algunas extensiones hechas especialmente para el código del kernel de Linux y parece que esta macro usa una de ellas.


__init es una macro definida en ./include/linux/init.h que se expande a __attribute__ ((__section__(".init.text"))) .

Enseña al compilador a marcar esta función de una manera especial. Al final, el enlazador recoge todas las funciones con esta marca al final (o comienza) del archivo binario. Cuando se inicia el kernel, este código se ejecuta solo una vez (inicialización). Después de que se ejecuta, el kernel puede liberar esta memoria para reutilizarla y verá el kernel


include/linux/init.h

/* These macros are used to mark some functions or * initialized data (doesn''t apply to uninitialized data) * as `initialization'' functions. The kernel can take this * as hint that the function is used only during the initialization * phase and free up used memory resources after * * Usage: * For functions: * * You should add __init immediately before the function name, like: * * static void __init initme(int x, int y) * { * extern int z; z = x * y; * } * * If the function has a prototype somewhere, you can also add * __init between closing brace of the prototype and semicolon: * * extern int initialize_foobar_device(int, int, int) __init; * * For initialized data: * You should insert __initdata between the variable name and equal * sign followed by value, e.g.: * * static int init_variable __initdata = 0; * static const char linux_logo[] __initconst = { 0x32, 0x36, ... }; * * Don''t forget to initialize data not at file scope, i.e. within a function, * as gcc otherwise puts the data into the bss section and not into the init * section. * * Also note, that this data cannot be "const". */ /* These are for everybody (although not all archs will actually discard it in modules) */ #define __init __section(.init.text) __cold notrace #define __initdata __section(.init.data) #define __initconst __section(.init.rodata) #define __exitdata __section(.exit.data) #define __exit_call __used __section(.exitcall.exit)