问题标签 [xnu]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
698 浏览

c - 在 XNU 项目中找到 __proc_info 符号

我想弄清楚 VMMAP 进程是如何运作的。

使用 dtrace 运行此可执行文件后,似乎是提取虚拟内存中每个部分的地址空间的方法 proc_regionfilename。

所以,我挖得更深了,在 xnu 中的
libsyscall/wrappers/libproc/libproc.c文件下找到了它的实现

在函数体中,我看到主要调用是 proc_pidinfo :

而 proc_pidinfo 又调用 __proc_info 符号:

但是,在代码中找不到这个符号,我想知道它是如何在预编译、编译、链接或实时过程中创建的。

知道我在哪里可以找到它,或者它是如何创建的(我还没有尝试编译内核)。

谢谢

0 投票
1 回答
508 浏览

macos - dtrace 打印父进程命令

我想要一个脚本,为每个新运行的进程打印它的启动命令,以及它的父进程。

我正在使用以下探针:

在脚本主体中,命令行字符串是从curproc->p_dtrace_argv.

父 pid (ppid) 也是可用的,但到目前为止我还没有弄清楚如何提取父进程名称(最好是可以从父 argv[0] 中获取的全名)。

0 投票
0 回答
300 浏览

macos - 提取进程命令行时出现 Dtrace 无效地址错误

我想要打印新进程的命令行及其匹配的父名称的 dtrace 脚本。即:如果我从 bash 运行 /Users/bla/myexec arg1 arg2 arg3 我会得到类似的东西:

parent is bash process is --> /Users/bla/myexec arg1 arg2 arg3

在这里这里搜索后,我想出了以下解决方案:

但是,在运行脚本时,似乎对于某些探测器,存在未初始化/损坏的变量。

这是以下 bash 命令的输出示例sudo dtrace -C -s ./procargs.d。可以看出,该探针proc:mach_kernel:__mac_execve:exec-success在 中具有未初始化的值curproc->p_dtrace_argv

也许你可以告诉我我的脚本有什么问题?

0 投票
1 回答
602 浏览

macos - GetWorkLoop()->runAction 和 GetCommandGate()->runAction 的区别?

这让我困惑了很长时间。在我的 IOkit 驱动程序中,我将中断事件源、定时器事件源注册到工作循环。我使用 GetWorkLoop()->runAction(pAction) 进行硬件访问。因此,来自中断处理程序和计时器处理程序以及我的 pAction 的所有硬件访问都被序列化了。但是,我从 IOCommandGate 找到了另一个 runAction。我想知道这两个 runAction 之间的区别。我查看了一些 iokit 内核文档。没有得到明确的答案。

在 xnu 源中:

我的意思是当我调用 GetWorkLoop()->runAction(inAction) 时。inAction 在我的线程上下文中运行,而不是在工作循环线程上下文中运行。这个对吗?

代码似乎 GetCommandGate()->runAction 也在我的线程上下文中运行。不是工作循环线程?

0 投票
4 回答
646 浏览

macos - 如何在 Mac OS X 中打印内核调用堆栈

在 Linux 中,我可以echo t > /proc/sysrq-trigger用来转储系统中所有线程的内核调用堆栈。

Mac OS X 中是否有任何用于相同目的的方法?或任何方法来转储一个进程的内核堆栈?

0 投票
1 回答
211 浏览

linux - 系统调用中的 printf 返回格式错误的输出

我正在使用 kext 在 OS X 中记录系统调用,如下所示:

这记录到system.log. 现在的问题是,如果printf负载很高(调用了许多系统调用),则输出system.log通常格式不正确: ID]SYS_readEN] callparam, 123, ed 123, 123例如。字符串被加扰。如果我使用kprintf打印到串行端口的 ,则永远不会出现格式错误的日志。

任何想法是导致这种行为的原因都非常感谢!

0 投票
1 回答
220 浏览

macos - XNU/Darwin 内核中的 setjmp/longjmp

我需要longjmp/setjmp.kextOS X 的文件中。不幸的是,我认为 XNU 中没有对这些功能的任何官方支持。是否有任何根本原因导致这无法正常工作,或者只是现在没有实施?

有什么想法可以让这个工作吗?

如果有帮助,我想尝试让 Lua 在 OS X 内核中运行,但运行时似乎依赖于longjmp/setjmp或 C++ 异常,这两种异常在 XNU 中都不可用。

0 投票
0 回答
446 浏览

