728x90
반응형
kernel/include/linux/init.h
빌트인 코드를 작성하는 경우에는 특정 드라이버나 커널 코드의 초기화 시점과 연동을 맞춰주고 싶을때가 있다.
============================================================
#define pure_initcall(fn) __define_initcall("0",fn,0)
빌트인 코드를 작성하는 경우에는 특정 드라이버나 커널 코드의 초기화 시점과 연동을 맞춰주고 싶을때가 있다.
============================================================
#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
위와 같이 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 의 순서가 조정되도록 빌드하면 된다잉 -ㅅ-/
============================================================
위 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
반응형
댓글