2011-12-19 2 views
28

커널 모듈을 컴파일 할 때 컴파일 옵션 인 CONFIG_DEBUG_SECTION_MISMATCH = y을 추가하는 메모가있는 WARNING이 있습니다. 이 문제에 대해 좀 더 자세한 정보를 줄 :커널 섹션 불일치 란 무엇입니까?

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. 

나는 그것을 수정에 대해 이동하는 방법을 언급, 정확히 커널 부분이 일치가 무엇을하지 찾을 수 없습니다.

답변

35

주어진 수명의 섹션에있는 함수가 다른 수명의 섹션에있는 것을 참조 함을 의미합니다.

커널 바이너리가 링크되면 코드와 데이터의 다른 부분이 다른 섹션으로 분할됩니다. 이 섹션 중 일부는 항상로드되지만 일부는 더 이상 필요하지 않으면 제거됩니다 (예 : 부팅 중에 만 필요한 것은 부팅이 끝나면 해제 될 수 있습니다 - 이렇게하면 메모리가 절약됩니다).

오래 지속되는 섹션에있는 함수가 삭제 가능한 섹션 중 하나의 데이터를 참조하는 경우 문제가 발생합니다. 이미 릴리스 된 데이터에 액세스하려고 시도하여 모든 종류의 런타임 문제.

이 코드를 작성하지 않았거나 매우 익숙하지 않은 경우 사용자가 직접 고칠 것임을 경고하는 것은 아닙니다. 함수 (또는 함수가 참조하는 데이터)에 올바르게 주석을 달아 올바른 섹션으로 이동하면 문제가 해결됩니다. 올바른 수정은 커널의 해당 부분에 대한 상세한 지식으로 만 결정될 수 있습니다. 이 섹션과 주석의 목록


, 커널 소스 트리에서 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) 

기타 더 많은 의견과 설명과 함께하십시오. 다른 섹션에 하나 개의 섹션에서
참조 불법이있는 경우

섹션 불일치 분석 검사 :

또한 CONFIG_DEBUG_SECTION_MISMATCH kconfig를 심볼에 대한 도움말 텍스트를 참조하십시오.
링크 중 또는 실행 중 Linux가 일부 섹션을 삭제할 경우
이 섹션에서 이전에 코드/데이터를 사용하면
일 가능성이 높습니다.
코드에서 함수 및 변수는
__init, __devinit 등으로 주석 처리됩니다 (include/linux/init.h의 전체 목록 참조)
코드/데이터가 특정 섹션에 배치되도록합니다.
섹션 불일치 분석은 항상 전체
커널 빌드 후 수행하지만,이 옵션을 사용하면 추가로
할 것 다음

  • 는 GCC에 인라인 함수는 소위 -fno--번 옵션을 추가
    초기화되지 않은
    함수에 __init 주석이 지정된 함수를 인라이닝 할 때 섹션 정보가 손실되어
    인 경우 분석에서 불법 참조를 catch하지 않습니다.
    이 옵션은 gcc에 인라인을 줄 이도록 지시하지만
    은 더 큰 커널을 생성합니다. 우리가 vmlinux.o에 섹션 불일치 분석을 실행 우리가
    가 불일치가 도입
    어디 대한 valueble 정보를 잃을 때
  • 는 각 모듈/내장 in.o
    의 섹션 불일치 분석을 실행합니다.
    각 모듈/built-in.o 파일에 대한 분석 실행
    불일치가
    소스에 훨씬 더 가깝게 발생하는지 알려줍니다. 단점은 동일한
    불일치를 적어도 두 번보고한다는 것입니다.

  • 섹션 불일치가보고되는 것을 돕기 위해 modpost에서 상세한보고를 활성화합니다.