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

Technical Q&A QA1075
Making sense of IOKit error codes


Q:I/O Kit を使っているとき、この膨大な量のエラーコードの意味を知るにはどうしたらよいのでしょうか。

A:I/O Kit は、Mach カーネルが使うエラーコード体系と同じものを使います。I/O Kit エラーの長さは 32 ビットで、形式はリスト 1(mach/error.h より)に示すとおりです。

上位                                  下位
| system(6) | subsystem(12) | code(14) |

リスト 1 エラー番号の形式

上位 6 ビットはシステムの値、次の 12 ビットはサブシステムの値、下位 14 ビットはエラーコードです。

エラーコードに関する情報を探す最初の場所は IOKit/IOReturn.h です。ここには、特定のファミリに限定されない、すべての一般的な I/O Kit エラーのリストがあります。では、具体的な例を見ていきましょう。

IOReturn.h にある情報を使えば、16 進数では 0xE00002C2 となる、-536870206 という I/O Kit エラーは、次のように対応付けられることがわかります。

system
= 0x38
CODE>sys_iokit エラーと同じです。
subSystem
= 0x0
したがって sub_iokit_common エラーであることがわかります。
code
= 0x2C2
つまり、これは kIOReturnBadArgument エラーです。


I/O Kit エラーコードからこれら 3 つの値を取り出す便利なマクロがあります。これらをリスト 2(mach/error.h より)に示します。

#define  err_get_system(err)  (((err)>>26)&0x3f)
#define  err_get_sub(err)     (((err)>>14)&0xfff)
#define  err_get_code(err)    ((err)&0x3fff)

リスト 2 I/O Kit エラー情報を取り出すマクロ


また、I/O Kit からシステムの値が sys_mach_ipc(0x4、mach/error.h で定義)であるエラーコードが返ってくることがあります。これらの中で最も一般的なのは 268435459(16 進数では 0x10000003)であり、これは、Kernel.framework ヘッダ、mach/message.h の中で定義されている MACH_SEND_INVALID_DEST エラーです。なぜ Mach のエラーコードを受け取るかは、I/O Kit がユーザ空間とカーネルのやり取りに Mach メッセージを使うことがわかれば理解できるでしょう。IOServiceCreatePlugInInterfaceForService などの呼び出しに渡される io_service_t 型は、IOTypes.h という IOKit.framework ヘッダでは mach_port_t として定義されています。したがって、この場合の MACH_SEND_INVALID_DEST エラーは、io_service_t が無効であることを示します。つまり、io_service_t が初期化されていないか、すでに解放されていることを意味します。

また、各 I/O Kit ファミリは、別のヘッダファイルでファミリ固有のエラーコードを定義しています。たとえば、USB エラーコードは、Kernel.framework 内の IOKit/usb/USB.h にあり、FireWire エラーコードは、同じ Kernel.framework. 内の IOKit/firewire/IOFireWireFamilyCommon.h にあります。


[2002 年 2 月 6 日]