有没有一种方法可以在Mac上使用lldb或其他方式进入内核代码



在Mac上,有没有一种方法可以查看系统调用指令使用lldb或其他方式调用的代码?

我试图理解当一个";写";调用syscall。我用gcc -g:编译了一个简单的.c程序

#include <unistd.h>
#include <sys/syscall.h>
int main(void) {
syscall(SYS_write, 1, "hello, world!n", 14);
return 0;
}

lldb不会介入syscall指令,即使我使用:s -a false

有办法吗?

否。如果您能够进入内核陷阱,那么内核将停止,调试器也将停止运行。你可以从第二个系统调试内核——如果你在苹果的开发者门户下载网站上寻找内核调试工具包,那里有关于如何进行两台机器内核调试的说明。这些指令很可能针对的是进行内核扩展(kext(开发的人,但它们会让你进入正确的范围。

最好的选择(缺少两台机器(是在虚拟机中运行MacOS,然后通过串行连接内核调试器。您需要使用引导参数(debug=0x44或您选择的位掩码(启动VM内核,并从主机连接lldb。关于如何通过网络做到这一点,有大量的资源。其中最直接和全面的是斯科特·奈特的https://knight.sc/debugging/2018/08/15/macos-kernel-debugging.html

您也可以从代码中了解到:所有的sys调用漏斗到hndl_unix_call64,后者依次检查syscall/machtrap指示符(0x2000000或0x1000000(,然后指向unix_syscall64(对于前者(,然后从表中调度到实际的sys调用。在回溯中,它看起来像:

frame #8: 0xffffff801e4ed8c3 kernel`read_nocancel + 115
frame #9: 0xffffff801e5b62bb kernel`unix_syscall64 + 619
frame #10: 0xffffff801df5c466 kernel`hndl_unix_scall64 + 22

来源:*OS内部,第二卷,第4章(http://NewOSXBook.com)

最新更新