리눅스 커널은 부팅 과정이 완료되면 부팅 과정에서만 사용하는 코드/데이터를 메모리에서 해제합니다.
이러한 코드/데이터는 각각 __init와 __initdata 매크로를 통해 표시하며
이는 결국 해제되는 영역이므로 부팅 이후에는 해당 코드/데이터를 참조해서는 안됩니다.
다시말하면 __init로 표시되지 않은 코드에서 해당 코드/데이터를 참조해서는 안됩니다.
커널에는 이러한 실수를 방지하고자 빌드 시에 해당 참조가 발생하는지 검출해내는 코드가 포함되어 있습니다.
하지만 어떤 경우에는 그러한 코드/데이터를 참조해야 하는 경우가 있을 수 있습니다.
가령 특정한 함수는 부팅 시부터 시스템이 종료될 때까지 계속 사용되지만
부팅 시에만 특정한 작업을 하기 위해 해당 코드/데이터를 참조하는 경우가 있을 수 있습니다.
이 경우에 __init_refok 매크로를 이용하면 이러한 참조가 올바른 것임을 검출 도구에게 알려주어
경고를 발생시키지 않도록 할 수 있습니다.
__init 코드/데이터 참조 허용
리눅스 커널은 부팅 과정이 완료되면 부팅 과정에서만 사용하는 코드/데이터를 메모리에서 해제합니다.
이러한 코드/데이터는 각각 __init와 __initdata 매크로를 통해 표시하며
이는 결국 해제되는 영역이므로 부팅 이후에는 해당 코드/데이터를 참조해서는 안됩니다.
다시말하면 __init로 표시되지 않은 코드에서 해당 코드/데이터를 참조해서는 안됩니다.
커널에는 이러한 실수를 방지하고자 빌드 시에 해당 참조가 발생하는지 검출해내는 코드가 포함되어 있습니다.
하지만 어떤 경우에는 그러한 코드/데이터를 참조해야 하는 경우가 있을 수 있습니다.
가령 특정한 함수는 부팅 시부터 시스템이 종료될 때까지 계속 사용되지만
부팅 시에만 특정한 작업을 하기 위해 해당 코드/데이터를 참조하는 경우가 있을 수 있습니다.
이 경우에 __init_refok 매크로를 이용하면 이러한 참조가 올바른 것임을 검출 도구에게 알려주어
경고를 발생시키지 않도록 할 수 있습니다.
답변 감사드립니다.
항상 도움 많이 받고 있습니다.
감사합니다.
답변에 감사합니다.
자세한 설명 덕분에 이해가 잘 되었습니다!
댓글 달기