본문 바로가기
카테고리 없음

initcall list order

by kyuho.choi 2011. 8. 19.
728x90
반응형
kernel/include/linux/init.h

빌트인 코드를 작성하는 경우에는 특정 드라이버나 커널 코드의 초기화 시점과 연동을 맞춰주고 싶을때가 있다.

============================================================
#define pure_initcall(fn)               __define_initcall("0",fn,0)

#define core_initcall(fn)               __define_initcall("1",fn,1)
#define core_initcall_sync(fn)          __define_initcall("1s",fn,1s)
#define postcore_initcall(fn)           __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn)      __define_initcall("2s",fn,2s)
#define arch_initcall(fn)               __define_initcall("3",fn,3)
#define arch_initcall_sync(fn)          __define_initcall("3s",fn,3s)
#define subsys_initcall(fn)             __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn)        __define_initcall("4s",fn,4s)
#define fs_initcall(fn)                 __define_initcall("5",fn,5)
#define fs_initcall_sync(fn)            __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn)             __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn)             __define_initcall("6",fn,6)
#define device_initcall_sync(fn)        __define_initcall("6s",fn,6s)
#define late_initcall(fn)               __define_initcall("7",fn,7)
#define late_initcall_sync(fn)          __define_initcall("7s",fn,7s)

#define __initcall(fn) device_initcall(fn)

#define __exitcall(fn) \
        static exitcall_t __exitcall_##fn __exit_call = fn

#define console_initcall(fn) \
        static initcall_t __initcall_##fn \
        __used __section(.con_initcall.init) = fn

#define security_initcall(fn) \
        static initcall_t __initcall_##fn \
        __used __section(.security_initcall.init) = fn

============================================================

위 initcall 리스트는 커널 부팅 시점에서 사용되는 initcall 들의 우선순위를 나타내며,
숫자가 낮을수록 당연히 먼저 실행되는 부분이다.

동일 initcall level 에서 순서를 바꿔주고자  하는 경우에는 System.map 에서 해당 __initcall_(function)num 함수를 확인하여 그 순서를 manual 하게 바꿔줘야 한다...사실 더 좋은 방법이 있는 지는 나도 잘 모름 희희

eg) 먼저 init 순서에 대해 동기화를 맞추고 싶은 드라이버의 init 함수를 확인하자.

root@chlrbgh0:~/origen/kernel# cat System.map | grep origen_audio_init

c0020c40 t origen_audio_init
c0025ec4 t __initcall_origen_audio_init6

위와 같이 origen_audio_init 이 종료된 후 내가 작성한 커널 코드가 초기화 되고 싶다고 한다면,
커널 코드 작성시에 init 함수 작성시 우선  `static int __init my_driver_init()` 의 형태로 함수를 작성하고,
`device_initcall_sync(my_driver_init)` 의 형태로 지정하면 우선 소기의 목적은 달성할 것이다. :)

위 initcall define 중 #define device_initcall_sync(fn)        __define_initcall("6s",fn,6s) 을 보면device_initcall_sync 로 지정한 __init 함수는 initcall6 리스트 이 후에 등록 될 것이므로,
__initcall_origen_audio_init6 뒤에 등록 될 것이다.

문제는 같은 level 내에서 조정하고 싶은경우에는...Makefile 을 직접 수정하여 특정 커널오브젝트들이 빌드되는 순서를 조정해야 할 것이다... 누가 더 좋은 방법이 있다면 알려주기 바람미다 ㅠㅠ

참고로 순서를 조정하는 것은 위 System.map 에서의 memory map 을 참조하여 해당 address offset 의 순서가 조정되도록 빌드하면 된다잉 -ㅅ-/
728x90
반응형

댓글