Linux カーネル、より正確には 3.9-rc6 の /arch/arm/mach-exynos/cpuidle.c では、次の行が読み取られます。
static unsigned int g_pwr_ctrl, g_diag_reg;
static void save_cpu_arch_register(void)
{
/*read power control register*/
asm("mrc p15, 0, %0, c15, c0, 0" : "=r"(g_pwr_ctrl) : : "cc");
/*read diagnostic register*/
asm("mrc p15, 0, %0, c15, c0, 1" : "=r"(g_diag_reg) : : "cc");
return;
}
この問題を調査した結果、これはgcc インラインアセンブリのようです。重要なコンポーネントであることを考慮して、asm
はこれを次のいずれかとして読み取ります。
- より速く、したがってより効率的
- C では使用できません
アセンブリを学んでいるのでARMマニュアルをチェックしましたが、3文字の長さからコプロセッサであることがわかりました。インライン asm は、電力制御レジスタにアクセスし、 (レジスタからの) 結果を最初の行の符号なし整数に保存するように見えます (ある時点で呼び出されると思います)。MCR
MCR
電源制御レジスタに関しては、アームのマニュアルに記載されていますが、
- Cortex-A9 プロセッサの実装のクロック レイテンシ
- ダイナミック クロック ゲーティング。
これが必要な理由を理解するのに苦労しています。これは、関数でその場でアクセスできます。
最後に、ARM マニュアルには、32 ビット幅のレジスタの設計がリストされています。ベースクロックはそこに設定されているようですが、アイドルコンテキストプロセスから起動しているときにこれを読んでいますか?
同様の質問も見つけました- これも役立つかもしれません。