The thermal control on the Mac OS X Mac OS Xの温度管理
CPU Thermometerは、動作する環境がかなり限定されています。 これは、CPUの種別によっては、マイクロ・カーネルの温度測定機能が使用できないものがあるためです。
G3以降のPowerPCでは、CPUチップ上にTAU(Thermal Assist Unit)と呼ばれるモジュールが組み込まれています。 TAUというのは、チップの温度を測定する一種の温度計です。
9.1までのMac OSでは、TAUは特殊なユーティリティを起動しない限り、使用されることはありませんでした。 しかし、Mac OS Xではマイクロ・カーネルのレベルで、TAUを使用したCPUの温度管理が行われています。
Mac OS Xでは、CPUの温度をTAUを使って監視し、温度が高すぎる場合にはCPUのクロックを下げます。 これによって、過熱によるCPU破損の防止や、強制空冷ファンの停止による消費電力の低減を計ることができるはずです。 CPU Thermometerは、元々はこの目的で用意されているマイクロ・カーネルの非公開システム・コールを利用して、 CPUの温度測定を行っています。
Make an exploration into the micro kernel ソース・プログラムからの解析
ところが、Darwinとして公開されているソース・プログラムを解析した結果、 この温度管理機能が一部のCPUではサポートされていないことがわかりました。
問題の部分は、Darwin 1.3.1のソース・プログラムのxnu/osfmk/ppc/start.s
ファイルにあります。
ここに、CPUのタイプごとのテーブル(Proceeor to feature table)が記述されています。
以下に、PowerPC 750(いわゆるG3プロセッサ)用のテーブルを抜き出してみました:
; 750 (generic) align 2 .long 0xFFFF0000 ; All revisions .short PROCESSOR_VERSION_750 .short 0 .long pfFloat | pfCanSleep | pfCanNap | pfCanDoze | pfThermal | pfL1i | pfL1d | pfL2 .long init750 .long CPU_SUBTYPE_POWERPC_750 .long 105 .long 90 .long 32 .long 32*1024 .long 32*1024
ここで、pfThermal
というのが温度管理を許可するフラグです。
実際のCPU温度測定処理は、xnu/osfmk/ppc/machine_routines_asm.s
ファイルの
ml_read_temp
というルーチンで行われています。
ml_read_temp
ルーチンの実行時には、PowerPCのSPRG2レジスタにfeature tableのフラグがコピーされており、
次のようなコードで温度測定の可否をチェックしています:
mfsprg r7,2 ; Get CPU specific features mtmsr r8 ; Do not allow interruptions mtcrf 0x40,r7 ; See if we can thermal this machine bf pfThermalb,thrmcant ; No can do...
さて、それぞれのタイプのCPUについてfeature tableをチェックしてみました。
pfThermal
が設定されているのは、以下のタイプのCPUだけのようです:
- PowerPC 750 (ver.2.2以外のもの)
- PowerPC 7400
つまり、上記以外のタイプのCPU以外を搭載したMacintoshでは、CPUの温度測定はできないのです。 実際、私の手元のiMac rev.C(PowerPC 750 ver.2.2)では、CPU Thermometerは動作しませんでした。 一方、PowerBook Firewire(PowerPC 750 ver.3.0)では、問題なく動作しています。
それにしても、G3以降のすべてのCPUで温度管理が許可されていないのは不思議です。 もしかすると、一部のCPUのTAUにはバグがあって、温度管理を実現できないのかもしれません。 このあたりの事情をご存じの方がいらっしゃいましたら、ぜひ、ご教授くださいませ。