MM 学习笔记 02:miavl.h AVL 树与初始化流程
MM 学习笔记 02miavl.h AVL 树与初始化流程一、miavl.h — VAD 节点的 AVL 树算法文件ntoskrnl/mm/ARM3/miavl.h1.1 设计目的为虚拟地址描述符VAD提供专用的 AVL 树算法实现。与 RTL 通用 AVL 相比MM 版本通过内联比较直接访问StartingVpn/EndingVpn字段避免了回调函数开销。1.2 类型映射#definePRTL_AVL_TABLEPMM_AVL_TABLE// AVL 表#definePRTL_BALANCED_LINKSPMMADDRESS_NODE// 树节点1.3 函数重命名避免符号冲突MM 名称功能MiFindAvlTableNodeOrParent查找节点或其父节点MiPromoteAvlTreeNodeAVL 树旋转提升MiRebalanceAvlTreeNodeAVL 树重新平衡MiInsertAvlTreeNode插入节点MiDeleteAvlTreeNode删除节点1.4 比较函数MiAvlCompareRoutine(Table,Buffer,UserData){CurrentNodeUserData-sizeof(RTL_BALANCED_LINKS);// 回溯到节点起始StartingVpn(ULONG_PTR)Buffer;// 要查找的地址if(StartingVpnCurrentNode-StartingVpn)returnGenericLessThan;if(StartingVpnCurrentNode-EndingVpn)returnGenericEqual;// 含于区间elsereturnGenericGreaterThan;}关键点比较的是地址是否落在节点描述的虚拟地址区间内而非简单的大小比较。1.5 内联函数// 设置父指针保留低2位的平衡因子MiSetParent(Node,Parent):Node-u1.ParentParent|(Node-u1.Balance0x3)// 设置平衡因子仅低2位MiSetBalance(Node,Balance):Node-u1.BalanceBalance// 获取父指针屏蔽低2位的平衡因子MiParentAvl(Node):(PRTL_BALANCED_LINKS)(Node-u1.Parent~0x3)// 获取平衡因子MiBalance(Node):(SCHAR)(Node-u1.Balance)空间优化技巧父指针和平衡因子共用同一个指针字段。由于指针至少 4 字节对齐低 2 位恒为 0可用于存储平衡因子。1.6 配套结构定义在sdk/include/ndk/mmtypes.h// AVL 树表typedefstruct_MM_AVL_TABLE{MMADDRESS_NODE BalancedRoot;// 根节点ULONG_PTR DepthOfTree:5;// 树深度ULONG_PTR Unused:3;ULONG_PTR NumberGenericTableElements:56;// 节点总数PVOID NodeHint;// 节点提示加速查找PVOID NodeFreeHint;// 空闲节点提示}MM_AVL_TABLE;// AVL 树节点typedefstruct_MMADDRESS_NODE{union{LONG_PTR Balance:2;struct_MMADDRESS_NODE*Parent;}u1;struct_MMADDRESS_NODE*LeftChild;struct_MMADDRESS_NODE*RightChild;ULONG_PTR StartingVpn;// 起始 VPN虚拟页号ULONG_PTR EndingVpn;// 结束 VPN}MMADDRESS_NODE;二、ARM3/mminit.c — 内存管理器初始化文件ntoskrnl/mm/ARM3/mminit.c2.1 非分页池大小算法ULONG MmMaximumNonPagedPoolPercent0;// 0 自动计算SIZE_T MmSizeOfNonPagedPoolInBytes0;// 实际大小字节SIZE_T MmMaximumNonPagedPoolInBytes0;// 最大限制SIZE_T MmMinimumNonPagedPoolSize256*1024;// 最小值 256KBSIZE_T MmDefaultMaximumNonPagedPool1*1024*1024;// 默认最大值 1MBSIZE_T MmMinAdditionNonPagedPoolPerMb32*1024;// 每 MB 内存增加的池大小SIZE_T MmMaxAdditionNonPagedPoolPerMb400*1024;// 最大增量计算逻辑注释中的解释非分页池总量 固定基础值 基于物理内存的动态增量如果MmMaximumNonPagedPoolPercent为 0根据物理内存大小自动计算MmMinimumNonPagedPoolSize256KB保证最小可用量2.2 Phase0 初始化由MmArmInitSystem(0, ...)调用MiScanMemoryDescriptors() └─ 从 LoaderBlock-MemoryDescriptorList 遍历所有内存描述符 识别可用 RAM、XIP ROM、坏块、固件保留区 MiComputeColorInformation() MiInitializeColorTables() └─ 计算 L2 Cache 颜色数CacheLineSize / PAGE_SIZE 初始化颜色表使页面分配时考虑缓存颜色对齐 MiBuildPfnDatabase() └─ 计算 PFN 数据库所需空间物理页数 × sizeof(MMPFN) 在非分页池中预留空间 MiMapPfnDatabase() └─ 将 PFN 数据库映射到系统虚拟地址空间 MiInitializeSystemPtes() MiReserveSystemPtes() └─ 初始化系统 PTE 空间各种池类型的 PTE 范围 MiBuildPagedPool() └─ 为分页池构建页表映射 MiInitializeNonPagedPool() └─ 初始化非分页池描述符和底层页面 MiInitializeMemoryEvents() └─ 初始化低内存/高内存通知事件 MiAdjustWorkingSetManagerParameters() └─ 调整工作集管理器参数最小工作集大小等2.3 Phase1 初始化由MmArmInitSystem(1, ...)调用MiInitializeLoadedModuleList() └─ 从 LoaderBlock 读取已加载模块链表初始化 PsLoadedModuleList MiReloadBootLoadedDrivers() └─ 重新处理引导加载的驱动修复导入表 MiBuildImportsForBootDrivers() └─ 构建引导驱动的导入表解析 MiInitializeLargePageSupport() └─ 初始化大页面分配的数据结构 MiInitializeSpecialPool() └─ 初始化 Driver Verifier 特殊池 MmInitBsmThread() └─ 启动后台交换元数据Bsm线程2.4 架构相关的MiInitMachineDependent()x86ARM3/i386/init.c// 定义 x86 模板 PTEMMPTE ValidKernelPde{{0x1A3}};// Valid Accessed Dirty Write GlobalMMPTE ValidKernelPte{{0x1A3}};MMPTE ValidKernelPdeLocal{{0x163}};// 不含 Global 位SMP 本地MMPTE ValidKernelPteLocal{{0x163}};MMPTE DemandZeroPde{{0x1A2}};// 不含 Dirty 位请求零页amd64mm/amd64/init.c// 定义 amd64 模板 PTE64位 构建 PFN 数据库遍历四级页表// PML4 → PDPT → PD → PT 逐层初始化// 构建非分页池、系统 PTE 空间、会话空间布局三、根目录 mminit.c旧版 MM文件ntoskrnl/mm/mminit.c旧版 MM 的初始化入口是MmInitSystem负责初始化MmKernelAddressSpace创建系统内存区域MiInitSystemMemoryAreas创建 ARM3 静态内存区域MiCreateArm3StaticMemoryArea初始化Mm64BitPhysicalAddress、MmDisablePagingExecutive等全局标志现今被 ARM3 的MmArmInitSystem在 Phase1 中回调。四、关键理解两阶段初始化Phase0 建立最基本的内存管理结构PFN DB、系统 PTE、池此时系统尚不能处理缺页异常Phase1 完善加载器、大页面、调试等设施。AVL 树优化MM 版本的 AVL 树通过内联比较和父指针/平衡因子共用字段比通用 RTL AVL 更高效、更节省空间。模板 PTEValidKernelPte/DemandZeroPte等模板 PTE 在初始化时预定义好标志位后续分配页面时直接使用避免了重复设置硬件标志。非分页池大小256KB 起的非分页池 每 MB 物理内存 32KB 的增量保证系统既有足够的非分页内存又不会过度预占。

