この手のサーバに入れる OS となれば、やはり pc-unix だろうが、残念ながら linux kernel の geode lx 対応は半端で、周波数変更も出来ないようだ。折角の省電力が泣くよな。
もっとも、まったく不可能というわけでもなく、OLPC では上手くやっているらしい。
Windows 系では、Geode LXの倍率変更 にあるように有志の手でフリーソフトに統合されているぐらいである。また、同掲示板にはどこをいぢればいいかまで書いてあることだし、Linux でもいけるんじゃないの?と考えた。
CPU の周波数をいぢるには、MSR (Model Specific Register) をいぢる必要がある。Linux の場合だと、 msr-tools/ を使う。また、カーネルモジュールの msr、cpuid あたりをロードしておく必要がある。
速度設定が入っているアドレスは 0x4c000014 だ。msr-tools のうち rdmsr を使って
rdmsr 0x4c000014
とやると 0x49c07de0000 みたいな出力が戻ってくる。最初の3桁が FSB と CPU の周波数依存の部分で、残りは固定だ。
FSB/CPU 速度と MSR との関係は以下の通り。縦が FSB、横が CPU だ。
mem\cpu | 200 | 233 | 266 | 300 | 333 | 366 | 400 | 433 | 466 | 500 | 533 |
---|---|---|---|---|---|---|---|---|---|---|---|
200 | 28a | 28c | 28e | 290 | 292 | 294 | 296 | 298 | 29a | 29c | 29e |
233 | 30a | 30c | 30e | 310 | 312 | 314 | 316 | 318 | 31a | 31c | 31e |
266 | 38a | 38c | 38e | 390 | 392 | 394 | 396 | 398 | 39a | 39c | 39e |
300 | 40a | 40c | 40e | 410 | 412 | 414 | 416 | 418 | 41a | 41c | 41e |
333 | 48a | 48c | 48e | 490 | 492 | 494 | 496 | 498 | 49a | 49c | 49e |
366 | 50a | 50c | 50e | 510 | 512 | 514 | 516 | 518 | 51a | 51c | 51e |
400 | 58a | 58c | 58e | 590 | 592 | 594 | 596 | 598 | 59a | 59c | 59e |
Geode LX の CPU 周波数を変更したいのであれば、任意の数字を同じアドレスに書き込めばいい。例えば、CPU を 333 Mhz に変更したければ
wrmsr 0x4c000014 0x$49207de0000
とする。
但し、いくつが注意点がある。
- FSB を変更すると、高確率でリセットする。自由度を持たせたいのであれば、予め低い FSB を選んでおくのが良い。ベンチマーク結果によれば、その場合でもFSBの低下による速度の低下は僅少。
- CPU の速度を変えても、カーネルは認識しない。そのためシステムクロックに tsc を使っていると、時間がおかしくなる。クロックソースは acpi_pm 等に変更すること。
(echo acpi_pm > /sys/devices/system/clocksource/clocksource0/current_clocksource) - 周波数変更用のスクリプト : cpufreq_glx
- 参考 : 33234d_lx_ds.pdf : Geode LX Databook