问题标签 [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.
ios - 我可以找到创建命名 OSMallocTag 的库吗?
我使用分配工具来测量我的 iOS 应用程序中的堆使用情况。我发现在标签名称为“Memory Tag 70”的区域中分配了大量内存,我想知道谁对此负责,所以我可以追查:
- 我是否适合尝试对这段记忆做任何事情
- 如果是这样,我应该怎么做(即什么代码在该区域分配对象)。
那么,我可以追踪OSMalloc_tagAlloc()
带有特定参数的调用来自哪里吗?我愿意接受我可能只能在模拟器中运行时才能这样做,而不是在设备上。但即使是这样,我该怎么办呢?我可以dtrace
显示标签名称吗?如果可以,我可以通过在模拟器中启动我的应用程序dtrace -c
吗?如何?
macos - 如何分配可能由操作系统回收的内存缓冲区以缓存在 Mac OS X 内核扩展中?
根据我阅读的文档和 xnu 源,我了解 Mac OS X使用统一缓冲区缓存 (UBC)缓存文件I/O。UBC 会根据可用 RAM 尽可能地增长,但是当内存变得更紧时,UBC 页面是最先被牺牲的页面。
在我的驱动程序中,我处理各种磁盘元数据。我希望能够使用 UBC 或类似机制来保留这些数据的 MRU 缓存以加快速度,同时让内核能够在需要时收回该内存。然而,元数据并不代表文件数据,因此不直接属于 UBC 的域。是否有我可以使用的较低级别的机制,或者我可以以某种方式仅使用 UBC 中处理缓冲区本身的部分?
我目前正在寻找 HFS+ 源代码,试图弄清楚它是否以及如何缓存文件系统元数据,尽管没有取得多大成功。
主要的替代方案当然是为缓存保留一个特定的内存区域并进行我自己的 LRU 剔除。我可以选择固定的缓存大小或使用某种启发式方法,但是当 RAM 充足时它总是会使用太少的内存,而当它不充足时它总是会使用太多的内存。
更新:
在搜索了更多之后,我发现IOBufferMemoryDescriptor
可以使用该kIOMemoryPurgeable
选项创建实例。这使您可以调用IOMemoryDescriptor::setPurgeable()
它来标记要丢弃的内存“公平游戏”。我会尝试并用结果更新问题。
process - 什么是“jetsam 优先事项”?
有人可以解释什么是“jetsam 优先事项”吗?
它们是由launchd强制执行的。我怀疑它们是为特定进程限制 CPU 的一种方式,但我不确定。
kernel - 将内核移植到不同的架构?
我想将xnu
内核移植到 ARM 架构,最终目标是能够在 Qemu 中运行完整的内核。虽然我确实意识到这是一项非常艰巨的任务,但我仍然想尝试一下。
据我所知,您打算为内核 ( osfmk/arm/start.s
) 编写一个入口点,在其中进行一般初始化(MMU 和 PlatformExpert),之后可以启动 Kext/IOKit 子系统并加载 CPU 特定的扩展(即陷阱, GPIO,时钟),它们要么预先链接到二进制文件中,要么由引导加载程序加载(因为由于 NAND 扩展尚不可用,内核无法与文件系统交互)。
虽然我对 ARM CPU 的工作原理有一个大致的了解,但我什至不知道从哪里开始使用该xnu
端口,因为我不完全确定如何:
- 进行低级调试(因为内核调试工具在启动早期不可用)。
- 将 ARM 分支与内核源代码树的其余部分集成(即确保其中的东西
osfmk/kern
正常工作)。 - 为独立于平台的内核创建一个健全的环境来启动(
machine_startup()
); - 修复主内核代码中的一些平台特定代码(大多数平台代码仅限于,
osfmk/platform_name
但其中一些必须集成到osfmk/kern
其他代码中)。
是否有任何关于将XNU(或至少Mach)内核移植到不同平台的体面指南,就像有 Linux 指南一样?
macos - OS X 如何生成崩溃报告?
可从网络、邮件列表、Mac OS X Internals等书籍甚至源代码中获得的材料非常有限。
现在我知道 xnu 内核引发了一个 EXC_CRASH,它通知启动以启动“Problem Reporter.app”(之前是 Crash Reporter.app)。这个应用程序是使用一些调试接口来生成崩溃报告,还是内核已经生成了报告并只是通知应用程序打开已经生成的报告?
macos - 为什么 lsyncd 需要 xnu?
我正在完成在 Mac OS X(确切地说是 10.7.3)上编译 lsyncd 的步骤。
尽管 lysncd 源代码中存在一些小的语法错误,但最终还是设法编译了它;我从 Axel Kittenberger(管理 lsyncd 的开发人员)那里了解到编译需要 XNU。
参考:-
配置步骤是这样完成的: -
然后对新创建的 Makefile 进行一些小的更改(将 asciidoc 的路径更改为我的 macports asciidoc 位置)并运行
所以一切顺利,我终于有了生成的lsyncd
二进制文件。
我的问题是:为什么在这个过程中需要 xnu?(很想知道)
macos - vnode_t 在哪里定义?
我正在尝试使用vnode_t
定义为struct vnode *
. 我可以找到很多引用,struct vnode
但我找不到定义的标题。任何人都可以帮忙吗?
macos - 为什么我的内核扩展没有写入 kernel.log
我有一个简单的内核扩展:
我正在通过以下方式编译和加载:
它出现在 kextstat 列表中:
但是,我在 kernel.log(或 system.log)中什么都没有——我应该看到我的 printf() 语句。知道为什么吗?
xcode - XNU 线程状态在 Xcode/Instruments 中进行颜色编码
我正在使用 Apple Instruments 工具对多线程应用程序进行一些分析,这些工具提供了很多我试图理解的信息。我试图找到一个很好的资源来描述工具中颜色编码的线程状态。我一直在研究 XNU Kernel 文档和书籍,但运气不佳。
有很多黄色和紫色对应于“抢占”和“监督”模式(全彩色图表在附图的右上角弹出中描述)。鉴于我在这些状态中花费了很多时间而不是“运行”状态(蓝色),我特别想知道它们指的是什么,以及是否有可能/希望尽量减少在这些状态中花费的时间.
macos - 如何确定进程是否在网络内核扩展中具有 root 权限?
我正在编写一个套接字过滤器 kext,我想忽略以 root 身份建立的任何连接。在 OS X Lion 之前,以下代码可以完美运行:
但现在使用 Lion 和 Mountain Lion,该is_root()
函数始终返回 true。在 Snow Leopard 中,它按我想象的那样工作。
这是我如何在套接字过滤器事件处理程序中测试函数的示例:
但输出总是显示“root”,例如:
建立连接的应用程序是 Twitter(通过 PID 确认)。Twitter 以常规用户权限运行,而不是 root。
是否有更好/正确的方法来确定套接字连接背后的进程是否具有 root 权限?