0

最近,我在 10.14 上测试了我的 kext,它似乎运行了一段时间。但是经过一些随机时间(可能需要几分钟),它会产生以下恐慌:

thread_invoke: preemption_level -1, possible cause: unlocking an
unlocked mutex or spinlock"

我已经多次运行了我的代码,并注意到恐慌可能是由我的用户空间守护进程在调用sys 调用时触发的,或者在调用函数psynch_cvwait后触发上下文切换时直接从内核扩展触发。msleep

这是来自内核的跟踪:

frame #4: 0xffffff800afe24a3 kernel`panic(str=<unavailable>) at debug.c:620 [opt]
frame #5: 0xffffff800affef06 kernel`thread_invoke(self=0xffffff801b7a4030, thread=0xffffff801afe4540, reason=0) at sched_prim.c:2261 [opt]
frame #6: 0xffffff800affdaff kernel`thread_block_reason(continuation=<unavailable>, parameter=<unavailable>, reason=<unavailable>) at sched_prim.c:3088 [opt]
frame #7: 0xffffff800b4fcfe1 kernel`_sleep [inlined] thread_block(continuation=<unavailable>) at sched_prim.c:3104 [opt]
frame #8: 0xffffff800b4fcfd6 kernel`_sleep(chan=<unavailable>, pri=0, wmsg=<unavailable>, abstime=1299691844730, continuation=0x0000000000000000, mtx=0x0000000000000000) at kern_synch.c:251 [opt]
frame #9: 0xffffff800b4fd352 kernel`msleep(chan=0x01000004001ddd89, mtx=0x0000000000000000, pri=0, wmsg="", ts=<unavailable>) at kern_synch.c:346 [opt]

接下来是从用户空间守护进程 sys 调用触发的堆栈跟踪:

frame #4: 0xffffff800afe24a3 kernel`panic(str=<unavailable>) at debug.c:620 [opt]
frame #5: 0xffffff800affef06 kernel`thread_invoke(self=0xffffff80176f5a50, thread=0xffffff8019a5de60, reason=0) at sched_prim.c:2261 [opt]
frame #6: 0xffffff800affdaff kernel`thread_block_reason(continuation=<unavailable>, parameter=<unavailable>, reason=<unavailable>) at sched_prim.c:3088 [opt]
frame #7: 0xffffff7f8cbf5080
frame #8: 0xffffff7f8cbf6dcf
frame #9: 0xffffff800b499c3c kernel`psynch_cvwait(p=<unavailable>, uap=<unavailable>, retval=<unavailable>) at pthread_shims.c:397 [opt]

丢失的帧属于扩展com.apple.kec.pthread(1.0)[C69B97C1-505D-3629-9D64-7B7BC6D780A8]@0xffffff7f8cbf3000->0xffffff7f8cbfafff

起初我以为这可能是随机内存损坏引起的,但看起来在我所有的复制之后,除了我刚才提到的 2 之外,没有其他实体引发了恐慌。

如果我查看恐慌消息,它会连接到每个处理器的 %gs 寄存器中可能找到的值,其中保留了抢占级别。但是,在 lldb 中,我无法访问此寄存器,我怀疑它是否映射到我的驱动程序内存。

所以我剩下的就是对我的驱动程序的部分进行评论,看看问题是否仍然存在。也许你们中的任何人对如何解决这个问题有更多的见解?

谢谢

4

1 回答 1

1

我相信以下lldb命令应该与所有其他命令一起打印 gs 寄存器:

register read

我以前只在处理自旋锁时遇到过这种恐慌,因为它们禁用了抢占。如果您的 kext 不使用自旋锁,并且没有通过内联汇编显式禁用抢占,这可能是 macOS 中的一个错误,我会尽快向 Apple 报告。

于 2018-06-13T15:28:10.737 回答