2011-12-19 14 views
28

Al compilar un módulo kernel, recibí una ADVERTENCIA con una nota para agregar una opción de compilación, CONFIG_DEBUG_SECTION_MISMATCH = y. Me dan información más detallada sobre el tema:¿Qué es la sección del núcleo no coincide?

WARNING: \**\*path to module\***(.text+0x8d2): Section mismatch in reference from the function Pch_Spi_Enable_Bios_Wr() to the variable .devinit.data:ich9_pci_tbl.22939 
The function Pch_Spi_Enable_Bios_Wr() references 
the variable __devinitdata ich9_pci_tbl.22939. 
This is often because Pch_Spi_Enable_Bios_Wr lacks a __devinitdata 
annotation or the annotation of ich9_pci_tbl.22939 is wrong. 

no pude encontrar exactamente lo que kernel sección desajuste es, por no hablar de cómo hacer para solucionarlo.

Respuesta

35

Significa que una función que está en una sección con un tiempo de vida determinado hace referencia a algo que está en una sección con una vida útil diferente.

Cuando se vincula el kernel binary, las diferentes partes del código y los datos se dividen en diferentes secciones. Algunas de estas secciones se mantienen cargadas todo el tiempo, pero otras se eliminan una vez que ya no son necesarias (las cosas que solo son necesarias durante el arranque, por ejemplo, se pueden liberar una vez que se inicia, esto ahorra memoria).

Si una función que se encuentra en una sección de larga duración se refiere a datos en una de las secciones descartables, hay un problema: puede intentar acceder a esos datos cuando ya se han liberado, lo que genera todo tipo de tiempo de ejecución cuestiones.

Esta no es una advertencia que pueda corregir usted mismo, a menos que haya escrito ese código o esté muy familiarizado con él. Se soluciona anotando correctamente la función (o los datos a los que hace referencia) para que vaya a la sección derecha. La corrección correcta solo se puede determinar con un conocimiento detallado de esa parte del kernel.


Para obtener una lista de estas secciones y anotaciones, se refieren a la cabecera include/linux/init.h en su árbol de fuentes del núcleo:

/* 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) 

Otros siguen, con más comentarios y explicaciones.

Véase también el texto de ayuda para el símbolo CONFIG_DEBUG_SECTION_MISMATCH KConfig:

la sección de análisis comprueba si hay falta de coincidencia son ilegales
referencias de una sección a otra sección.
Linux durante el enlace o durante el tiempo de ejecución caer algunas secciones
y cualquier uso de código/datos previamente en estas secciones
lugar muy probablemente a un Uy.
En las funciones de código y las variables son anotados con
__init, __devinit etc. (véase la lista completa en include/linux/init.h)
que resulta en el código/datos que se colocan en secciones específicas.
El análisis de la sección desajuste se realiza siempre después de una completa
construcción del kernel, pero que permite esta opción, además
hacer lo siguiente:

  • añadir la opción -fno-inline-funciones-llamados-una vez para gcc
    Al subrayar una función anotada __init en una función no init
    perderíamos la información de la sección y por lo tanto
    el análisis no captaría la referencia ilegal.
    Esta opción le dice a gcc que entre menos en línea, pero también dará como resultado
    un kernel más grande.
  • ejecutar el análisis sección de desfase para cada módulo/incorporado IN.O
    Cuando corremos el análisis de la sección desajuste en vmlinux.o que
    perder información acerca valueble donde el desajuste era
    introducido.
    Ejecutando el análisis para cada módulo/archivo built-in.o
    dirá dónde se produce la falta de coincidencia mucho más cerca de la fuente
    . El inconveniente es que reportaremos la misma falta de coincidencia
    al menos dos veces.
  • Habilita informes detallados de modpost para ayudar a resolver
    la sección no coincide informó.
Cuestiones relacionadas