안녕하세요.
그래서 이렇게 글하나 남깁니다.
user space 에서 gettimeofday는 다음과 같고
user space 에서 clock_gettime는 다음과 같습니다.
(glibc 를 봐야 하나 살펴보기 쉬운 bionic를 대체 했습니다)
시스템콜 호출 함수가 다른데요..
SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
struct timezone __user *, tz)
{
if (likely(tv != NULL)) {
struct timeval ktv;
do_gettimeofday(&ktv);
if (copy_to_user(tv, &ktv, sizeof(ktv)))
return -EFAULT;
}
if (unlikely(tz != NULL)) {
if (copy_to_user(tz, &sys_tz, sizeof(sys_tz)))
return -EFAULT;
}
return 0;
}
gettimeofday 의 시스템콜 대응 함수는 do_gettimeofday 입니다.
SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
struct timespec __user *,tp)
{
struct k_clock *kc = clockid_to_kclock(which_clock);
struct timespec kernel_tp;
int error;
if (!kc)
return -EINVAL;
error = kc->clock_get(which_clock, &kernel_tp);
if (!error && copy_to_user(tp, &kernel_tp, sizeof (kernel_tp)))
error = -EFAULT;
return error;
}
clock_gettime 의 시스템콜 대응 함수는 kc->clock_get 인데요...
저는 실무에서
user 에서는 gettimeofday 와
kernel 에서는 do_gettimeofday(와 똑같은 스킴의 ktime_get)을 사용합니다.
do_gettimeofday 함수는 arch clock source (ARM CPU Timer(RTC? Clock counter?) 로 부터) 함수 호출 순간의 현재 값을 읽어옵니다.
그래서 이게 정확할 것입니다.
clock_gettime 함수는 처음 보는데...
함수 느낌으로 봐서는 kernel config define 이나 BSP 완성도에 따라서 정확할 수도 있고 아닐 수도 있을 것 같습니다.
결론은 gettimeofday 추천.
ps 두 함수의 차이점과 do_gettimeofday 의 동작 방식을 100% 확실히 모르는 상태에서 이렇게 글까지 써가며 답변 드려 죄송합니다.