macos - 基于目标端口的 IP/数据包接口路由——使用 PF 或编写 NKE 的任何提示?

希望对我应该创建哪种类型的 NKE 有一些提示。我希望在 OS X 上对数据包进行 iproute2 样式的路由,或者我应该说“macOS”。默认情况下,在 macOS 上,“路由”命令似乎仅限于 IP 地址。我希望我的路线基于端口。

为了扩展,我在一个只允许端口 80 和 443 的公司网络中,但是还有一个非常慢但允许所有流量的第二个网络。我想将 80/443 上的所有流量引导到较快的公司网络上,并将其他所有流量引导到较慢的网络上,但有一个例外:试图通过其本地网络 ip 范围与公司网络通信的流量。我知道根据具体情况,我可以将我的应用程序配置为使用某些接口而不是其他接口,如果它在过滤器上匹配,我还可以使用附加到接口的代理将流量“转发”到另一个接口,但我过去在内存/磁盘使用和本地代理方面遇到过问题。

于是我有了一个疯狂的想法,因为我不能通过端口修改 macOS 路由,如果我可以创建自己的虚拟网络接口,它会位于服务订单的顶部并引导流量呢?大概这意味着转发数据包,可能会重新创建它们,所以我不能 100% 确定这是最好的方法。或者,我可以在现有接口上监听我想要重定向的流量,然后将那些重定向的数据包修改到不同的接口。

阅读 NKE 文档,例如Apple 网站上的 NKE 文档,我发现自己与Apple 邮件列表中未答复的海报处于相同的位置,我试图找出如何“设计自定义路由”。给出的示例倾向于关注防火墙或重写数据包(如 NAT),而不是重新分配要使用的接口。即使是其他好书也帮不了我。

如果 PF 可以做到这一点,我想在那里做,因为不编写内核扩展更安全。我也知道IPNetSentryX,但据说它已经报废了,这意味着它可能使用了 IPFW 吗?它说它使用了 NKE,所以我认为这可能吗?

想法?我搜索了 Github,但我只找到了两个用于获取机器网络流量的存储库,一堆使用 TunTap 代码的 VPN 克隆,以及这篇关于构建扩展以侦听路由器广告的自述文件。遗憾的是,没有路由或更改流量接口的示例。想法?

更新 1:检查了 PF 上的 BSD 4.3 文档,它似乎没有我们需要的路由。查看关于备用路由的 IPNetRouterX 帮助页面,看起来我想使用 Apple Network Kext 接口过滤器。

更新 2:WWDC 有 3 个关于 Kext 开发的相关讨论,至少自 2010 年以来在线讨论:

  • WWDC 2010 Session 203适用于 Mac OS X 的 I/O 套件设备驱动程序
  • WWDC 2013 会议 707 Kext 开发中的新功能(最后三分之一涵盖了新的调试标志和 10.9 中的更改)
  • WWDC 2015 Session 706安全和你的应用程序(其中简要提到了 kexts)

考虑到维护第二个 VM 来测试 kexts 需要做多少工作,我不确定我是否想在 kext 中完成这项工作。在 Linux 下使用 iproute2 用户空间工具实际上只是一两行代码,但在没有内核开发的 Mac 中似乎是不可能的。这基本上是我第一次对我在台式计算机上选择 OS X 而不是 Linux 感到恼火。

不过,如果有人在 macOS 开发指针上有任何 kext 网络路由,我会全神贯注。这可能会成为一个有趣的周末项目,看看我是否能做到。

0 投票
1 回答
447 浏览

macos - Coredump 大小与进程虚拟内存空间不同

我正在使用 OS X 10.11,并以下列方式生成转储文件:

并获得具有滚动属性的转储文件:642M Jun 26 15:00 core.5228

在此之前,我使用vmmap命令检查了进程的总内存空间,以尝试估计预期的转储大小。

但是,估计值 (238.7Mb) 远小于实际大小 (642Mb)。

这个差距可以解释吗?

0 投票
1 回答
100 浏览

macos - Race:在 OSX 中卸载 kext 期间的回调和删除回调

建立/删除回调(例如 kauth_unlisten_scope)和回调本身(在 xnu 代码库中,是的,我知道,它已经过时了)之间似乎没有同步。这将跟踪/排出回调和与扩展本身的调用同步的负担。但这也是有问题的,因为有一个窗口指出线程已退出回调并实际上从扩展代码中返回。

是否有任何模式可以正确避免这场比赛?或者,Apple 是否有任何文档表明他们已正确同步?