ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

XNU 内核完全指南:从 Darwin 混合内核架构到构建、调试与扩展开发

XNU 内核完全指南:从 Darwin 混合内核架构到构建、调试与扩展开发 操作系统驱动开发【免费下载链接】darwin-xnuLegacy mirror of Darwin Kernel. Replaced by https://github.com/apple-oss-distributions/xnu项目地址https://gitcode.com/gh_mirrors/da/darwin-xnu点击查看免费下载XNUX is Not Unix是 Darwin 操作系统的核心也是 macOS 与 iOS 的基础内核。它融合了 CMU 的 Mach 微内核、FreeBSD 子系统与 C 编写的 IOKit 驱动框架形成独特的混合内核。本文以仓库根目录的 README.md 为骨架结合源码与配套文档系统讲解 XNU 的目录结构、内核变体debug / development / release / profile构建方法、kernelcache 生成与安全回退、kdp 远程调试、条件编译规范、头文件安装机制、内核自检XNUPOST与用户态测试并深入libkdd内核分块数据格式帮助你从源码层面理解并驾驭这一核心系统。XNU 是什么一个“X 不是 Unix”的混合内核XNU 全称X is Not Unix是 Darwin 操作系统macOS 与 iOS 的基础系统的内核。它并非单一架构的内核而是三种技术路线的组合见 README.mdMach 内核源自卡内基梅隆大学CMU的微内核研究成果负责任务/线程调度、虚拟内存、IPC 端口等底层抽象对应仓库中的osfmk/目录FreeBSD 子系统提供 POSIX 风格的系统调用、网络协议栈、文件系统与安全模型对应bsd/目录IOKit一套 C API 驱动框架用于编写设备驱动与内核扩展kext对应libkern/与iokit/目录。README 明确说明 XNU 支持x86_64 架构的单处理器与多处理器配置。这一“混合”定位决定了 XNU 的目录组织、构建系统与测试策略都围绕三大部分展开。XNU 源码树理解仓库顶层目录README 给出了源码树的顶层目录清单理解它们是对后续构建与开发的基础目录职责config/受支持架构与平台的导出 API 配置如MASTER、各.exports文件SETUP/内核配置、版本管理newvers与 kextsymbol 管理的基础工具集EXTERNAL_HEADERS/从其他项目同步的头文件避免构建时产生依赖环需随上游源码更新而同步libkern/C IOKit 库代码负责驱动与 kext 的处理libsa/内核启动引导代码libsyscall/面向用户态程序的 syscall 库接口libkdd/解析内核分块数据kernel chunked data的用户态库makedefs/内核构建的顶层规则与宏定义MakeInc.*osfmk/基于 Mach 内核的子系统进程、内存、IPC 等pexpert/平台相关代码如中断处理、原子操作等security/强制访问控制MAC策略接口及实现bsd/BSD 子系统代码tools/测试、调试与内核性能剖析工具集例如config/MASTER是机器无关的内核主配置文件由SETUP/config下的doconf脚本SETUP/config/doconf结合机器相关主文件生成具体配置其中以foo,bar属性选择器控制行的取舍无属性注释的行对所有配置生效。构建 XNU 内核KERNEL_CONFIGS 与 ARCH_CONFIGS构建语法与关键参数XNU 的 make 系统通过KERNEL_CONFIGS与ARCH_CONFIGS两个变量驱动构建README.mdmake SDKROOTsdkroot ARCH_CONFIGSarch KERNEL_CONFIGSvariant各参数含义sdkroot磁盘上 macOS SDK 的路径默认值为/variant可选debug、development、release、profile决定编译标志与内核代码中的断言assert是否启用arch目标架构如X86_64。常用构建命令构建与当前运行系统相同架构的内核直接执行make make SDKROOTmacosx.internal通过ARCH_CONFIGS指定架构、KERNEL_CONFIGS指定变体可同时构建多个变体make SDKROOTmacosx.internal ARCH_CONFIGSX86_64 KERNEL_CONFIGSDEVELOPMENT make SDKROOTmacosx.internal ARCH_CONFIGSX86_64 KERNEL_CONFIGSRELEASE DEVELOPMENT DEBUG注意默认架构取构建机器的架构默认内核配置为DEVELOPMENT。构建产物包括可引导镜像kernel.[config]以及带符号的二进制kernel.[config].unstripped例如kernel.development与kernel.development.unstripped。安装内核到 DSTROOT使用install_kernels目标把内核安装到指定 DSTROOTmake install_kernels DSTROOT/tmp/xnu-dst构建 FAT 内核二进制通过环境变量或 make 参数定义多个架构即可生成 FAT 内核make ARCH_CONFIGSX86_64 exporthdrs all其他有用的 make 选项README 列出的常用选项均已在当前仓库 make 系统中支持make MAKEJOBS-j8使用 8 个进程并行构建默认值为活跃 CPU 数的 2 倍make -j8标准的命令行并行选项同样可用make -w追踪递归 make 调用与VERBOSEYES配合使用make BUILD_LTO0禁用 LLVM 链接时优化LTOmake REMOTEBUILDuserremotehost在远程主机上执行构建make BUILD_JSON_COMPILATION_DATABASE1生成 Clang JSON Compilation Database实现见 SETUP/json_compilation_db/彩色构建输出设置环境变量XNU_LOGCOLORSy或向 make 传递LOGCOLORSy。调试体验优化提示如果你希望获得更满意的内核调试体验——能访问所有局部变量与参数又不想承担 DEBUG 内核的额外检查开销——README 建议在 make 命令中追加CFLAGS_DEVELOPMENTARM64-O0 -g -DKERNEL_STACK_MULTIPLIER2 \ CXXFLAGS_DEVELOPMENTARM64-O0 -g -DKERNEL_STACK_MULTIPLIER2其中DEVELOPMENT与ARM64应替换为实际构建的配置与平台。以-O0 -g关闭优化、保留完整调试信息并借KERNEL_STACK_MULTIPLIER放大内核栈为内核态调试留出更多空间。调试信息格式DWARF 与 STABS默认情况下XNU 在 install 阶段会生成 DWARF 调试信息仓库bundle即名为kernel.development.variant.dSYM的包。若想改用更老的STABS格式调试信息直接嵌入kernel.development.unstripped镜像设置环境变量后重新构建export BUILD_STABS1 make构建 KernelCacheskextd 自动生成与 kextcache 手动构建单独的内核镜像并不能直接引导测试——必须把内核与 kext 链接成单一可引导镜像kernelcache。README 提供了两种机制方式一kextd 自动生成 kernelcachekextd守护进程会持续监视/System/Library/Extensions目录的变化因此可以通过以下步骤让系统自动重建 kernelcachecp BUILD/obj/DEVELOPMENT/X86_64/kernel.development /System/Library/Kernels/ touch /System/Library/Extensions ps -e | grep kextdtouch触发目录时间戳变化kextd 检测后即开始重建。方式二手动调用 kextcachekextcache -q -z -a x86_64 -l -n -c /var/tmp/kernelcache.test -K /var/tmp/kernel.test /System/Library/Extensions其中-K指定内核路径、-c指定输出 kernelcache 路径、-a指定架构。在目标机器上运行 KernelCacheboot.plist 与安全回退开发内核与 iBoot 支持通过引导参数boot-args配置使机器能安全地引导进测试内核若出问题还能回退到之前使用的 kernelcache。README 给出了完整的五步设置创建内核缓存使用 kextcache 命令生成/kernelcache.test备份现有引导配置到备用文件cp /Library/Preferences/SystemConfiguration/com.apple.Boot.plist /next_boot.plist更新 kernelcache 与 boot-argsplutil -insert Kernel Cache -string kernelcache.test /next_boot.plist plutil -replace Kernel Flags -string debug0x144 -v kernelsuffixtest /next_boot.plist复制新配置到/Library/Preferences/SystemConfiguration/cp /next_boot.plist /Library/Preferences/SystemConfiguration/boot.plistBless 卷宗使新配置在下次引导生效sudo -n bless --mount / --setBoot --nextonly --options configboot其中--nextonly标志指定boot.plist配置仅用于下一次引导。因此一旦内核 panic只需重新上电即可轻松恢复到原有内核——这是测试内核时最关键的兜底机制。生成 tags 与 cscope 数据库在顶部目录设置好构建环境后可生成代码导航数据库make tags # 在大小写敏感卷上同时生成 ctags 与 etags大小写不敏感卷仅生成 ctags make TAGS # 仅生成 etags make cscope # 生成 cscope 数据库条件编译规范CPU 特性、新功能与既有功能XNU 提供三类条件编译机制README.md选择顺序有明确建议CPU 特性若代码仅随目标 CPU 架构而变优先检查架构特性宏如__LP64__、__LITTLE_ENDIAN__等而不是平台宏新功能若代码整体实现了一个新功能应在config/MASTER中定义新特性并使用生成的CONFIG预处理标记例如名为config_virtual_memory的功能用#if CONFIG_VIRTUAL_MEMORY检查。这一实践保证了既有功能只需切换特性开关即可迁移到其他平台既有功能若代码与已有功能强相关可直接使用既有特性例如实现与可信内核trusted kernel相关的新功能时使用SECURE_KERNEL。重要约束XNU 不定义TargetConditionals.h中的平台宏TARGET_OS_OSX、TARGET_OS_IOS等应避免基于目标平台编译。已废弃的TARGET_OS_EMBEDDED宏因其定义过宽也应避免使用。从源码结构看config/MASTER中大量options行如INET、HW_AST、MACH正是通过这套机制生成各平台的CONFIG_*开关。安装新的内核头文件文件清单与安装列表安装位置XNU 将头文件安装到以下位置README.md位置用途$(DSTROOT)/System/Library/Frameworks/Kernel.framework/Headers内核扩展kext使用$(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeaders仅供 Apple 内部开发的内核扩展使用$(DSTROOT)/usr/include/用户级应用程序使用$(DSTROOT)/System/DriverKit/usr/include/用户态驱动DriverKit使用$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeadersApple 内部用户级程序使用文件清单file list头文件所在目录应有一个 Makefile 负责生成各安装位置的安装清单。如果是在某目录新增第一个头文件需要参照 bsd/sys/Makefile 创建 Makefile并把头文件加入正确的文件清单DATAFILES用户级可用安装到$(DSTROOT)/usr/includeDRIVERKIT_DATAFILESDriverKit 用户态驱动可用安装到$(DSTROOT)/System/DriverKit/usr/includePRIVATE_DATAFILESApple 内部用户级可用安装到$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeadersKERNELFILES内核级可用安装到Kernel.framework的Headers与PrivateHeadersPRIVATE_KERNELFILESApple 内部内核扩展可用安装到Kernel.framework的PrivateHeaders。以 bsd/sys/Makefile 为例可确认这些清单在仓库中的真实形态DATAFILES、DRIVERKIT_DATAFILES、PRIVATE_DATAFILES、KERNELFILES、PRIVATE_KERNELFILES均以多行变量列出具体头文件。安装列表install list与 MD/MI 划分Makefile 将上述文件清单组合成安装列表供构建系统使用。安装列表分为**机器相关MDmachine-dependent与机器无关MImachine-independent**两类头文件若与架构相关使用机器相关列表如INSTALL_MD_LIST若对所有架构都安装则使用机器无关列表如INSTALL_MI_LIST。README 给出的默认安装列表、成员清单与默认位置如下安装列表成员文件清单默认位置INSTALL_MI_LIST${DATAFILES}$(DSTROOT)/usr/includeINSTALL_DRIVERKIT_MI_LIST${DRIVERKIT_DATAFILES}$(DSTROOT)/System/DriverKit/usr/includeINSTALL_MI_LCL_LIST${PRIVATE_DATAFILES}$(DSTROOT)/System/Library/Frameworks/System.framework/PrivateHeadersINSTALL_KF_MI_LIST${KERNELFILES}$(DSTROOT)/System/Library/Frameworks/Kernel.framework/HeadersINSTALL_KF_MI_LCL_LIST${KERNELFILES} ${PRIVATE_KERNELFILES}$(DSTROOT)/System/Library/Frameworks/Kernel.framework/PrivateHeadersEXPORT_MI_LIST${KERNELFILES} ${PRIVATE_KERNELFILES}仅导出到 xnu 内部bsd/、osfmk/ 等供编译不装入 SDKINSTALL_MODULEMAP_INCDIR_MI_LIST${MODULEMAP_INCDIR_FILES}$(DSTROOT)/usr/includeINCDIR 根若希望把头文件安装到上述路径的子目录用INSTALL_MI_DIR与EXPORT_MI_DIR指定目录名INSTALL_MI_DIR dirname EXPORT_MI_DIR dirname用预处理宏控制头文件内容单个头文件可能被安装到多个位置但你未必希望所有内容在所有位置都可见例如只想导出函数到内核层而非用户层。解决办法是利用 C 预处理指令#ifdef、#ifndef、#endif控制安装前生成的文本内核只保留条件宏为 TRUE 的代码并剥离 FALSE 分支。预定义宏及其可见范围README.md宏可见范围PRIVATESystem Private Interfacesxnu 内部可见并暴露于 System/Kernel framework 的 AppleInternal PrivateHeaders 部分KERNEL_PRIVATE全部 xnu 内核与 Apple 内部内核扩展可见从用户头文件中省略BSD_KERNEL_PRIVATE仅 xnu/bsd 模块内可见MACH_KERNEL_PRIVATE仅 xnu/osfmk 模块内可见XNU_KERNEL_PRIVATE仅 xnu 内可见KERNELxnu 与内核扩展内可见用户级头文件不可见仅Kernel.framework/Headers与PrivateHeaders安装的头文件包含该代码DRIVERKIT仅 DriverKit SDK 头文件用户态驱动使用可见添加新的系统调用与测试内核添加新 syscallREADME 预留了 “How to add a new syscall” 章节未给出详细步骤但内核系统调用的实际入口分散在osfmk/Mach trap与bsd/BSD syscall两侧。若要在当前仓库实践可参照 libsyscall/mach/ 下各.defs文件与bsd/sys/中现有 syscall 的实现来建立调用链。测试机制总览XNU 提供多种测试机制README.md断言AssertionsDEVELOPMENT 与 DEBUG 内核配置默认启用断言便于开发者验证不变量与条件内核上电自检XNUPOSTXNUPOST配置允许构建带基础测试函数集的内核在首个用户空间进程启动前运行。由于 XNU 是 Mach 与 BSD 的混合体测试分两处添加osfmk/tests/测试 Mach 内核结构与 APIbsd/tests/测试 BSD 接口详细文档见 osfmk/tests/README.md。用户级测试tools/tests/目录存放验证 syscall 及其他特性的测试。使用xnu_testsmake 目标构建全部测试make RC_ProjectNamexnu_tests SDKROOT/path/to/SDK这些测试是独立程序可在终端运行通过标准 POSIX 退出码0 表示成功和/或 stdout 报告测试状态。可在 tools/tests/Makefile 中确认RC_ProjectName对测试构建的控制逻辑。深入 XNUPOST内核上电自检框架osfmk/tests/README.md 详细描述了 XNUPOST 的特性与用法这是 README 测试章节的直接延伸特性编译时从 RELEASE 内核中剔除通过 boot-argkernPOST启用0x1用于桌面测试0x3用于 BATs自动化测试环境自动跳过专为 panic 设计的内核测试桌面测试跳过BATs 环境运行无需完整安装到设备仅 kernelcache 即可运行可同时检查断言与 panic 路径。运行方法启动 usbterm 并将目标设备置于 iBoot 后设置 boot-args 包含 kernPOST0x1 # 开机启用内核测试 usb get /path/to/kc # 加载 kernelcache bootx # 引导镜像在 nanokdp 串口输出中观察带[KTEST] test logs标签的日志。只运行指定测试通过 boot-argkernPOST_config配置支持单测与范围kernPOST_config8 # 只运行测试 #8 kernPOST_config1_3,5_9999 # 跳过 #4运行 1、2、3 与 5 及之后 kernPOST_config1_3,4_9999 # 不跳过任何测试上下界均含添加新测试按测试领域在 osfmk/tests/ 或 bsd/tests/ 添加新.c文件#include xnupost.h获取测试所需的函数与宏并在osfmk/conf/files或bsd/conf/files中登记例如osfmk/tests/my_tests.c optional config_xnupost仓库 bsd/conf/files 中可见bsd/tests/bsd_tests.c optional config_xnupost等真实登记行声明测试函数kern_return_t my_sample_tests(void);加入测试数组如 osfmk/tests/kernel_tests.c 中的struct xnupost_test kernel_post_tests[]struct xnupost_test kernel_post_tests[] { XNUPOST_TEST_CONFIG_BASIC(my_sample_tests), // 简单测试 XNUPOST_TEST_CONFIG_TEST_PANIC(panic_test) // 预期 panic 的测试 };仓库中kernel_post_tests[]的实例确认了XNUPOST_TEST_CONFIG_BASIC与XNUPOST_TEST_CONFIG_TEST_PANIC的实际用法如zalloc_test、test_thread_call等。示例测试函数使用T_*宏族kern_return_t my_sample_tests(void) { uint64_t test_begin_timestamp 0; uint64_t cur_timestamp 0, tmp; T_SETUPBEGIN; test_begin_timestamp mach_absolute_time(); T_ASSERT_NOTNULL(test_begin_timestamp, mach_absolute_time returned 0.); T_SETUPEND; T_LOG(Testing mach_absolute_time for 100 iterations); for (int i 0; i 100; i) { tmp mach_absolute_time(); T_EXPECT_TRUE((cur_timestamp tmp), Time went backwards); cur_timestamp tmp; } T_LOG(Completed mach_absolute_time tests.); return KERN_SUCCESS; }以KERN_SUCCESS报告成功其他错误码报告失败。注意测试必须做好状态清理内核预期在测试后继续引导若无法清理而需要重启则使用XNUPOST_TEST_CONFIG_TEST_PANIC类型并在函数末尾 panic让测试控制器在自动化中重启并运行下一个测试。T_EXPECT 与 T_ASSERT 的区别T_ASSERT宏检查条件失败时以KERN_FAILURE返回确保后续测试代码不再执行T_EXPECT仅报告该测试用例失败但继续执行后续测试代码。测试 panic 与断言panic widgetxnupost 子系统提供注册panic widget的机制用于检查特定条件并报告测试 SUCCESS/FAILURE。在 debug/development 内核上panic()代码被改造为调用xnupost_process_panic()该回调判断测试是否启用、是否注册了检查 panic 的 widget并据返回值决定动作。widget 可返回XT_PANIC_UNRELATED与本测试无关继续 panicXT_RET_W_FAIL报告 FAILURE 并从 panic 返回XT_RET_W_SUCCESS报告 SUCCESS 并从 panic 返回XT_PANIC_W_FAIL报告 FAILURE 并继续 panicXT_PANIC_W_SUCCESS报告 SUCCESS 并继续 panic。panic widget 数据保存在内部数组struct xnupost_panic_widget含上下文指针、输出指针、widget 名称与回调函数中。断言检查示例来自 osfmk/tests/README.mdkern_return_t test_foo_arg_assertion(void) { void * assert_retval NULL; kern_return_t kr T_REGISTER_ASSERT_CHECK(arg 0, assert_retval); T_ASSERT(kr KERN_SUCCESS, register assertion handler); foo(-1); /* this will cause assert to fire */ T_ASSERT(assert_retval (void *)XT_RET_W_SUCCESS, verify assertion was hit); }内核数据描述符libkdd 与 Kernel Chunked Data为什么需要 libkddXNU 在不同 API 间传递数据有多种格式最标准的是 syscall 参数但对复杂数据内核往往依赖以 C 结构体保存在内存中的数据。这种打包式传输机制很脆弱会导致用户态程序与内核 API 之间的接口破坏。libkdd/ 目录存放用户态库用于解析与内核同版本提供的自定义数据。内核分块数据kernel chunked data格式在 libkdd/README.md 中有完整描述库 API 定义在 libkdd/kdd.h。KCDATA 格式布局数据按通用格式组织为一段连续的块chunk| 8 - bytes | |---------------------------| ------ offset 00 | type MAGIC | LENGTH | # BEGIN Header | 0 | |---------------------------| ------ offset 16 | type | size | # chunk header | flags | |---------------------------| ------ offset 32 | data | # arbitrary data (len16) |___________data____________| |---------------------------| ------ offset 48 | type | size | # chunk header | flags | |---------------------------| ------ offset 64 | data | # arbitrary data (len32) | data | |___________data____________| |---------------------------| ------ offset 96 | type END | size0 | # chunk header | 0 |type字段描述数据类型例如TASK_CRASHINFO_UUID表示其后为 uuid这些类型需在task_corpses.h中定义便于用户态检查工具消费。部分类型范围预留给 int、long 等特殊类型。这种可扩展格式的最大价值在于内核可以按需加入更多信息而无需用户态工具重编译即可保持兼容——例如引入新的rusage结构版本不会破坏现有工具。带描述的自描述数据进一步地数据可以携带文本描述。内核侧示例kcdata_add_uint64_with_description(cdatainfo, 0x700, NUM MACH PORTS);用户态工具即使事先未编译进对该字段的了解也能根据描述打印数据。README 给出了真实的缓冲区分块样例PID、PARENT PID等带描述块。复合数据的容器标记对于需要包含多个可选字段的复杂内核数据类型使用容器标记container markers打包。例如 stackshot 收集某任务在众多子系统中的状态io 统计、vm 计数、进程名/标志、syscall 计数kcdata_add_container_marker(kcdata_p, KCDATA_TYPE_CONTAINER_BEGIN, STACKSHOT_KCCONTAINER_TASK, task_uniqueid); // add multiple data, or add_type_with_description()s here kcdata_add_container_marker(kcdata_p, KCDATA_TYPE_CONTAINER_END, STACKSHOT_KCCONTAINER_TASK, task_uniqueid);按需描述自定义格式得益于格式的自描述特性内核提供方可描述某个数据类型用唯一数字标识并在缓冲区中使用消费方解析类型信息即可理解数据。示例描述结构体sample_disk_io_stats的字段布局struct sample_disk_io_stats { uint64_t disk_reads_count; uint64_t disk_reads_size; uint64_t io_priority_count[4]; uint64_t io_priority_size; } __attribute__ ((packed)); struct kcdata_subtype_descriptor disk_io_stats_def[] { {KCS_SUBTYPE_FLAGS_NONE, KC_ST_UINT64, 0 * sizeof(uint64_t), sizeof(uint64_t), disk_reads_count}, {KCS_SUBTYPE_FLAGS_NONE, KC_ST_UINT64, 1 * sizeof(uint64_t), sizeof(uint64_t), disk_reads_size}, {KCS_SUBTYPE_FLAGS_ARRAY, KC_ST_UINT64, 2 * sizeof(uint64_t), KCS_SUBTYPE_PACK_SIZE(4, sizeof(uint64_t)), io_priority_count}, {KCS_SUBTYPE_FLAGS_ARRAY, KC_ST_UINT64, (2 4) * sizeof(uint64_t), sizeof(uint64_t), io_priority_size}, };随后把类型定义写入缓冲区kcdata_add_type_definition(kcdata_p, KCTYPE_SAMPLE_DISK_IO_STATS, sample_disk_io_stats, disk_io_stats_def[0], sizeof(disk_io_stats_def)/sizeof(struct kcdata_subtype_descriptor));调试内核kdp 远程调试协议与 lldb基本调试流程XNU 支持通过远程内核调试协议kdp进行调试README.md。默认内核在 panic 时配置为重启为调试活内核kdp 服务器会监听以太网上的 UDP 连接。常见引导参数debug0x144设置调试变量在 panic 时启动 kdp debugserver-v在内核启动日志打印到屏幕默认 XNU 只显示带引导图案的灰屏kdp_match_nameen1覆盖 kdp 默认端口选择支持以太网、雷电thunderbolt与串口调试。调试 panic 的内核时配合带符号的未剥离内核二进制使用 LLVM 调试器 lldblldb kernel.development.unstripped连接 panic 机器使用kdp_remote [ip addr]或gdb_remote [hostip : port]命令。加载内核专用调试脚本每个内核在构建时都会打包内核专用的调试脚本。出于安全考虑这些特殊命令与脚本在 lldb 连接机器时不会自动加载。若希望始终加载这些宏在~/.lldbinit中添加settings set target.load-script-from-symbol-file truetools/lldbmacros目录保存所有这些命令的源码详细用法见 tools/lldbmacros/README.md。lldbmacros内核调试命令与类型摘要从 tools/lldbmacros/README.md 可以看到这套框架建立在 lldb 的 Python 脚本桥接之上命令与摘要通过lldb_command、lldb_type_summary()等装饰器注册入口脚本为 tools/lldbmacros/xnu.py。核心用法kgmhelp列出xnu.py提供的全部命令启用内核类型摘要(lldb) showlldbtypesummaries之后print (thread_t)0x...即可直接看到线程摘要thread_id、processor、优先级、状态、等待队列等通用选项--之后-h帮助、-s regexp只打印匹配行、-o file输出到文件、-v增加详细度、-p plugin交给插件处理长输出命令可用-- -i获得即时终端输出修改命令代码后用(lldb) xnudebug reload memory热重载不必退出调试会话显示原始数据而不触发摘要用showraw命令开发者可通过环境变量DEBUG_XNU_LLDBMACROS1禁用从符号自动加载宏从而加载本地修改版xnu.py。该框架还被随构建打包进每个内核的 dSYM使 lldb 命令与内核源码变更保持版本锁定rev-locking。总结从本文可以看到XNU 是一个层次清晰的混合内核工程README.md 给出了从源码树、构建、kernelcache、条件编译、头文件安装到测试与调试的完整开发链路config/MASTER、bsd/sys/Makefile 等配置文件印证了构建与安装机制osfmk/tests/README.md 与 osfmk/tests/kernel_tests.c 展示了内核自检框架的实际形态libkdd/README.md 阐明了内核与用户态之间的自描述数据协议tools/lldbmacros/README.md 则提供了从崩溃现场提取信息的实用工具链。掌握这些环节你就具备了在 XNU 源码层面完成从构建、测试到调试的完整开发闭环能力。赞分享操作系统驱动开发【免费下载链接】darwin-xnuLegacy mirror of Darwin Kernel. Replaced by https://github.com/apple-oss-distributions/xnu项目地址https://gitcode.com/gh_mirrors/da/darwin-xnu点击查看免费下载相关推荐Darwin-XNU构建系统全解析从源码到可启动内核Darwin XNU构建系统全解析从源码到可启动内核 本文深入解析Darwin XNU内核构建系统的完整架构和工作机制涵盖多架构构建配置、不同内核变体的区别操作系统驱动开发darwin-xnu 内核调试指南基于 lldbmacros 的 lldb 内核调试平台深入解析darwin xnu 内核调试指南基于 lldbmacros 的 lldb 内核调试平台深入解析 导读 本文围绕 darwin xnu 仓库 tools/ll操作系统驱动开发XNU 内核移植完整指南从 AArch64 到 ARMv7/ARMv6 架构实战XNU 内核移植完整指南从 AArch64 到 ARMv7/ARMv6 架构实战 XNU 内核作为 macOS 和 iOS 操作系统的核心其跨架构移植技术对操作系统嵌入式创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表