■ Snow Leopardを64bitカーネルで動作させる
Snow Leopardの機能強化の目玉の一つとしてはカーネルの64bit化が挙げられる。概要は、「やっぱりスゴい! Snow Leopardの「64bit対応」で纏められている。
しかしながら売りであるカーネルの64bit化だが、下記記事の通り、従来のデバイスやアプリケーションの互換性を重視して、現状では多くの機種においてデフォルトで32bitカーネルがロードされる。
64bitカーネルが動作する為の必要条件は、
- CPUが64bitに対応している
- EFIが64bitに対応している(参考情報)
の2点である。
- Mac mini(Early 2009)のハードウエア情報
bash-3.2# system_profiler SPHardwareDataType -detailLevel mini
Hardware:
Hardware Overview:
Model Name: Mac mini
Model Identifier: Macmini3,1
Processor Name: Intel Core 2 Duo
Processor Speed: 2 GHz
Number Of Processors: 1
Total Number Of Cores: 2
L2 Cache: 3 MB
Memory: 4 GB
Bus Speed: 1.07 GHz
Boot ROM Version: MM31.0081.B06
SMC Version (system): 1.35f0
bash-3.2# uname -a
Darwin mac-mini.local 9.8.0 Darwin Kernel Version 9.8.0: Wed Jul 15 16:55:01 PDT 2009; root:xnu-1228.15.4~1/RELEASE_I386 i386
bash-3.2# ioreg -l -p IODeviceTree | grep firmware-abi
| | "firmware-abi" = <"EFI64">
カーネルは起動時に32bit/64bitが選択できるのだが、Mac mini, Mac Book, Mac Book Airにおいては、Appleは上位機種との差別化の為、EFIが64bitに対応していても64bitカーネルがロードできないよう意図的に制限をかけている。32bitカーネルでも32GBまでのメモリを扱える為、実用的には問題ないのだが、これはユーザをがっかりさせる結果を招いた。
64bitカーネルのロードを制限する条件として、SMBIOSの機種情報を疑ってみたが、SMBIOSをMac miniと同等のものに書き換えても64bitカーネルがロードできることが確認でき、SMBIOSの内容は制限の条件ではなかった。
- ZOTAC GF9300-D-E(CPU L3110/MEM 8GB)でSMBIOSをMac miniの情報に設定し、PC EFI対応のブートローダを組み込んで、Snow Leopardを64bitで起動させたが64bitカーネルが有効
bash-3.2# uname -a
Darwin Mac-Pro.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:46:25 PDT 2009; root:xnu-1456.1.25~1/RELEASE_X86_64 x86_64
bash-3.2# system_profiler SPHardwareDataType -detailLevel mini
Hardware:
Hardware Overview:
Model Name: Mac mini
Model Identifier: Macmini3,1
Processor Speed: 3 GHz
Number Of Processors: 1
Total Number Of Cores: 2
L2 Cache: 6 MB
Memory: 8 GB
Bus Speed: 1.33 GHz
Boot ROM Version: MM31.00C1.B00
SMC Version (system): 1.30f3
ところが、海外のサイトをみていた所、Mac Bookで64bitカーネルをロードすることに成功した事例がみつかり、64bitカーネルのロードを制限している条件が判明した。
詳細はこちらに記載されているが、EFI boot loader(boot.efi)でカーネルロード時に機種を判別して制限しており、下記の通り該当アドレスの値をバイナリエディタで書き換えれば、64bitカーネルがロードできるようになる(boot.efiは誤って削除されないようにuchgフラグが立っているのでchflagsコマンドで解除する必要あり)。
| Model (with 64-bit EFI) | Byte Position in boot.efi | Old Value | New Value |
| Mac mini |
|
0x00 |
|
| MacBook | 0x266E8 | 0x00 | 0x04 |
| MacBook Air |
|
0x00 |
|
| iMac |
|
0x00 |
|
注.
引用元の情報はMac Bookでの確認であり、macbook4,1, macbook5,1でしか動作しなかった。実機で確認した所、macmini3,1では0x266DBの値を0x00から0x080に修正が必要。
2009/09/09修正
上記の修正は、もちろんAppleの保障外であるが、この修正により64bitEFIを搭載する全てのIntel Macで
Snow Leopardが64bitカーネルで起動
するようになる。
ただし、グラフィックスアダプタとしてIntelチップセットのGMA950を採用している前モデルのMac miniなどは、GMA950用のKEXTが32bitのままの為、QE/CI/OpenGLのアクセラレーションは働かず、ソフトウエアによるエミュレーション動作になる。
前モデルMac mini (Mid 2007)は、CPUは64bit対応しているが、EFIが32bitのままの為、グラフィックスアダプタのソフトウエアエミュレーション動作以前に、64bitカーネルはロードできない。
bash-3.2# file/System/Library/Extensions/AppleIntelGMA950.kext/Contents/MacOS/AppleIntelGMA950
/System/Library/Extensions/AppleIntelGMA950.kext/Contents/MacOS/AppleIntelGMA950: Mach-O object i386
なお、boot.efiを直接修正した場合は、OSのアップデートパッチで上書きされ、ファイルの内容が元に戻る可能性がある。その為、実際は直接boot.efiを修正するのではなく、修正したものをboot64.efiなどと別の名前で保存し、元のboot.efiの代わりにboot64.efiを使うようにblessし直すと良い。
bash-3.2# shasum boot64.efi
0f615922c4dde555e38f203caa28ce56f76212d6 boot64.efi
bash-3.2# hexdump boot.efi > boot_efi.txt
bash-3.2# hexdump boot64.efi > boot64_efi.txt
bash-3.2# diff boot_efi.txt boot64_efi.txt
9235c9235
< 00266d0 30 47 01 00 00 00 00 00 00 00 00 00 00 00 00 00
---
> 00266d0 30 47 01 00 00 00 00 00 00 00 00 80 00 00 00 00
・boot.efiの置き換え手順
- Step 1. ダウンロードしたboot64.efiを/System/Library/CoreServicesに置く
bash-3.2# cp boot64.efi /System/Library/CoreServices
- Step 2. boot64.efiのパーミッションを変更
bash-3.2# chown 0:0 boot64.efi
bach-3.2# chflags uchg boot64.efi
- Step 3. boot64.efiをオリジナルのboot.efiの代わりに使うようにblessする
bash-3.2# bless --info
finderinfo[0]: 133 => Blessed System Folder is /System/Library/CoreServices
finderinfo[1]: 203585 => Blessed System File is /System/Library/CoreServices/boot.efi
finderinfo[2]: 0 => Open-folder linked list empty
finderinfo[3]: 0 => No OS 9 + X blessed 9 folder
finderinfo[4]: 0 => Unused field unset
finderinfo[5]: 133 => OS X blessed folder is /System/Library/CoreServices
64-bit VSDB volume id: 0xA4E143A7BD6DA256
bash-3.2# bless --folder /System/Library/CoreServices --file /System/Library/CoreServices/boot64.efi
bash-3.2# bless --info
finderinfo[0]: 133 => Blessed System Folder is /System/Library/CoreServices
finderinfo[1]: 218968 => Blessed System File is /System/Library/CoreServices/boot64.efi
finderinfo[2]: 0 => Open-folder linked list empty
finderinfo[3]: 0 => No OS 9 + X blessed 9 folder
finderinfo[4]: 0 => Unused field unset
finderinfo[5]: 133 => OS X blessed folder is /System/Library/CoreServices
64-bit VSDB volume id: 0xA4E143A7BD6DA256
- Step 4. 64bitモードで起動するように変更し、再起動
bash-3.2# nvram boot-args="arch=x86_64"
bash-3.2# nvram boot-args
boot-args arch=x86_64
bash-3.2# reboot
- Mac miniで64bitカーネルのロードに成功
- 64bit起動時のメッセージ(Kernel is LP64)
bash-3.2# dmesg
npvhash=4095
Darwin Kernel Version 10.0.0: Fri Jul 31 22:46:25 PDT 2009; root:xnu-1456.1.25~1/RELEASE_X86_64
vm_page_bootstrap: 899025 free pages and 84015 wired pages
kext submap [0xffffff7f80600000 - 0xffffff8000000000], kernel text [0xffffff8000200000 - 0xffffff8000600000]
standard timeslicing quantum is 10000 us
mig_table_max_displ = 73
AppleACPICPU: ProcessorId=0 LocalApicId=0 Enabled
AppleACPICPU: ProcessorId=1 LocalApicId=1 Enabled
calling mpo_policy_init for Quarantine
Security policy loaded: Quarantine policy (Quarantine)
calling mpo_policy_init for Sandbox
Security policy loaded: Seatbelt sandbox policy (Sandbox)
calling mpo_policy_init for TMSafetyNet
Security policy loaded: Safety net for Time Machine (TMSafetyNet)
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
MAC Framework successfully initialized
using 16384 buffer headers and 4096 cluster IO buffer headers
IOAPIC: Version 0x11 Vectors 64:87
ACPI: System State [S0 S3 S4 S5] (S3)
mbinit: done (64 MB memory set for mbuf pool)
rooting via boot-uuid from /chosen: BDF77677-73B7-357E-B72D-7568A902D286
Waiting on <dict ID="0"><key>IOProviderClass</key><string ID="1">IOResources</string><key>IOResourceMatch</key><string ID="2">boot-uuid-media</string></dict>
com.apple.AppleFSCompressionTypeZlib load succeeded
AppleIntelCPUPowerManagementClient: ready
Got boot device = IOService:/AppleACPIPlatformExpert/PCI0@0/AppleACPIPCI/SATA@B/AppleMCP79AHCI/PRT0@0/IOAHCIDevice@0/AppleAHCIDiskDriver/IOAHCIBlockStorageDevice/IOBlockStorageDriver/SAMSUNG MMDOE56G5MXP-0VB Media/IOGUIDPartitionScheme/Untitled@2
BSD root: disk0s2, major 14, minor 2
Kernel is LP64
FireWire (OHCI) Lucent ID 5901 built-in now active, GUID 002500fffed159ce; max speed s800.
systemShutdown false
BootCache: hit rate below threshold (892 hits on 1793 lookups)
AppleIntelCPUPowerManagement: initialization complete
Waiting for DSMOS...
NTFS driver 3.0 [Flags: R/W].
NTFS volume name Windows XP, version 3.1.
NVDANV50HAL loaded and registered.
Previous Shutdown Cause: 0
BTCOEXIST on
wl0: Broadcom BCM4328 802.11 Wireless Controller
5.10.91.19
DSMOS has arrived
NVEthernet: Ethernet address 00:25:00:d1:59:ce
AirPort_Brcm43xx: Ethernet address 00:24:36:f0:52:3f
IO80211Controller::dataLinkLayerAttachComplete(): adding AppleEFINVRAM notification
IO80211Interface::efiNVRAMPublished():
NVEthernet::setLinkStatus - Valid but not Active
NVEthernet::mediaChanged - Link is down
NVEthernet::setLinkStatus - Valid but not Active
AirPort: Link Down on en1. Reason 1 (Unspecified).
Auth result for: 00:0d:02:76:2a:fe MAC AUTH succeeded
AirPort: Link Up on en1
bash-3.2# uname -a
Darwin Mac-mini.local 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:46:25 PDT 2009; root:xnu-1456.1.25~1/RELEASE_X86_64 x86_64
万一、起動しなくなったり、不安定な状態になってしまった場合は、メディアブート後、元のboot.efiでblessし直せば環境の修復が可能である。
最後に、Mac mini Early 2006, Late 2006は、CPUが32bitのCore Solo/Duoの為、そもそも64bitカーネル自体実行できない。
- おまけ. 32bitモードに戻す方法は以下の通りで、起動時の引数指定を無くせばよい。
bash-3.2# nvram -d boot-args
bash-3.2# reboot
■追記1. (2009/09/11)
2009/09/11に10.6.1のアップデートが配布されたが、boot.efiは更新対象とはなっていなかった。その為、バイナリエディタで直接上書更新していても問題ない。なお、boot.efiはカーネルをロードする為のブートローダという役割から、頻繁に更新される可能性は低く、アップルが64bitカーネルの使用を再度無効にする意図がない限りは、修正が入る可能性は低いと思われる。
また、EFIファームウエアアップデートを実行し、ファームウエアのバージョンを1.2に上げた所、10.6においてカーネルが32bit/64bitに関わらずメモリを8GB(4GBx2)搭載しても、安定動作するようになった。
■追記2. (2009/10/09)
10.6.2のベータアップデートプログラムには、インテルチップセットの内蔵GPU(GMA950、GMAX3100)用64bitドライバが含まれており、インテルGPU搭載機でもEFIが64bitなら64bitカーネルでCI/QE/OpenGLのアクセラレーションが働くようになる。
Mac mini(Eary 2009)での64bitカーネル解禁に繋がるとは思えないが、CPU、EFI共に64bitに対応しているが、グラフィックスアダプタのドライバが32bitしか用意されていなかったIntel GPU搭載のMac Book(Late 2007, Early 2008、Late 2008)、Mac Book Air (Early 2008)などには朗報であろう。
ただし、前モデルのmini (Mid 2007)はEFIが32bitなので、GMA 950用の64bitドライバが提供されても残念ながら使用できない。
■追記3. (2009/10/29)
Late 2009 iMacのプレインストールSnow Leopardの情報を確認したが、OSは10.6.1であるものの、カーネルは10.1.2とアップデートがされていた(Late 2009 Mac miniのカーネルは10.0.0のまま)。
更にLate 2009 iMacのkext情報を確認してみると、10.6.2のベータアップデートプログラムで確認できた内容を取り込んでおり、10.6.1.5とも呼べる内容になっていた。
$ uname -a
Darwin localhost 10.1.2 Darwin Kernel Version 10.1.2: Wed Sep 9
$ file /System/Libray/Extensions/AppleIntelGMA950.kext/Contents/MacOS/AppleIntelGMA950
/System/Library/Extensions/AppleIntelGMA950.kext/Contents/MacOS/AppleIntelGMA950: Mach-O universal binary with 2 architectures
/System/Library/Extensions/AppleIntelGMA950.kext/Contents/MacOS/AppleIntelGMA950 (for architecture x86_64): Mach-O 64-bit kext bundle x86_64
/System/Library/Extensions/AppleIntelGMA950.kext/Contents/MacOS/AppleIntelGMA950 (for architecture i386): Mach-O object i386
$ file /System/Library/Extensions/AppleIntelGMAX3100.kext/Contents/MacOS/AppleIntelGMAX3100
/System/Library/Extensions/AppleIntelGMAX3100.kext/Contents/MacOS/AppleIntelGMAX3100: Mach-O universal binary with 2 architectures
/System/Library/Extensions/AppleIntelGMAX3100.kext/Contents/MacOS/AppleIntelGMAX3100 (for architecture x86_64): Mach-O 64-bit kext bundle x86_64
/System/Library/Extensions/AppleIntelGMAX3100.kext/Contents/MacOS/AppleIntelGMAX3100 (for architecture i386): Mach-O object i386
$ ls /System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/
AirPortAtheros.kext/ AppleAirPortBrcm4311.kext/ IO80211NetBooter.kext/
AirPortAtheros21.kext/ AppleAirPortBrcm43224.kext/
$ file /System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortAtheros.kext/Contents/MacOS/AirPortAtheros
/System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortAtheros.kext/Contents/MacOS/AirPortAtheros: Mach-O object i386
$ file /System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortAtheros21.kext/Contents/MacOS/AirPortAtheros21
/System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortAtheros21.kext/Contents/MacOS/AirPortAtheros21: Mach-O universal binary with 2 architectures
/System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortAtheros21.kext/Contents/MacOS/AirPortAtheros21 (for architecture x86_64): Mach-O 64-bit kext bundle x86_64
/System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortAtheros21.kext/Contents/MacOS/AirPortAtheros21 (for architecture i386): Mach-O object i386
最後に一点気になることだが、boot.efiのハッシュ値が従来と異なっており、10.6.2では内容が更新されることが予想される。本項で記載した64bitカーネルロード手法は、10.6.2以降では対応できない可能性が懸念され、正式リリース後に再度確認する必要がある。
■追記4. (2009/11/10)
2009/11/09の深夜にMac OS X 10.6.2 Updateがリリースされた。
一般的には、不具合の修正やアプリケーション互換性の改善を確認するのが重要であるが、このwikiでは以下を確認した(2以降はMac miniには特に影響が無い内容の為、興味の無い人は読み飛ばして良い)。なお、10.6.1までに確認されていた、ゲストアカウントでログイン後に再ログインすると該当アカウントのホームディレクトリがクリアされる深刻なバグは本アップデートで修正された為、極力アップデートすることを推奨する。
1. boot.efiの64bitカーネルロードチェック
MacOSXUpd10.6.2.pkgの中身を覗いたが、boot.efiの更新は無く、既存のローダーには影響を与えない。また、裏を返せば、10.6.2でもアップルはMac miniにおいて64bitカーネルのサポートをしないということである。
MacOSXUpd10.6.2.pkgの中身を覗いたが、boot.efiの更新は無く、既存のローダーには影響を与えない。また、裏を返せば、10.6.2でもアップルはMac miniにおいて64bitカーネルのサポートをしないということである。
bash-3.2# shasum /System/Library/CoreServices/boot.efi
2fb9fc10e5b4bb06f62c38b01bd9836a433897f8 /System/Library/CoreServices/boot.efi
なお、アップデートデータをダウンロードし、アップデートを実行すると下記の通りbless指定がクリアされる(ソフトウエア・アップデートから実行した場合はクリアされない)。
bash-3.2# bless --info
finderinfo[0]: 133 => Blessed System Folder is /System/Library/CoreServices
finderinfo[1]: 203585 => Blessed System File is /System/Library/CoreServices/boot.efi
finderinfo[2]: 0 => Open-folder linked list empty
finderinfo[3]: 0 => No OS 9 + X blessed 9 folder
finderinfo[4]: 0 => Unused field unset
finderinfo[5]: 133 => OS X blessed folder is /System/Library/CoreServices
64-bit VSDB volume id: 0xA4E143A7BD6DA256
その為、boot64.efiを読み込むよう変更していた場合は、再指定が必要。
bash-3.2# bless --folder /System/Library/CoreServices --file /System/Library/CoreServices/boot64.efi
bash-3.2# bless --info
finderinfo[0]: 133 => Blessed System Folder is /System/Library/CoreServices
finderinfo[1]: 218968 => Blessed System File is /System/Library/CoreServices/boot64.efi
finderinfo[2]: 0 => Open-folder linked list empty
finderinfo[3]: 0 => No OS 9 + X blessed 9 folder
finderinfo[4]: 0 => Unused field unset
finderinfo[5]: 133 => OS X blessed folder is /System/Library/CoreServices
64-bit VSDB volume id: 0xA4E143A7BD6DA256
2. Radeon HD43x0-46x0の追加サポート
ATI4500Controller.kext、ATI4600Controlller.kextの追加を確認。また、Radeon HD4シリーズにおいて、OpenCLの互換性及びパフォーマンスが向上している。
ATI4500Controller.kext、ATI4600Controlller.kextの追加を確認。また、Radeon HD4シリーズにおいて、OpenCLの互換性及びパフォーマンスが向上している。
GeForce 9400MではOpenCLのパフォーマンスについて違いはみられなかった。
3. Intel Atomの非サポート
かねてから噂があった通り、Intel Atomが動作しないように対策が取られた(症状としては何も出力されずに再起動)。Atomで動作をさせたい場合は、10.6.2のカーネルソース公開後、ブロックしている部分を修正し、ソースから自力でビルドする必要がある。
かねてから噂があった通り、Intel Atomが動作しないように対策が取られた(症状としては何も出力されずに再起動)。Atomで動作をさせたい場合は、10.6.2のカーネルソース公開後、ブロックしている部分を修正し、ソースから自力でビルドする必要がある。
また、10.6.2ではEISTが無い場合は、AppleIntelCPUPowerManagement.kextでKernel Panicが発生する (デスクトップ用のAtomはEIST機能が無い為、その対策も兼ねていると推測する)。エラー内容からはCore i5/i7用の実装の結果とも思われるが、Mac miniへの影響はない。
4. Core i5/i7のサポート
Late 2009 iMacでCore i5/i7が採用され、10.6.2で正式にサポートされた(10.6.2以前はカーネル起動時にリブートしてしまい対応していない)。
Late 2009 iMacでCore i5/i7が採用され、10.6.2で正式にサポートされた(10.6.2以前はカーネル起動時にリブートしてしまい対応していない)。
5. その他
・Atherosチッップの64bitサポート(AirPortAtheros21.kextの追加)
・Intel内蔵GPUの64bitサポート(AppleIntelGMA950.kext、AppleIntelGMAX3100.kextの64bitバイナリの追加)
・Atherosチッップの64bitサポート(AirPortAtheros21.kextの追加)
・Intel内蔵GPUの64bitサポート(AppleIntelGMA950.kext、AppleIntelGMAX3100.kextの64bitバイナリの追加)
■追記5. (2009/11/14)
Snow Leopard OSX Serverのカーネルローダboot.efiを確認したが、Snow Loepardと全く同一のものであることが確認できた。
bash-3.2# uname -a
Darwin myserver.private 10.0.0 Darwin Kernel Version 10.0.0: Fri Jul 31 22:47:34 PDT 2009; root:xnu-1456.1.25~1/RELEASE_I386 i386
bash-3.2# shasum /System/Library/CoreServices/boot.efi
2fb9fc10e5b4bb06f62c38b01bd9836a433897f8 /System/Library/CoreServices/boot.efi
サーバ版は、サーバとして提供するサービスをクライアント版に追加し、各種管理コンソールの機能を追加したものなので、カーネルをはじめとした基盤システムはクライアント版と共通である。
このwikiの更新情報RSS