相关新闻

揭秘三大虚拟定位技术:如何让iOS设备实现精准位置模拟

揭秘三大虚拟定位技术:如何让iOS设备实现精准位置模拟

揭秘三大虚拟定位技术:如何让iOS设备实现精准位置模拟 【免费下载链接】GeoPort GeoPort: Your Location, Anywhere! The iOS location simulator 项目地址: https://gitcode.com/gh_mirrors/ge/GeoPort 在移动应用开发和地理服务测试领域,iOS设备…

2026/7/19 14:01:34 阅读更多 →
Windows字体自定义终极指南:用noMeiryoUI轻松打造个性化系统界面

Windows字体自定义终极指南:用noMeiryoUI轻松打造个性化系统界面

Windows字体自定义终极指南:用noMeiryoUI轻松打造个性化系统界面 【免费下载链接】noMeiryoUI No!! MeiryoUI is Windows system font setting tool on Windows 8.1/10/11. 项目地址: https://gitcode.com/gh_mirrors/no/noMeiryoUI 你是否厌倦了Windows系统…

2026/7/19 14:01:34 阅读更多 →
Joplin终极隐私笔记指南:如何用开源工具保护你的数字记忆

Joplin终极隐私笔记指南:如何用开源工具保护你的数字记忆

Joplin终极隐私笔记指南:如何用开源工具保护你的数字记忆 【免费下载链接】joplin Joplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS. 项目地址: https://gitcode.com/GitHub_Trending/jo/jopli…

2026/7/19 14:01:34 阅读更多 →

最新新闻

互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:40 阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:13:39 阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:12:39 阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:12:39 阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:12:39 阅读更多 →
2026年具身智能领域代表性机器人产品观察:普渡一脑多形底座与实景落地解析

2026年具身智能领域代表性机器人产品观察:普渡一脑多形底座与实景落地解析

前言2026年被行业视为具身智能从"实验室炫技"走向"规模化量产"的关键拐点。据弗若斯特沙利文《全球商用服务机器人市场研究报告》,普渡科技以23%市占率位居全球商用服务机器人第一,业务覆盖85+个国家和地区,累…

2026/7/20 0:11:39 阅读更多 →

日新闻

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:00:34 阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:00:34 阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:00:34 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 5:57:49 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 4:31:26 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 5:56:42 阅读更多 →

月新闻