리눅스 커널에서 clocksource 등록

Taeyoon Kim·2025년 4월 8일

들어가며


LX2160A 라는 SoC에서 리눅스를 부팅하면 부팅 로그 중

arch_timer: cp15 timer(s) running at 25.00MHz (phys)
clocksource: arch_sys_counter: mask 0xffffffffffffff max_cycles: 0x5c409fb33, max_idle_ns: 440795203156 ns

라는 로그를 볼 수 있다.

또한 유저 애플리케이션에서

clock_gettime()
clock_gettime()

두 번 연속 clock_gettime() 을 호출한 후, 그 차이를 출력하면 0ns 또는 40ns 이고

디바이스 드라이버(커널 코드)에서 ktime_get_ns() 을 두 번 연속 호출하여 그 차이를 출력해도 0ns 또는 40ns 였다.
이는 정확히 arm이 제공하는 arch_timer(또는 Generic Timer 라는 명칭을 가진다.) 의 진동수인 25MHz 와 일치한다.
그러면 clock_gettime() 이나 ktime_get_ns() 을 호출하면 어떤 경로를 거쳐 arch_timer 의 현재 카운터값을 읽고 이를 ns 로 변환하는 걸까?

arm_arch_timer.c


먼저, 리눅스 커널 내의 clocksource.c 라는 소스코드를 보면, __clocksource_freq_scale() 이라는 함수의 끝에 쯤에 pr_info() 함수로 처음에 서술했던 로그와 같은 형식을 출력하는 것을 발견할 수 있다.
다음으로, arm_arch_timer.c 라는 소스코드에 보면 .name이라는 멤버가 arch_sys_counter 인 struct clocksource 변수를 정의한 부분을 볼 수 있다.

(추후 점차 보완 예정…)

profile
Linux, Yocto Project, Embedded System, OS

0개의 댓글