MacBookで64ビットカーネルの使い心地
OSX 10.6(SnowLeopard)では、標準添付されるほぼすべてのソフトウェアが64ビットに対応した。アクティビティモニタ(/Applications/Utilities/Activity Monitor.app) で確認してみると、「種類」の列項目がほとんど「Intel(64ビット)」となっている。(でも、iPhoto・iTunesは未だ32ビットなんだけど)
さらに、SnowLeopardではOSの核であるカーネルまでも64ビットに対応したらしい。アクティビティモニタでPIDが常に0で表示されるkernel_taskさえも、64ビットに対応したのだ。しかし、デフォルトでは多くのマシンが未だ32ビットカーネルで起動するらしい。64ビットカーネルで起動するには「6」と「4」のキーを押しながら起動する必要があるそうだ。
でっかいことは良いことだ的な発想で、こうゆうのを見ると即試してみたくなる。カーネルも含めたすべてが64ビットで処理されると、その処理の効率化は一体どれほどになるのだろう?果たして体感できる何か、を感じられるのだろうか?期待を膨らましつつ、「6」と「4」を押しながら再起動してみた。
起動が完了してすぐに、アクティビティモニタでkernel_taskを確認してみた。ところが、表示は相変わらず「Intel」のみ。「64ビット」の表示はない。どうやら、32ビットカーネルで起動しているようだ。
「6」と「4」を押しながら、手軽に64ビットカーネルで起動するという夢は、早々に打ち砕かれたのであった...。前途多難?
起動できる条件
では、自分のMacBookは、果たして64ビットカーネルで起動できるマシンなのだろうか?64ビットカーネルで起動するためには、少なくとも、CPUとEFIが64ビット対応であることが必要な条件らしい。
64ビットCPU
- Mactrackerで確認してみると、Architecture: 64-bitとなっている。64ビットCPUだと思われる。
意図的な制限
では、なぜ64ビットカーネルで起動しないのか?
カーネルは起動時に32bit/64bitが選択できるのだが、Mac mini, Mac Book, Mac Book Airにおいては、Appleは上位機種との差別化の為、EFIが64bitに対応していても64bitカーネルがロードできないよう意図的に制限をかけている。32bitカーネルでも32GBまでのメモリを扱える為、実用的には問題ないのだが、...
http://www39.atwiki.jp/macmini/pages/30.html
制限を回避する
世界は広い。どんな時も、きっとどこかにその道の達人がいる。そして、自分には想像もできない方法で道を開いてくれる。今回もまた、検索するとMacBookで64ビットカーネルで起動する方法が見つかってしまった。素晴らしい技!
参考ページ
以下のページがたいへん参考になりました。感謝です!
自分が辿った手順(バックアップ)
- TimeMachineでバックアップしておく。(失敗して最悪起動しなくなっても素早く復元できるように。復元の手順も想像した。)
自分が辿った手順(64ビット対応boot.efiの作成)
- boot.efiをコピーする。
$ cp /System/Library/CoreServices/boot.efi ~/boot-k64.efi
HexEditorでの作業
- HexEditorをダウンロード。
- 先程コピーしたホームフォルダ直下の boot-k64.efi を HexEditor で開く。
- 以下3箇所のバイトコードの書き換えを行う。
- 0x28708 の 0x0 を 0x4 に変更
- 0x2870c の 0x0 を 0x1 に変更
- 0x28710 の 0x0 を 0x2 に変更
- 入力例
- 選択範囲 開始点: 0x28708 と入力してreturn。
- すると、0x28700を先頭とする行にジャンプする。
- 0x28708の位置をクリックする。
- 表示/編集方法... char: 0x4 と入力してreturn。
- 上記で書き換えたboot-k64.efiを、CoreServices内にコピーする。
$ sudo cp ~/boot-k64.efi /System/Library/CoreServices/
$ sudo chown root:wheel /System/Library/CoreServices/boot-k64.efi $ sudo chflags uchg /System/Library/CoreServices/boot-k64.efi $ sudo bless --folder /System/Library/CoreServices --file /System/Library/CoreServices/boot-k64.efi
カーネルモードの設定と確認
上記では毎回「6」と「4」を押して起動する必要があるが、以下のように設定しておけば常に64ビットカーネルで起動する。
- 64ビットカーネルで起動するモードの設定と確認。
$ sudo systemsetup -setkernelbootarchitecture x86_64 $ defaults read /Library/Preferences/SystemConfiguration/com.apple.Boot { Kernel = "mach_kernel"; "Kernel Architecture" = "x86_64"; "Kernel Flags" = ""; }
- 32ビットカーネルで起動するモードの設定と確認。
$ sudo systemsetup -setkernelbootarchitecture i386 $ defaults read /Library/Preferences/SystemConfiguration/com.apple.Boot { Kernel = "mach_kernel"; "Kernel Architecture" = i386; "Kernel Flags" = ""; }
$ sudo systemsetup -setkernelbootarchitecture default $ defaults read /Library/Preferences/SystemConfiguration/com.apple.Boot { Kernel = "mach_kernel"; "Kernel Flags" = ""; }
64ビットカーネルの使い心地
- 見事、64ビットカーネルで起動した!
- で、その使い心地はどうかというと...
お勧めできない!
-
- モニタの色合いが異常。
- カラー補正もできない。
- スクロール中に表示が乱れる。
- プレビュー.appで表示できない。
- モニタを閉じたらスリープせずフリーズした。
- 等々、ちょっと使っただけでも最適な状態で使えていないことに気付く。
32ビットカーネルの実力
それでは、MacBookではOSのカーネルまで含めた真の64ビットOSの真価を体感できないのだろうか?このまま半分の32ビッットカーネルでのんびり処理するしかないのか?そんながっかり感が込み上げてくるが、以下のページの解説を読むと、無理して64ビット化にこだわる必要なんてないことに気付いた。
- OSXでは、Intelの64ビットCPUで追加されたIA-32eというモードで実行している。
- IA-32eでは、64bitモードと32bit互換モードを超高速に切り替え可能。
- カーネルは32bit互換モードでも、アプリケーションやメモリ管理は64bitモードに切り替えて実行している。
- だから、カーネルの処理以外では64ビットの恩恵*1をちゃんと受けられるらしい。
- そして、一旦アプリケーションが起動してしまうと、アプリケーション自体の処理の中でカーネルに依存する部分はそれほど多くなさそう。(自分の利用環境では)
- 唯一気になるのはメモリ管理だが、32ビットカーネルでもメモリ管理は64ビットに切り替えて処理されるそうで、4GB以上のメモリ割り当ても問題なく可能らしい。
体感差
所感
- つまり、32ビットカーネルで起動しようが、64ビットカーネルで起動しようが、現状はほとんど性能差がない。(自分の使い方においては)
- 但し、サーバー用途ではまた違った結果になるかもしれない。
- アップルが設定する出荷時のカーネルモードで起動しておくのが、たぶん最適な環境となる。
- ちなみに、最新のMacBookやMacBook Airでさえも、64ビットカーネルはサポートされていないようだ。
- 一方、最新のMac Pro、MacBook Proは、64ビットカーネルがデフォルトの設定となっている。
- カーネルが32ビット・64ビットとは関係なく、カーネル以外のソフトウェアを64ビットで利用すれば、64ビットの恩恵を存分に受けられる。
- ユニバーサルバイナリを活用した32ビットから64ビットへの移行は実にスムーズ。
- ユーザーは32ビットか、64ビットか、なんてほとんど気にする必要は無い。
- PowerPCからIntelの時もそうだったが、もはやCPUの違いはたいした問題ではなくなってしまった。
- OSがCPUの違いを吸収して、その環境に最適な方法で実行するようになってしまった。