Macos RetrieveINQUIRYData()中偶尔出现OSX内核死机
我有一个SCSI驱动程序,它在启动过程中调用Macos RetrieveINQUIRYData()中偶尔出现OSX内核死机,macos,driver,kernel-extension,scsi,Macos,Driver,Kernel Extension,Scsi,我有一个SCSI驱动程序,它在启动过程中调用IOSCSIPrimaryCommandsDevice::RetrieveINQUIRYData()。有时,在测试过程中拔出、弹出、重新插入和滥用设备后,会出现内核死机 此功能的主要功能是: bool RetrieveINQUIRYData ( UInt8 EVPD, UInt8 inquiryPage, UInt8 * inquiryBuffer, UInt16 * dataSize); 调用这个的例程是这样开始的。
IOSCSIPrimaryCommandsDevice::RetrieveINQUIRYData()
。有时,在测试过程中拔出、弹出、重新插入和滥用设备后,会出现内核死机
此功能的主要功能是:
bool RetrieveINQUIRYData (
UInt8 EVPD,
UInt8 inquiryPage,
UInt8 * inquiryBuffer,
UInt16 * dataSize);
调用这个的例程是这样开始的。它是根据来自的PublishUnitSerialNumber建模的
这在大多数情况下都有效,只是偶尔会出现恐慌。GDB回溯没有任何帮助,因为该函数中没有符号,所以我只知道它是在另一个函数调用之后。我也找不到这个函数的源代码-我认为它是封闭源代码IOKit代码的一部分
#0 Debugger (message=0x8001003b <Address 0x8001003b out of bounds>) at /SourceCache/xnu/xnu-1504.15.3/osfmk/i386/AT386/model_dep.c:867
#1 0xffffff8000204d15 in panic (str=0xffffff800057ecb8 "Kernel trap at 0x%016llx, type %d=%s, registers:\nCR0: 0x%016llx, CR2: 0x%016llx, CR3: 0x%016llx, CR4: 0x%016llx\nRAX: 0x%016llx, RBX: 0x%016llx, RCX: 0x%016llx, RDX: 0x%016llx\nRSP: 0x%016llx, RBP: 0x%0"...) at /SourceCache/xnu/xnu-1504.15.3/osfmk/kern/debug.c:303
#2 0xffffff80002d1208 in panic_trap [inlined] () at :1100
#3 0xffffff80002d1208 in kernel_trap (state=<value temporarily unavailable, due to optimizations>) at /SourceCache/xnu/xnu-1504.15.3/osfmk/i386/trap.c:1001
#4 0xffffff80002e3f4a in trap_from_kernel () at pmap.h:215
#5 0xffffff7f808040b6 in ?? ()
#6 0xffffff7f80804b8b in ?? ()
#7 0xffffff7f80f1324c in com_company_driver_myDriver::PublishUnitSerialNumber (this=0xffffff80130e0600, object=0xffffff8015375000) at /Volumes/user/src/driver/MyDriver.cpp:106
#8 0xffffff7f80f13553 in com_company_driver_myDriver::start (this=0xffffff80130e0600, provider=0xffffff8015375000) at /Volumes/user/src/driver/MyDriver.cpp:53
#9 0xffffff800052d5a6 in IOService::startCandidate (this=0x2710, service=0xe) at /SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2879
#10 0xffffff800052dcb1 in IOService::probeCandidates (this=0xffffff8015375000, matches=<value temporarily unavailable, due to optimizations>) at /SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2798
...
...
#0调试器(消息=0x8001003b)位于/SourceCache/xnu/xnu-1504.15.3/osfmk/i386/AT386/model_dep.c:867
#1 0xFFFF8000204D15处于死机状态(str=0xffffff800057ecb8“0x%016llx处的内核陷阱,类型%d=%s,寄存器:\nCR0:0x%016llx,CR2:0x%016llx,CR3:0x%016llx,CR4:0x%016llx\nRAX:0x%016llx,RBX:0x%016llx,RCX:0x%016llx,RDX:0x%016llx\nRSP:0x%016llx,RBP:0x%0“…)在/SourceCache/nu/nu-1504.15/fmosc
#位于1100处的2 0xFFFF80002D1208处于紧急_陷阱[内联]()
#3 0xFFFF80002D1208位于/SourceCache/xnu/xnu-1504.15.3/osfmk/i386/trap.c:1001的内核_陷阱(状态=)中
#在pmap.h:215处的_内核()中的陷阱_中有4 0xffffff80002e3f4a
#5 0xFFFF7F808040B6英寸??()
#6 0xFFFF7F80804B8B英寸??()
#7 0xFFFF7F80F1324C位于/Volumes/user/src/driver/myDriver::PublishUnitSerialNumber(this=0xFFFF80130E0600,object=0xffffff8015375000)处的/Volumes/user/src/driver/myDriver.cpp:106
#在com_company_driver_myDriver::start(this=0xffffff80130e0600,provider=0xffffff8015375000)at/Volumes/user/src/driver/myDriver.cpp:53
#9/SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2879处的IOService::startCandidate(this=0x2710,service=0xe)中的0xffffff800052d5a6
#在/SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2798处,IOService::probeCandidates(this=0xffffffff8015375000,matches=)中的10 0xffffff800052dcb1
...
...
在调用
RetrieveINQUIRYData()
之前,我是否应该检查或执行一些在上述代码中没有执行的操作?从我看到的情况来看,所有指针都被检查为NULL,长度被设置为常量,唯一的其他参数是EVPD的文本。我不熟悉SCSI堆栈,但这里有一些想法:
从/System/Library/Extensions/
添加kext
相关的kext,您至少应该获得函数/方法名(以及签名,如果是C++)。当然,您不会得到行号,但会得到函数反汇编边界等#0调试器(消息=0x8001003b)位于/SourceCache/xnu/xnu-1504.15.3/osfmk/i386/AT386/model_dep.c:867
在10.6.8源代码中,我找不到该消息来自何处,因此我不太确定预期的界限以及该需求来自何处。它看起来可能是一个物理地址-您是否可以插入一些kprintf
debug输出来转储缓冲区的getPhysicalSegment(0,NULL,0)
结果,看看它是否与触发KP的地址匹配?如果不是这样,请查看是否可以找出导致崩溃的指令以及错误地址的来源
祝你好运
#0 Debugger (message=0x8001003b <Address 0x8001003b out of bounds>) at /SourceCache/xnu/xnu-1504.15.3/osfmk/i386/AT386/model_dep.c:867
#1 0xffffff8000204d15 in panic (str=0xffffff800057ecb8 "Kernel trap at 0x%016llx, type %d=%s, registers:\nCR0: 0x%016llx, CR2: 0x%016llx, CR3: 0x%016llx, CR4: 0x%016llx\nRAX: 0x%016llx, RBX: 0x%016llx, RCX: 0x%016llx, RDX: 0x%016llx\nRSP: 0x%016llx, RBP: 0x%0"...) at /SourceCache/xnu/xnu-1504.15.3/osfmk/kern/debug.c:303
#2 0xffffff80002d1208 in panic_trap [inlined] () at :1100
#3 0xffffff80002d1208 in kernel_trap (state=<value temporarily unavailable, due to optimizations>) at /SourceCache/xnu/xnu-1504.15.3/osfmk/i386/trap.c:1001
#4 0xffffff80002e3f4a in trap_from_kernel () at pmap.h:215
#5 0xffffff7f808040b6 in ?? ()
#6 0xffffff7f80804b8b in ?? ()
#7 0xffffff7f80f1324c in com_company_driver_myDriver::PublishUnitSerialNumber (this=0xffffff80130e0600, object=0xffffff8015375000) at /Volumes/user/src/driver/MyDriver.cpp:106
#8 0xffffff7f80f13553 in com_company_driver_myDriver::start (this=0xffffff80130e0600, provider=0xffffff8015375000) at /Volumes/user/src/driver/MyDriver.cpp:53
#9 0xffffff800052d5a6 in IOService::startCandidate (this=0x2710, service=0xe) at /SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2879
#10 0xffffff800052dcb1 in IOService::probeCandidates (this=0xffffff8015375000, matches=<value temporarily unavailable, due to optimizations>) at /SourceCache/xnu/xnu-1504.15.3/iokit/Kernel/IOService.cpp:2798
...
...