Linux PHCでCPU低電圧化

(以下の内容はPCを破損させる可能性のある云々以下略)。
先日のまとめエントリで指摘したとおり、Thinkpad x100eの一番大きな欠点の一つが、AMD Athlon Neo MV-40の発熱の大きさです。黙って使っているとキーボードは熱くなるわ、排気は火傷しそうに熱いわ、電池はあっという間に減るわと踏んだり蹴ったりです。
Windows 7ではすでに書いたようにRMClockを使ってCPU電圧を下げて使用しています。この結果、キーボード温度の低下、排気温度の低下、電池持続時間の延長と、いい効果がありました。今回、Linux PHCカーネルを使ってUbuntu 10.04でもCPUの低電圧化を行い、同様の結果が出たのでここで紹介します。

CPU低電圧化の背景

かつてPCのCPUの動作電圧は、決めうちの電圧を与えていました。具体的にいうと8086の頃には5V、i486DX4の頃には3.3Vの電圧を与えていました。しかしながら、CPU動作電圧の低下と使用製造プロセスの進化により、マザーボードが複数の種類のCPU電圧に対応する必要が出てきました。その結果、CPUがVIDと呼ばれる信号をマザーボード上の電源モジュールに与える手法が導入されました。電源モジュールはVIDに応じた電圧をCPUに供給します。
その後、IntelSpeedStepテクノロジの導入により、CPU状態に応じた動作クロック周波数と、CPU動作電圧をCPUが動的に選べるようになりました。CPU動作クロックを決める設定値はFID、動作電圧を決める設定値はVIDと呼ばれます。このFID:VIDペアが動作状態ごとに宣言されており、つまり、これらの値を変えると特定の動作状態での動作クロック、あるいは動作電圧を変更することができます。
今回はこのペアのうちVIDを変更することで動作電圧を下げようという寸法です。

PHCカーネルの導入

Ubuntuが使用している通常のLinuxカーネルにはVIDを変更する機能はありません。そこで、LinuxカーネルにVID変更機能を追加するLinux-PHCプロジェクトの成果物を使用して、VID変更機能を導入します。
Linux-PHC(Processor Hardware Control)プロジェクトは、LinuxカーネルにVID変更機能を追加するパッチを開発しています。本来ならそのパッチをソースコードに当ててLinuxカーネルを最初からビルドしなければならないところですが、幸いにもLinux-PHCではUbuntuで使用可能なコンパイル済みカーネルを配布しています。今回はそのコンパイル済みカーネルを使います。実行環境はUbuntu 10.04です。
コンパイル済みカーネルを導入するために、以下のコマンドを実行します。

$ sudo add-apt-repository ppa:linux-phc/ppa
$ sudo apt-get update
$ sudo apt-get install linux-image-generic-phc linux-headers-generic-phc

導入に成功するとGRUB2のメニューも更新されます。なお、私はPAEカーネルを使っていますので、最後の行は次のように変更して実行しています。

$ sudo apt-get install linux-image-generic-pae-phc linux-headers-generic-pae-phc

linux-generic-pae-phcを使うことで、4GBのメモリをフルに使い、かつCPUの低電圧化をはかることができます。

AMDプロセッサ用パッチの導入

PHCカーネルを導入しただけでは電圧を変更できません。そこで、Linux-PHCプロジェクトが提供しているAMD K8プロセッサ用パッチを導入します。パッチはLinux-PHCプロジェクトのforumからDownloadに進むと、ダウンロード専用スレッドがありますので、ここから入手します。これを書いている時点では phc-k8_v0.4.4.tar.gzが最新ファイルです。
上記ファイルをダウンロードしたら、展開し、インストールします。

$ tar xvzf phc-k8_v0.4.4.tar.gz
$ cd phc-k8_v0.4.4
$ make
$ sudo make dkms_install

インストールが完了したら再起動します。再起動後、GRUB2のメニューでPHCカーネルを選択してブートしてください。

デフォルトのVID設定を調べる

再起動後、ログオンしたら以下のコマンドを実行して状態ごとのFID:VIDペアを調べます。Athlon Neo MV-40プロセッサの電源管理は2状態で行いますので、FID:VIDペアも二つだけです。

$ cat /sys/devices/system/cpu/cpu0/cpufreq/phc_controls 
8:22 0:22

ここで、FID=8は1.6GHz、0は800MHzです。また、VIDとCPU電圧の関係はAMD K8の場合は次のようになっています。

CPU電圧[mV] = 1550 - 25 * VID

つまりVIDが22なら1000mVであり、CPUは1.6GHz時、800MHz時いずれも1.0Vで動作しているとわかります。

カスタムVIDの設定

VIDを変更して低電圧化するには、何ボルトで動作させるかをあらかじめ決めなければなりません。Ubuntu日本語フォーラム / [Howto]JauntyJackalope(9.04) betaにPHCを導入するにはlinux-phc-optimize.bashを使って動作可能な電圧の下限を探る方法が紹介されています。私はすでにWindowsで運用中の 1.6GHz:0.8V 800MHz:0.7Vという設定を使用することにしました。FID:VIDは8:30 0:34です。
変更は起動時に特別なスクリプトを実行することで行います。スクリプトは/etc/rc.localです。次のようにrootでrc.localを開いてください。

$ sudo gedit /etc/rc.local

そしてrc.localの内容を以下のように変更します。

echo "8:30 0:34" >/sys/devices/system/cpu/cpu0/cpufreq/phc_controls
exit 0

再起動してFID:VIDペアが更新されていることを確認します。

$ cat /sys/devices/system/cpu/cpu0/cpufreq/phc_controls 
8:30 0:34

まとめ

CPUの低電圧化でx100eのカスタム化も正真正銘一段落です。すでにSSD化によってHDDのモーター分の電力を削っているため、CPUの消費電力を押さえ込むことで電池による動作時間がかなり延び、ずいぶん快適な環境となりました。

追記

2011/Nov/20 パッチのバージョン情報とインストール方法を変更。