
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が実行されているとき(通常)2つの時計があります。「基本」時計は通常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分モードに調整されていないことがわかります。それでも、他の何かを通して。