커널의 초기화 동안 등록된 드라이버들이 자동으로 실행되고 초기화 되도록 하는데,
커널을 어떻게 설정하는가에 따라 커널에 포함되는 것이 다르므로 일일히 기록하는 대신에 자동으로
커널 컴파일하는 동안 포함되도록 할 수 있다. 필요한 모듈에 __init란 속성을 사용하고
module_init()를 사용해 이런 일이 가능하도록 한다.
module_init()는 include/linux/init.h에 다음과 같이 정의되어 있다.
#define module_init(x) __initcall(x);
__initcall(x)는 module로 지정됐는가 아닌가에 따라 정의가 달라지는데 어찌됐든 .initcall.init란
섹션에 속하게 된다. 여기에 속하면 커널의 링킹 동안 모아진 .initcall.init가 do_basic_setup()
혹은 do_initcalls()에 의해 자동으로 불려지게 된다(vmlinux.lds를 보면 .initcall.init를 모아주는
부분이 있다).
5.8. dmesg 정리
/var/log/dmesg는 부팅하는 동안 커널의 기록을 남겨 놓은 파일이다. 이 파일의 출력을 구분지어 어느 단계에서 어떤 메시지가 출력되는지 보자.
단계를 구분지어 놓으면 start_kernel()을 분석하는데 많은 도움이 될 것이고 커널 부팅 중에 에러가 났다면 어느 단계에서 에러 났는지 범위를 좁히고 찾아내는데 많은 도움이 될 것이다.
커널의 초기화 동안 등록된 드라이버들이 자동으로 실행되고 초기화 되도록 하는데, 커널을 어떻게 설정하는가에 따라 커널에 포함되는 것이 다르므로 일일히 기록하는 대신에 자동으로 커널 컴파일하는 동안 포함되도록 할 수 있다. 필요한 모듈에 __init란 속성을 사용하고 module_init()를 사용해 이런 일이 가능하도록 한다.
module_init()는 include/linux/init.h에 다음과 같이 정의되어 있다.
__initcall(x)는 module로 지정됐는가 아닌가에 따라 정의가 달라지는데 어찌됐든 .initcall.init란 섹션에 속하게 된다. 여기에 속하면 커널의 링킹 동안 모아진 .initcall.init가 do_basic_setup() 혹은 do_initcalls()에 의해 자동으로 불려지게 된다(vmlinux.lds를 보면 .initcall.init를 모아주는 부분이 있다).
Recent Posts
Archive Posts
Tags