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 日] |