MacBookで64ビットカーネルの使い心地

OSX 10.6(SnowLeopard)では、標準添付されるほぼすべてのソフトウェアが64ビットに対応した。アクティビティモニタ(/Applications/Utilities/Activity Monitor.app) で確認してみると、「種類」の列項目がほとんど「Intel(64ビット)」となっている。(でも、iPhotoiTunesは未だ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ビットEFI
  • ターミナルで以下のコマンド($を除く太字の部分)を実行して確認してみた。
$ ioreg -l -p IODeviceTree | grep firmware-abi
    | |   "firmware-abi" = <"EFI64">
  • EFI64の表示が確認できた。64ビットEFIと思われる。

必要な要件は満たしている。

意図的な制限

では、なぜ64ビットカーネルで起動しないのか?

  • しかしながら、MacBookについては記載がない。どうやら「6」と「4」を押しても64ビットカーネルで起動しない理由は、どうもこの辺にありそう。

カーネルは起動時に32bit/64bitが選択できるのだが、Mac mini, Mac Book, Mac Book Airにおいては、Appleは上位機種との差別化の為、EFIが64bitに対応していても64bitカーネルがロードできないよう意図的に制限をかけている。32bitカーネルでも32GBまでのメモリを扱える為、実用的には問題ないのだが、...

http://www39.atwiki.jp/macmini/pages/30.html
  • 何と!諸々の環境としては64ビットカーネルの起動が可能なのに、Appleの方針で意図的に制限されていたとは...。確かにちょっとガッカリする。

制限を回避する

世界は広い。どんな時も、きっとどこかにその道の達人がいる。そして、自分には想像もできない方法で道を開いてくれる。今回もまた、検索すると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/
  • 所有者の変更、フラッグの変更、起動時に boot.efi に替わって boot-k64.efi を利用するように変更。
$ 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」を押しながらMacBookを再起動すればOK。
  • ちなみに、以下の方法で「6」と「4」を押さなくとも64ビットカーネルで起動する。
カーネルモードの設定と確認

上記では毎回「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" = "";
}
  • デフォルト モード(自分のMacBookは32ビットカーネルで起動する)の設定と確認。
$ sudo systemsetup -setkernelbootarchitecture default
$ defaults read /Library/Preferences/SystemConfiguration/com.apple.Boot
{
    Kernel = "mach_kernel";
    "Kernel Flags" = "";
}

64ビットカーネルの使い心地


  • で、その使い心地はどうかというと...

お勧めできない!

    • モニタの色合いが異常。
    • カラー補正もできない。
    • スクロール中に表示が乱れる。
    • プレビュー.appで表示できない。
    • モニタを閉じたらスリープせずフリーズした。
  • 等々、ちょっと使っただけでも最適な状態で使えていないことに気付く。
  • このように数々の異常が発生するので、アップルは64ビットカーネルでの起動を意図的に制限しているのかもしれない。
  • あるいは、64ビットカーネルでの起動を想定していないので、放置されてこのような状態になっているのかもしれない。

32ビットカーネルの実力

それでは、MacBookではOSのカーネルまで含めた真の64ビットOSの真価を体感できないのだろうか?このまま半分の32ビッットカーネルでのんびり処理するしかないのか?そんながっかり感が込み上げてくるが、以下のページの解説を読むと、無理して64ビット化にこだわる必要なんてないことに気付いた。

  • OSXでは、Intelの64ビットCPUで追加されたIA-32eというモードで実行している。
  • IA-32eでは、64bitモードと32bit互換モードを超高速に切り替え可能。
  • カーネルは32bit互換モードでも、アプリケーションやメモリ管理は64bitモードに切り替えて実行している。
  • だから、カーネルの処理以外では64ビットの恩恵*1をちゃんと受けられるらしい。
  • そして、一旦アプリケーションが起動してしまうと、アプリケーション自体の処理の中でカーネルに依存する部分はそれほど多くなさそう。(自分の利用環境では)
  • 唯一気になるのはメモリ管理だが、32ビットカーネルでもメモリ管理は64ビットに切り替えて処理されるそうで、4GB以上のメモリ割り当ても問題なく可能らしい。

ベンチマーク

  • 全般的な傾向として、若干64ビットカーネルの方がスコアが良い傾向にあるが、その差は僅差。体感できる程の差は無さそう。
  • 但し、XBenchのMemory TestのSystem、BonnieのSequential InputのBlockなど特定の項目については、64ビットカーネルの方が顕著に良いスコア。
    • ファイルやメモリにアクセスするカーネルに依存する処理では、差が出ている。

体感差

所感

  • つまり、32ビットカーネルで起動しようが、64ビットカーネルで起動しようが、現状はほとんど性能差がない。(自分の使い方においては)
    • 但し、サーバー用途ではまた違った結果になるかもしれない。
  • アップルが設定する出荷時のカーネルモードで起動しておくのが、たぶん最適な環境となる。
  • カーネルが32ビット・64ビットとは関係なく、カーネル以外のソフトウェアを64ビットで利用すれば、64ビットの恩恵を存分に受けられる。
  • ユニバーサルバイナリを活用した32ビットから64ビットへの移行は実にスムーズ。
  • ユーザーは32ビットか、64ビットか、なんてほとんど気にする必要は無い。
  • PowerPCからIntelの時もそうだったが、もはやCPUの違いはたいした問題ではなくなってしまった。
  • OSがCPUの違いを吸収して、その環境に最適な方法で実行するようになってしまった。

関連する参考ページ

以下のページが関連する知識をより深めてくれました。感謝です!

*1:64ビットのレジスタをふんだんに利用したり、4GB以上の広大な物理メモリ空間を利用したり。