본문 바로가기

Programming/Linux_Kernel

What is mean? __init_refok, __initdata_refok, __exit_refok



/* modpost check for section mismatches during the kernel build.
 * A section mismatch happens when there are references from a
 * code or data section to an init section (both code or data).
 * The init sections are (for most archs) discarded by the kernel
 * when early init has completed so all such references are potential bugs.
 * For exit sections the same issue exists.
 * The following markers are used for the cases where the reference to
 * the *init / *exit section (code or data) is valid and will teach
 * modpost not to issue a warning.
 * The markers follow same syntax rules as __init / __initdata. */

#define __ref            __section(.ref.text) noinline
#define __refdata        __section(.ref.data)
#define __refconst       __section(.ref.rodata)

/* compatibility defines */
#define __init_refok     __ref
#define __initdata_refok __refdata
#define __exit_refok     __ref

날림해석을 해보면,

modpost 는 커널을 빌드하는 동안 section mismatch 를 점검한다.
section mismatch 는 init section(code 와 data둘다)이 다른 code 나 data section 에 의해 참고될때 발생한다.
(그 이유는) init section 는 대부분의 아키텍쳐(arm 이나 x86, powerPC 따위의..)에서 early init 이 완료되었을때 kernel 에 의해서 버려진다. 그리고 각각의 참조들은 모두 잠재적인 버그가 된다.
exit 색션도 같은 이슈가 존재한다.
뒤에 나오는 marker(define 들을 말한다.)들은 init 이나 exit의 data나 code section을 참고하는 경우에 이것이 유효(가능)한 참조라고 할때 사용된다. 그리고 modpost 에게 이것은 warning 이슈가 아니라고 말해준다.
이것의 syntax 룰은 __init 이나 _initdata 의 룰과 동일하다.

간단히 말하면 init section 을 참고하면 modpost 에 의해 warning 이 발생하게 되는데
부득이하게 사용할 경우 이 prefix 를 사용하면 된다는 의미이다.