본문 바로가기

Programming/Linux_Kernel

__initdata keyword in kernel

커널 소스를 보던중 다음과 같은 코드가 있었다.

static unsigned int cachepolicy __initdata = CPOLICY_WRITEBACK;

여기서 __initdata 라는 메크로는 무엇을 뜻하는 걸까?

아래에 자세한 설명이 있다.

원문 : http://tong.nate.com/thisbe71/29152477



__init에 init이 들어 가 있으니 초기화에 관련 된것이라고, 쉽사리 추측을 할수는 있지만,

그냥 넘어가기에는 역시..이놈의 성격이...ㅋㅋ

 

자 그럼 한번 알아 볼까요?? 이젠 안덥죠~?? 라고 근영씨가 말하는 군요..

 

쉽게 말해서 __init 가 붙은 함수나 __initdata 가 붙은 변수는 메모리 한쪽에 잘 모아 놨다가...

시스템 초기화 시에 따~악 한번만 실행하고 사용이 끝나면 메모리에서 제거하는 놈..이라고 체크 해주는 키워드이다.

 

어때요?? 쉽죠?ㅋ

 

예를 들자면 최초에 메모리를 초기화 하는  함수는 메모리 초기화 과정이 끝나게 되면 그다음에는

시스템에 필요 없는 존재가 되어 버린다. 이러한 메모리 초기화 함수에 __init, 이러한 변수에 __initdata를 붙여준다.

 

include/linux/init.h와 include/asm/init.h에서 보면

 

#define __init                __attribute__ ((__section__ (".text.init")))

 

함수는 코드 섹션인 .text 에 배치 되어야 한다.

하지만, __init 가 붙은 함수는 .text 섹션이  아닌 .text.init 섹션으로 배치되게 된다.

 

#define __initdata        __attribute__ ((__section__ (".data.init")))

 

마찬가지로 변수는 data 섹션인 .data에 배치 되어야 하지만,

__initdata 가 붙은 변수 또한 .data 섹션이 아닌 .data.init 섹션으로 배치 되게 된다..

 

이렇게 버릴수 있는 섹션에 배치하고, 초기화 실행후에 메모리를 free시켜주어서 메모리의 낭비를 막는다.

 

이러한 기능은 커널에서만 유효하지 모듈에서는 유효하지 않다.

 

다음 사이트에 있는 글을 공부하기 위해 다시 정리 함을 밝힘

 

http://www.skymoonsky.net/sky/view.php?id=CLanguage&no=33

출처 : Tong - 통동이님의 Linux통