问题标签 [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 回答
720 浏览

operating-system - 从源代码构建达尔文 16.6?

简而言之,我需要一个系统基础,因为它是基于 macOS Darwin 构建的,这似乎是合乎逻辑的选择,因为它需要最少的移植工作。我知道你可以从 Apple 下载 Darwin 8.0.1,完整的源代码树最多可用于 10.0,但是 v8 太旧并且缺乏许多标准的现代功能(即不限制 root 用户的密码系统最多 10 个字符,或支持区分大小写的 HFS+ 版本)。我尝试使用从源代码构建 Darwin 9/10/11/12 darwinbuild,但由于各种服务器端原因,它总是失败。

必须有某种方法来创建相当于普通的 Darwin 16 图像。也许拿一个现有的 macOS 副本并剥离所有封闭源代码的东西?构建 Apple 在Apple Open Source Repository提供的源代码,并将操作系统所需的其余软件包替换为另一个 BSD 发行版的源代码?获取 FreeBSD 的现有副本并将内核替换为XNU? 必须有某种方式。欢迎对我提出的想法提出任何想法或想法。谢谢。

0 投票
1 回答
303 浏览

macos - 从 osx 内核扩展 (kext) 检查本地文件系统 fsid

我有 WA 来检查 kext 上下文中的本地 fsid 是什么,只需读取预定义的本地文件状态即可。

另一种选择是从用户空间计算 fsid 并将此信息传递给驱动程序(使用getmntinfo

但是,我更喜欢直接从内核空间获取这些数据,而不依赖于当前存在的任何文件。是否有任何 KPI 来支持此请求?

0 投票
2 回答
1047 浏览

c++ - 发送具有动态长度的 IOKit 命令

我正在使用 IOKit 框架IOConnectCallMethod从用户空间客户端和IOExternalMethodDispatch驱动程序端与我的驱动程序进行通信。

到目前为止,我能够发送固定长度的命令,现在我希望发送不同大小的字符数组(即完整路径)。

但是,驱动程序和客户端的命令长度似乎是耦合的,这意味着驱动程序中的checkStructureInputSizefromIOExternalMethodDispatch必须等于客户端中的inputStructCntfrom 。IOConnectCallMethod

这是双方的结构内容:

司机 :

客户:

这是我使用不同大小命令的失败尝试:

从驱动程序命令处理程序方面,我正在调用IOUserClient::ExternalMethod,但这需要我从客户端传递的动态数据的确切长度。IOExternalMethodArguments *argumentsIOExternalMethodDispatch *dispatch

除非我将调度函数设置为它应该期望的确切数据长度,否则这不起作用。

知道如何解决这个问题,或者在这种情况下我应该使用不同的 API 吗?

0 投票
1 回答
101 浏览

macos - 是否可以向 Darwin/XNU/OSX/macOS 中的进程发送信号?

我一直在开发针对 POSIX 的系统程序,但我遇到了无法访问sigqueue. Darwin/XNU 是否有另一种向另一个进程发送信号的方法?我见过 kill() 但没有别的。

0 投票
0 回答
195 浏览

macos - 来自连接的用户空间客户端的 Kext 引用

我正在使用 Kext,它为一个或多个使用 iokit 服务与其通信的用户空间客户端提供服务。

我希望每个这样的客户端都会参考 kext,这样只要仍有可用的客户端,就不可能卸载 kext。

根据我可以使用的文档IOServiceOpenIOConnectAddRef,但仍然可以使用卸载驱动程序kextunload

kextstat还表明没有对驱动程序进行引用,这些是文档中提到的其他驱动程序的引用,但我认为上述命令可以解决问题。

我应该怎么做才能增加上图中的#Refs?

编辑:在苹果文档中,可以在 info.plist 文件中声明您的 kext 依赖项。

任何 KEXT 都可以声明它依赖于任何其他 KEXT。开发人员在模块属性列表文件的 OSBundleLibraries 字典中列出了这些依赖项。

但是,我想通过将来自其他实体的引用标记到我的 kext 来做相反的事情,而这些实体不一定是驱动程序 - 在 Windows 中,它们都称为服务,并且可以轻松地在 2 个此类服务之间建立链接,而不管它们是否'是用户空间进程或内核模块。

感恩

0 投票
1 回答
453 浏览

macos - nvram 不记得我的引导参数设置。如何解决?

我正在开发一个内核扩展——一个设备驱动程序——并且严重依赖来自 kprintf() 的诊断消息。

主机上的 $ fwkpfv 将在目标上显示来自 kprintf() 的日志消息,但它需要在 boot-args 中设置“debug=0x8”。

(我不清楚是否包括引号。)

如果我在设置 boot-args 后正常启动:

我永远欠你的债。

0 投票
1 回答
160 浏览

macos - IODeviceMemory 声明在哪个 KPI 库中?

谷歌没有洞察力。我无法通过在内核源代码中搜索来弄清楚。

我正在使用开源 IOProxyVideoFamily 来实现虚拟帧缓冲区。

我刚刚用 OSDynamicCast 替换了 C 风格的转换为 IODeviceMemory,因为我怀疑转换会失败。如果是这样,我会知道如何解决它。

但我找不到包含它的 KPI 库。IODeviceMemory 自 10.0 以来一直在操作系统中,并且是 PCI 卡驱动程序所必需的。

IODeviceMemory 是 IOMemoryDe​​scriptor 的子类。它的声明包括 OSDeclareDefaultStructors。

(安装显卡驱动后,就满足了对IOProxyVideoCard的依赖。)

0 投票
1 回答
283 浏览

macos - xnu 内核中是否有工作队列功能?

我需要在 Mac OSX(内核模式驱动程序)上使用类似工作队列的功能,并且正在寻找一种将工作添加到队列中以便稍后由内核线程处理的方法。从概念上讲,这与 Linux 内核中可用的工作队列功能相同。XNU内核上也有类似的东西吗?

0 投票
1 回答
400 浏览

macos - OS X WindowServer:真实 Mac 上的设备(xxxxx)没有匹配的上下文

我有一台 Macbook Air 13"(2017 型号,基本 1.8Ghz),我想看看我是否可以在上面运行 Mavericks。2017 型号与 2015 相同,但升级了处理器和不同的 Board-ID (Mac-937CB26E2E02BB01) . 它的 Board-ID 直到 Sierra 10.12.4 或其他版本才被列入白名单。我可以追溯到 10.10.3 (增加了对 2015 macbook airs 的支持)并仅使用 platformsupport.plist 补丁即可运行完全支持,但我想要更进一步。请记住,Yosemite 和 Mavericks 在架构方面非常相似(很少更改内核功能)AppleIntelBDWGraphics 是 Broadwell Intel HD 6000 的驱动程序。

它有一个 Broadwell 芯片,当然 10.9.5 内核没有将它列入白名单,因此它会拒绝启动。使用这篇有用的帖子 ( https://pikeralpha.wordpress.com/2013/06/11/xnu-10-8-3-haswell-compatibility/ ),我找到了需要编辑的文件以添加对 Broadwell 的支持。我从这里下载了 OS X xnu 源代码:opensource.apple.com/tarballs/xnu/xnu-2422.115.4.tar.gz

并开始工作。自己加了相关资料,终于编译了内核,小牛开机了。(当然在编辑 PlatformSupport.plist 并将我的 board-id 列入白名单之后)mavericks-on-mba2017

然而,几乎一切都没有奏效。键盘背光有效,Broadcom bcm4360 有效,仅此而已。键盘和触控板是 spi,在简单地从 10.10.3(包含它们的第一个操作系统)复制相关的 kext(applehsspihidriver 等)并 kext 加载它们之后,键盘和触控板就好像它们是 Mavericks 原生的一样工作。但是,AppleIntelBDWGraphics 和相关驱动程序不起作用。(也从 10.10.3 中提取)AppleIntelBDWGraphicsFramebuffer 确实加载了,这给了我 CI (CoreImage) 支持,但不是广受欢迎的半透明菜单栏(与 Quartz Extreme 相关),所以我开始工作了。只是立即调用 kextutil 就给了我出了什么问题:

我可以轻松修复 IOLockWakeup_darwin14,因为快速的谷歌搜索证实了我的怀疑,即 IOLockWakeup 是相同的,并且截断 darwin14 不会造成任何伤害。我对可执行文件进行了十六进制编辑,这将我未解析的符号减少到仅 _gpu_accumulate_time 和 _gpu_describe。在回到源代码并在 Darwin 14.0.0 (Yosemite) 中追踪到 osfmk/kern/energy_perf.c 的相关代码后,我煞费苦心地复制了所有必要的文件来解决这两个符号,然后手动纠正了编译器错误。一旦内核(最终)编译完成,我立即对其进行了测试,并且确实在加载 kext 时解析了符号:

我不会详细介绍我在源代码中如何以及编辑了哪些文件,因为仍然存在一个问题:QE(Quartz Extreme)在 GUI 中仍然不起作用。快速检查 Console.app 揭示了原因:

另一个谷歌搜索没有发现任何有用的信息。所有链接都与简单地使消息静音有关,并且它们与那些显然没有为它们编写 QE/CI 驱动程序的 USB DisplayLink 监视器有关。但是,我正在使用带有已加载 kext 的受支持图形卡,我想看看是否可以对 WindowServer 或类似的东西进行二进制补丁以手动启用对我的设备的支持。谢谢你。

0 投票
0 回答
182 浏览

c++ - macOS kext 的内存分析器/分析器

在我开始发明轮子之前,我决定做一些搜索,看看我想要的功能是否已经在某个地方实现了。通常,我想分析我的 macOS kext 并查找任何内存问题(尤其是内存泄漏)。

更具体地说,我希望找到一个基于代码的分析器(因为外部分析器不支持调试内核模块),它用作 malloc/free 的包装器。

这是一个使用双向链表的实现选项,根据具有一些输入大小的分配请求,实际的 malloc 为 size +overhead其中第二部分旨在包含指向上一个分配和下一个分配的链接,以及元数据本身(获取文件名使用FILE宏和使用LINE宏的代码行,可能还有更多信息),返回地址是overhead实际分配的偏移量,因此用户可以只处理读取的数据。

在 之后free,我们使用输入地址 -offset作为实际输入,free因为这是原始分配的内存,但在释放本身之前,应该从链表中正确删除该项目。

经过分析,我们迭代列表并打印每个元素。

请注意,有一些实现细节,例如通过锁定代码段和从链表中插入/删除项目来支持多线程环境。

或者,也许有一个 GDB/LLDB 插件可以扫描所有动态分配的内存(并打印其大小)......

附言

在 Windows 中,有一个这样的模块driver verifier,它为您的内核模块提供了上述功能,并且您不需要重新编译任何东西(它在运行时标志上被激活)...... macOS 上有没有这样的工具?