MBR を改造して Mac Pro でも Windows を AHCI で使おう
先日購入した Apple Mac Pro MC560J/A (以下 Mac Pro) は Mac OS X をほとんど起動することなく BootCamp + Windows 7 x64 環境で運用しています。が、SAMSUNG HD155UI/HD204UI をご利用の方に非常に重要なお知らせ とか CrystalDiskMark 3.0.1 リリースとかの絡みでいろいろ調査しているときにふと IDE モードで動いていることに気が付きました。えぇ、あまり深く考えずに AHCI モードでバリバリ NCQ 使って動いているのだとばかり思っておりました。
CrystalDiskInfo とか CrystalDiskMark を作っているのに IDE モード使っているなんて・・・。しかも、換装した Intel X25-M G2 120GB 超ハエーとか嫁と娘(2ヵ月)に自慢しまくっていたというのに。NCQ が使えない IDE モードで満足していたなんて・・・。
が、IDE モードで動作しているということに気が付いた途端愛機 Mac Pro たんが、亀のように鈍足な気分になってしまいました。このままでは年は越せない!! なんとしても、AHCI モードに切り替えねばなるまい。そう決意しネットの海を彷徨うのであった。
【本編】
ネットを彷徨うと色々な情報が見つかりました。
どうやら、Mac OS X 上で johnsock 氏が作成したスクリプトを実行する方法と Linux Live CD を使って GRUB の設定をどうこうするという二つの方法があるようです。
ネットで調べたことのまとめ
- Mac Pro では ICH10 の ATA コントローラは Mac OS X を起動するときは AHCI モード用の Device ID (0x3A22)に設定され、それ以外の OS を起動するときは IDE モード用の Device ID (0x3A20) で起動する。
- ICH10 のデータシートを見ると IDE モードと AHCI モードの切り替えは簡単で、Device 31, Function 2 のコンフィギュレーションレジスタ 0x90 をいじるだけ。でも、OS を起動する前に実施する必要があるとの注釈あり。
- johnsock 氏が作成したスクリプトと GRUB の設定をどうこうというのには、OS 起動前に上記レジスタをいじるコードが含まれている。
ふむふむ。これだけわかれば Windows だけでも完結出来そうだぞと。
- 念のため、今は亡き WinRing0 を使ってコンフィギュレーションレジスタを IDE モードから AHCI モードに変更してみました。実行したところ、Device ID が確かに変わったのですが、新しい AHCI コントローラを見つけることなくあえなくクラッシュ・・・。そりゃそうか。さすがに IDE コントローラが急に居なくなったらディスクアクセスした瞬間に終了ですね。
- johnsock 氏が作成したスクリプトを眺めてみると
AHCI_CODE=66B890FA0080BAF80C66EFB040BAFC0CEEC3
という文字列が。どうやら、MBR のどこかにこいつを突っ込むらしい。 - AHCI compliance on Macs running Windows and Linux の解説を読むと MBR 162h の C3 を上記コードに置き換えればよい感じ。ふむふむ。
- で、C3 ってなんだろうと久しぶりにプログラミング 80386 を眺めてみると RET と。CALL したところに戻るってことでイメージ的には関数の最後ってところでしょうか。
- あとは、MBR を読み書きするツールとバイナリエディタがあれば簡単です。ちょっとドキドキするけど MBR のバックアップさえとっておえけば最悪外付けケースに入れて別 PC から MBR を復元すれば良いだけなので気にせずGO!!
Mac Pro AHCI モードへの道
- “HKLM\System\CurrentControlSet\Services\msahci\start” キーの値を 0 に変更
- MBR エディタはマイクロソフト純正 Disk Probe を使うことにしました。Windows 7 ではなくなってしまったようなので、Windows XP 用のものを使用しました。MBR を読み書きするだけなので何ら問題ありません。
- Disk Probe で MBR を保存
- 保存したファイルをバイナリエディタで加工。AHCI compliance on Macs running Windows and Linux に書いてある通り 162h ~ のコード部と 191h ~ のエラーメッセージ部を変更しました。別にエラーメッセージは出ないのでですが念のため。
- Disk Probe で加工したファイルを MBR に書き戻す。
- Windows を再起動
- めでたく AHCI コントローラを検出
という流れです。ICH10 のデータシートを眺めると AHCI モードには、AHCI 4 port + IDE 2 port のモードと AHCI 6 port のモードがあるようです。AHCI_CODE=66B890FA0080BAF80C66EFB040BAFC0CEEC3 の 40h を 60h にすると AHCI 6 port になりそうな感じだったのですが、正常に動作しませんでした。データシートをさらに眺めると port を Enable するために 0x92 もいじくる必要があるみたい。が、これを実施するためには上記コードを逆アセンブルして理解する必要が・・・。十数バイトなのでハンド逆アセンブル出来そうな感じではありますが、そこまでして 6port モードにする必要もないのでとりあえず保留としました。(解決済み – 追記参照のこと) あと、40h を 80h に変更すると RAID モードになりそうな感じですがとりあえず未実施です。気が向けばそのうち。
ちなみに、BootCamp マネージャが動作しなくなるので Mac OS X に切り替えるのは手動となります。
最終形態
AHCI
- port 0 : 光ディスク (HL-DT-ST DVD-RW GH61N)
- port 1 : 光ディスク用空き
- port 2 : Mac OS X 用 SSD (TOSHIBA THNS064GG2BBAA)
- port 3 : Windows 用 SSD (INTEL SSDSA2M120G2GC)
IDE
- Channel 0 : SAMSUNG HD204UI
(バグバグファームウェア搭載版 – SAMSUNG HD155UI/HD204UI をご利用の方に非常に重要なお知らせ) - Channel 1 : SAMSUNG HD154UI
SAMSUNG HD204UI を IDE モードで動作させておけば倉庫にぴったりです。
【まとめ】
Mac Pro + Windows における AHCI 化は Windows 単体で可能です。私のように Mac にも Linux にも疎い方も安心です。でも、実行は自己責任で。
【追記 2010/12/28 19:30 頃】
MBR をバックアップしたファイルを NASM についてる ndisasm.exe で解析するだけで OK でした。わざわざハンド逆アセンブルする必要ありませんでした。
追加した AHCI_CODE=66B890FA0080BAF80C66EFB040BAFC0CEEC3 の逆アセンブル結果
00000162 66B890FA0080 mov eax,0x8000fa90
00000168 BAF80C mov dx,0xcf8
0000016B 66EF out dx,eax
0000016D B040 mov al,0x40
0000016F BAFC0C mov dx,0xcfc
00000172 EE out dx,al
00000173 C3 ret
なんだか 0x92 も簡単に変更できそう。4port モードでは 0x0F (port 0-3 が有効)なので、0x3F (port 0-5 が有効) に変更してみます。
0000016D B040 mov al,0x40
⇒ 0000016D B060 mov al,0x60 に変更
※6port モードにするため。
00000173 66B890FA0080 mov eax,0x8000fa90
BAF80C mov dx,0xcf8
66EF out dx,eax
B03F mov al,0x3F
BAFE0C mov dx,0xcfe
EE out dx,al
C3 ret
※PCI コンフィギュレーション空間へのアクセス方法は以前「PCI デバイス設計入門」(CQ 出版)で勉強しました。
最終形態 其の弐
AHCI
- port 0 : 光ディスク (HL-DT-ST DVD-RW GH61N)
- port 1 : 光ディスク用空き
- port 2 : Mac OS X 用 SSD (TOSHIBA THNS064GG2BBAA)
- port 3 : Windows 用 SSD (INTEL SSDSA2M120G2GC)
- port 4 : SAMSUNG HD204UI
(バグバグファームウェア搭載版 – SAMSUNG HD155UI/HD204UI をご利用の方に非常に重要なお知らせ)
⇒ 超心配!! - port 5 : SAMSUNG HD154UI
【追記 2010/12/28 19:40 頃】
ようやく NCQ + Write Cache ON の状態で SAMSUNG HD204UI で運用できるようになりましたので、 SAMSUNG HD155UI/HD204UI をご利用の方に非常に重要なお知らせ で話題のネタを試してみることにしました。
Intel ICH10R SATA AHCI Controller, 2010/11/06, 10.1.0.1008 + Windows 7 x64 でファイルコピー中に CrystalDiskInfo を起動してみました。が、変化なし。何度も試すのも面倒なのでまぁいいかと。
あと、PCI コンフィギュレーション空間にアクセスした後はCONFIG_ADRESS レジスタの最上位ビットを 0 にして、0xCFC – 0xCFF の I/O 空間を CONFIG_DATA レジスタから切り離しておくようにとのことでしたので以下のコードを追加しても良いかも。
66B800000000 mov eax,0x00000000
BAF80C mov dx,0xcf8
【追記 2010/12/28 20:20 頃】
久しぶりに I/O とか PCI コンフィギュレーション空間と戯れて楽しかったです。Windows 上だとコードサイニング証明書が必要だったり作法がどうとか色々ありますが、OS 起動前であれば好き放題です。もちろん、OS 初期化時に設定変更されちゃうものは無意味ですけどね。
今回初めて MBR の改造をしてみたわけですが、勝手がわかれば PCI デバイスの設定や MSR の設定など色々活用できそうです。Windows 上で動作するチューニングツールも便利ですが、OS 起動前にこっそりチューニング用のコードを仕込んでおくとかクールですね♪
亀⇒うさぎな爆速 NCQ 対応で良い年を迎えられそうです。
【追記 2010/12/29 9:00 頃】
6port モードで運用開始!! と思ったのですが、スリープから復旧すると port 4, 5 を見失ってしまいます。コンフィギュレーションレジスタ 0x92 を確認すると 0x3F (port 0-5 有効) から 0x0F (port 0-3 有効) に戻っているではありませんか。ICH10 のデータシートを見るとリセットすると 0x0F に戻ると書いてあるので何らかの方法で 0x3F に戻す必要があります。
とりあえず、WinRing0 を使った専用ツールで 0x3F に書き戻してデバイスマネージャからハードウェアの再検出を行うと port 4,5 に接続した HDD も見えるようになりました。が、面倒だし、スリープ前に動いていた一部プロセスが実行ファイルを見失い異常終了してしまいます。
スリープからの復帰を検知し、ハードウェアの再検出を行うツールを常駐させておけばなんとかなるような気もしますが、Windows 上で動くアプリの仕事ではないので素直に 4 port モードで運用することにします。この辺りは、EFI?, BIOS?, ACPI ? あたりから適切な値に再設定したうえで OS に制御を渡すようにしてくれないとどうにもならない感じです。PC/AT 互換機では BIOS 設定画面で色々設定しておくとそういった部分はちゃんと面倒見てくれるのでしょう。
【追記 2010/12/29 9:15 頃】
せっかくなので RAID モードも試そうとしたのですがうまく動きませんでした。設定に問題があるのかもしれませんが RAID は使わないので深追いはしないことにします。
これにして、うさぎと亀プロジェクトは終了!!
WindowsマシンとしてIntelMacが欲しかったりもするので参考になりました。
……懐が寂しいので、Mac本体とそれに入れるWindowsを買うお金が無かったりもしますけどー
こんな方法が有ったんですね
2年前に知っていたら、ThinkPadX61TabletをAHCI 3Gbpsで動作させられるか試していたかと思います。
ThinkPad535をWinXPでIDE Busmasterで動作させる為に、PIIXのLoad前にIntelsatでRegisterを書き換えたのを思い出しました。
WinRing0も、ISMSなりの前にLoadされる用にしておいたら動作したりしないのかしら???
Intel macのboot sequenceが判らないからなんとも言えないけど
> ち さん
Intel Mac を PC として使うには色々制限があるわけですが、それを技術と根性で解決するのは楽しいですね。あと、Mac があれば今後 iPhone/iPod Touch 用アプリを作りたいなぁ~って時も安心です。まずは、Android で一本なんですけどねorz
> あすかさん
MBR に起動用のコードが格納されていることは知識として知っていたのですが、今回のように OS 起動前に必要な初期化コードを埋め込めるという認識はありませんでした。
>2年前に知っていたら、ThinkPadX61TabletをAHCI 3Gbpsで動作させられるか試していたかと思います。
おっと、うちの Let’s Note Y8 もひょっとして 3Gbps で動いたりするのかも。今度試してみよう。
MBRの取得はできたのですが、BzEditorで変更しようと思ったのですが、
162h~ 191h~
に
AHCI_CODE=66B890FA0080BAF80C66EFB040BAFC0CEEC3
を突っ込む、というところで、よくわからず、挫折しています。
もう少し、詳しく教えてもらえないでしょうか。
お願いします。
> はるさん
返信が遅くなり申し訳ない。
正直なところ上記説明で理解できない方はチャレンジしないほうが無難です。きっと二度と立ち上がらない状況になると思いますし、自力で復旧出来ないと思うので。
> AHCI_CODE=66B890FA0080BAF80C66EFB040BAFC0CEEC3
162h の C3 はリターン命令です。リターンする前に PCI コンフィギュレーションレジスタを弄繰り回して最後にリターン命令で戻るわけです。