Kext在macOS 10.14中的线程上下文切换中触发恐慌。

时间:2018-06-13 07:10:52

标签: debugging kernel kernel-extension xnu macos-mojave

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

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

我已多次运行我的代码,并注意到在调用psynch_cvwait sys调用时我的用户空间守护程序可能会触发恐慌,或者在调用{之后触发上下文切换时直接从内核扩展触发{1}}功能。

这是来自内核的追踪:

msleep

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

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]

缺少的框架属于扩展程序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]

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

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

所以我留下的是评论我的驱动程序的部分内容,看看问题是否仍然存在。或许你们中有谁对如何解决这个问题有更多的见解?

感谢

1 个答案:

答案 0 :(得分:1)

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

register read

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