xnu相关内容
我尝试在运行 11.4 Beta (20F5046g) Big Sur 的 M1 机器上加载 kext 模块,但在加载 kext 模块时遇到一些绑定错误消息. 访问从 Apple kext 模块导出的内核符号 首先,为了访问从苹果的 kext 模块 com.apple.kpi.unsupported 导出的内核函数,我使用了下面的 extern 声明. extern int cpu_
..
我已经为我的驱动程序创建了卸载程序,该卸载程序从/Library/LaunchDaemons 中删除了与其匹配的plist文件,因此在下一个引导周期中不会再次加载该文件.但是,它似乎对引导计算机后仍在正常加载的驱动程序没有任何影响. 在对此事进行了一些研究之后,我发现 kextcache 是此行为的原因,为了清除/使之失效,我需要 touch 安装目标卷所在的文件夹.但是,它没有任何作用.
..
我正在查看系统调用.master 文件,但完全没有记录.是否存在有关syscall的文档?如果没有,为什么不呢? 通过文档,我的意思是对每个系统调用的作用及其所接受参数的含义的实际解释. 解决方案 Apple的立场是系统库是API,稳定的ABI是系统库,而syscall不是.他们不鼓励直接使用,因为它们可以随操作系统的发行版本而变化. 因此,您将看到的最佳文档是第2节的手册页,
..
我试图在运行11.4 Beta(20F5046g)Big Sur的M1机器上加载kext模块,并在kext模块加载时遇到一些关于绑定的错误消息. 访问从Apple kext模块导出的内核符号 首先,要访问从苹果的kext模块com.apple.kpi.unsupported导出的内核函数,我使用了以下extern声明. extern int cpu_number(void);
..
在xnu中,我们有 vnode_t 实体,该实体全局表示文件。 每个进程都可以访问文件(假设它具有正确的权限),方法是设置新的文件描述符并在vg_data下设置vnode fp-> f_fglob-> fg_data = vp; vnode包含所有相关操作的基本操作列表,并根据文件的FS进行设置。即HFS +驱动程序实现此向量并相应地设置其vnode。
..
我正在寻找一种从用户空间代理到内核配置参数的通用方法,因为没有Mac等效于Windows注册表,在Windows注册表中,驱动程序可以使用ZwQueryValueKey命令直接访问此表中的任何键. 因此,我想通过CFDictionary传递动态变量列表. 在IOConnectCallMethod中有一种传递输入指针的方法,但是问题是我是否可以传递CFDictionary或CFDicti
..
我有通用内核扩展,它在C ++示例中为开始和结束例程实现,而所有其他逻辑都存储在从OSObject继承的专用类中. 它在模块启动例程时创建该类,并在停止例程中释放该类,如下面的代码所示: class com_my_driver : public OSObject { ... }; ... .. . com_my_driver *gDriver = NULL; extern "C"
..
我正在研究Kext,它应该可以访问struct proc->p_pid字段.问题在于结构仅在XNU源中定义,因此在编译过程中遇到了incomplete definition of type 'struct proc'错误. 从我的角度来看,将XNU标头包含到我自己的项目中是一种不好的解决方案,但是替代方法是什么?是要复制结构并将其粘贴到我自己的代码中吗? 解决方案 您应该为此使用pr
..
我正在尝试手写Mach-O可执行文件.共有三个加载命令: LC_SEGMENT_64正在加载__PAGEZERO LC_SEGMENT_64使用单个__text部分加载__TEXT LC_UNIXTHREAD和适当设置的rip 每个命令都匹配mach/loader.h中的结构和相关的头文件. otool -l按预期列出信息,并且不报告任何错误.从所有人的角度来看,这是一个格式正确的
..
为了获得更好的封装和模块化,我决定将内核驱动程序拆分为2个(可能更多)模块,每个模块负责不同的功能. 但是,我仍然想在这些模块之间共享一些数据和逻辑(即一个模块可以管理与用户空间的通信,而另一个模块用作中介),我想知道是否有任何简单的方法这样做的方式. 例如,我想将一些API从一个模块发布到另一个模块,这是绝对可行的,因为两个模块都在内核进程下运行,并且映射在同一地址空间中的不同范围内
..
我想要一个脚本,该脚本为每个新运行的进程打印其启动命令及其父进程. 我正在使用以下探针: proc::posix_spawn:exec-success,proc::__mac_execve:exec-success 在脚本正文中,命令行字符串是从curproc->p_dtrace_argv构建的. parent pid(ppid)也可用,但是到目前为止,我还没有弄清楚如何提取
..
我想从kext中的PID检索进程的路径,如下所示:还有其他方法可以从kext检索进程struct proc *p的proc_info吗? 解决方案 应该返回进程的主要可执行文件vnode,proc_getexecutablevnode()的函数在私有KPI中,该函数仅可用于Apple发布的kexts 它所依赖的信息应该存储在struct proc的p_textvp字段中,该字段再次不
..
在建立/删除回调(例如kauth_unlisten_scope)和回调本身(在xnu代码库中,是的,我知道,它已过时)之间似乎没有同步.这就增加了跟踪/清除回调以及与扩展本身上的调用同步的负担.但这也是有问题的,因为有一个窗口可以指出线程已退出回调并实际上退出了扩展代码. 是否有任何模式可以正确避免这场比赛?或者,Apple是否有任何文件表明他们已经正确同步了此文件? 解决方案 据我
..
我正在调试导致Mac内核转储的驱动程序.它显示了由一系列地址组成的长回溯: panic(cpu 6 caller 0xffffff8004dc9986): trying to interlock destroyed mutex (0xffffff8049deedb0) Backtrace (CPU 6), Frame : Return Address 0xffffff93b1c8bb50
..
可从网上,邮件列表,诸如 Mac OS X Internals 之类的书籍中获得的材料,甚至包括源代码,都非常有限. 现在,我知道xnu内核会引发一个EXC_CRASH,它会通知启动以启动“问题Reporter.app"(之前是Crash Reporter.app).这个应用程式是使用某种侦错介面来产生当机报告吗,还是它的内核已经在产生报告并只是通知应用程式以开启已经产生的报告? 解决方案
..
有很多页面对此进行了解释,但我找不到它.我发现许多文章仅适用于El Capitan和较旧的系统. 我现在没有使用fwkpfv,因为我没有正确的加密狗.我的客户给我买了一台支持Firewire的二手MacBook. 我的内核扩展恐慌了我的盒子.奇怪的是,如果我的同事构建了我的扩展程序,它就可以正常工作.我仍然感到困惑. 解决方案 您可以使用命令获取“实时"本地内核日志 lo
..