高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先

Technical Q&A QA1087
Issues with boot time KEXT loading


Q: 私のデバイスは、ホットプラグすると KEXT がロードされますが、ブート時にはロードされません。なぜでしょう?

A: この現象が起こる理由は 2 つあります。

まず、自分の KEXT ではないブート時 KEXT、つまり OSBundleRequired が設定されている KEXT が、デバイスと一致している可能性があります。デバイスに一致したドライバは、デバイスが削除されるまでロードされたままです。

よくある例としては、ベンダ固有のドライバをもつ複合 USB デバイスです。ブート時には、アップルの複合クラスドライバが一致します(複合クラスドライバは、マスストレージクラスデバイスからブートするために必要なので、ブート時 KEXT でなければなりません)。そのため、ベンダ固有のドライバはロードされません。しかし、デバイスがホットプラグされれば、適合するすべてのドライバがデバイスのドライバ候補となり、ベンダ固有のドライバは複合クラスドライバよりも適切なドライバとして選択されます。

この問題を解決するには、Info.plist にある OSBundleRequired プロパティを、競合するブートドライバと同じ値に設定することです。

もう 1 つ原因として考えられるのは、Mac OS X 10.1 から、ブート時 KEXT のロード時に行われるバージョンと依存関係のチェックが厳しくなったことです。Info.plistCFBundleVersion と 「Build Settings」タブで指定した MODULE_VERSION のバージョン番号が同じであることを確かめてください。バージョン番号が違う場合は、system.log に、リスト 1 と同様のエラーが記録されます。

Oct 23 15:40:29 localhost mach_kernel: verify_kmod(): Kmod
"com.apple.mydriver" and its property list claim different versions
(1.0.0b1 & 1.0.0b2).
Oct 23 15:40:29 localhost mach_kernel: load_kernel_extension(): load_kmod()
failed for kmod "com.apple.mydriver".
Oct 23 15:40:29 localhost mach_kernel: IOCatalogue: com.apple.mydriver
cannot be loaded.

リスト 1 verify_kmod() のエラー



Project Builder で MODULE_VERSION を変更した後でも、プロジェクトをクリーンアップし、場合によっては、再度コンパイルを行う前に Finder で build フォルダを削除する必要があります。なぜなら、Project Builder は、情報の一部をキャッシュしているからです。

ブート時における KEXT のロードの詳細については、 Loading Kernel Extensions at Boot Time を参照してください。


[2004 年 1 月 15 日]