Lower Decks:CPUの種別と温度管理

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だけのようです:

つまり、上記以外のタイプのCPU以外を搭載したMacintoshでは、CPUの温度測定はできないのです。 実際、私の手元のiMac rev.C(PowerPC 750 ver.2.2)では、CPU Thermometerは動作しませんでした。 一方、PowerBook Firewire(PowerPC 750 ver.3.0)では、問題なく動作しています。

それにしても、G3以降のすべてのCPUで温度管理が許可されていないのは不思議です。 もしかすると、一部のCPUのTAUにはバグがあって、温度管理を実現できないのかもしれません。 このあたりの事情をご存じの方がいらっしゃいましたら、ぜひ、ご教授くださいませ。

作成:2001年5月4日, © 2001 raktajino,All rights reserved. raktajino@mac.com