CONFIG_RTC_SYSTOHC
나는 11분 커널 모드를 켜고 싶지 않기 때문에 11분 커널 모드 없이 커널이 컴파일된 Debian Buster 시스템을 가지고 있습니다 . 하지만 이 변경 사항이 실제로 작동하는지 확인하고 싶었습니다.
status
그래서 명령 출력의 필드를 확인했습니다 adjtimex --print
. 이 status
필드는 24577
또는 입니다 0b110000000000001
.
여기 매뉴얼 페이지에 따르면 -https://linux.die.net/man/8/adjtimex, 여기에 따르면 필드 64
의 비트 status
는 다음과 같습니다.not set
https://access.redhat.com/solutions/55432켜져 있음을 나타냅니다 11-minute mode
.
CONFIG_RTC_SYSTOHC
이는 as를 사용하여 커널을 컴파일할 때 예상했던 것과 모순됩니다 not set
. 11분 모드가 실제로 꺼져 있는지, 아니면 adjtimex
출력을 잘못 해석하고 있는지 어떻게 확인할 수 있나요 ?
답변1
(이 답변을 읽는 사람이 가질 수 있는 혼란을 없애기 위해: Linux가 실행 중일 때 (보통) 두 개의 시계가 있습니다. "기본" 시계는 일반적으로 CPU 기반 시스템 시계입니다. 다른 시계는 영구 하드웨어 시계입니다. (RTC) ). 시스템이 종료되면 시스템 시계의 시간이 손실되며 영구 하드웨어 시계만 올바른 벽시계 시간을 유지합니다.)
이 필드에 있는 비트의 기본 의미 64
는 "시스템 시계가 NTP 또는 다른 시간 소스에 의해 동기화되는지 여부"입니다. 11분 모드는 이와 밀접하게 결합되어 있었습니다. 시스템 시계가 동기화 중이면 RTC는 11분마다 업데이트됩니다.status
adjtimex
11분마다 시스템 시계에서 RTC로 전송을 비활성화하는 옵션이 CONFIG_RTC_SYSTOHC
나중에 추가되었습니다.
비활성화하면 CONFIG_RTC_SYSTOHC
시스템 시계 동기화와 RTC 11분 업데이트 간의 연결이 끊어집니다. 관련 커널 소스 코드를 볼 수 있습니다. 이 sync_rtc_clock()
기능은 Debian Buster의 표준 4.19.xx 커널에 있습니다.커널/시간/ntp.c 라인 #532. CONFIG_RTC_SYSTOHC
설정하지 않으면 함수가 아무 작업도 하지 않고 일찍 반환되는 것을 볼 수 있습니다 .
static void sync_rtc_clock(void)
{
unsigned long target_nsec;
struct timespec64 adjust, now;
int rc;
if (!IS_ENABLED(CONFIG_RTC_SYSTOHC)) <--- If CONFIG_RTC_SYSTOHC is not enabled,
return; <--- return immediately.
ktime_get_real_ts64(&now);
adjust = now;
if (persistent_clock_is_local)
adjust.tv_sec -= (sys_tz.tz_minuteswest * 60);
/*
* The current RTC in use will provide the target_nsec it wants to be
* called at, and does rtc_tv_nsec_ok internally.
*/
rc = rtc_set_ntp_time(adjust, &target_nsec);
if (rc == -ENODEV)
return;
sched_sync_hw_clock(now, target_nsec, rc);
}
즉, 효과적으로 비활성화하면 아무런 작업도 CONFIG_RTC_SYSTOHC
수행되지 11-minute mode
않습니다.
보다 실험적으로 커널 프로파일링 도구를 사용하여 이 함수를 11분의 적절한 배수로 모니터링 rtc_set_time()
하고 호출 빈도를 확인할 수 있습니다. 답이 0번이라면 하드웨어 RTC 시계가 11분 모드로 조정되지 않는다는 것을 알 수 있습니다.그것도 아니면 다른 어떤 것을 통해서도.