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/22 0:12:10 阅读更多 →
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/23 8:53:57 阅读更多 →
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/23 16:15:37 阅读更多 →

最新新闻

小程序自动部署埋点

小程序自动部署埋点

阅读文档:https://www.npmjs.com/package/ctc-track-plugin 可以直接发给codex,部署埋点。 我在写完埋点时遇到的问题:

2026/7/23 22:31:25 阅读更多 →
多元微积分

多元微积分

1、梯度为啥说梯度是坡度最陡的方向,请看下图:根据线性关系(切平面),沿θ方向处的导数值为:令 求导:一阶导数0:极值点满足,所以带入原式,结合三角恒等式…

2026/7/23 22:31:25 阅读更多 →
华为OD机试真题 新系统 2026-07-15 JavaGoC 实现【谁没交卷】

华为OD机试真题 新系统 2026-07-15 JavaGoC 实现【谁没交卷】

目录 题目 思路 Code 题目 题目内容: 张老师组织了一场线上模拟考试,并要求考生使用学号登录网站进行考试。考试完成后张老师发现试卷提交不全,他需要找到哪些同学没有交卷。 若班级内有 N 个学生,则学号从 1 开始到 N 结束,每个学生一个学号。一个班级内学生个数不…

2026/7/23 22:31:25 阅读更多 →
【项目扩展实战|第8篇】Spring Boot + MyBatis 分页条件查询接口优化

【项目扩展实战|第8篇】Spring Boot + MyBatis 分页条件查询接口优化

前言 前面我们已经写过商品详情缓存、文件上传等功能。这一篇继续回到后台管理系统里非常高频的一个接口:分页条件查询。 只要是后台列表页面,基本都离不开分页查询。比如: 商品列表分页查询用户列表分页查询订单列表分页查询操作日志分页查询…

2026/7/23 22:31:25 阅读更多 →
这个 App 明天就要上线了

这个 App 明天就要上线了

「审核已通过。」林川坐在工位上,看着 App Store Connect 里那行绿色的小字。 周围是下午四点钟寻常的办公室噪音——键盘声、空调声、隔壁运营在打电话。 他截图,发到群里。 群里炸了。「川哥牛逼!」 「终于!!&#x…

2026/7/23 22:31:25 阅读更多 →
智慧水利机器视觉应用:AI视觉水位监测完整技术剖析

智慧水利机器视觉应用:AI视觉水位监测完整技术剖析

摘要在智慧水利数字化转型全面推进的行业背景下,传统接触式水位监测设备存在易淤堵、运维成本高、极端天气观测安全风险大、无实景佐证等短板,已难以满足河道、水库、灌区、城市内涝等多场景精细化水文管控需求。本文围绕AI视觉水位监测这套非接触式全自…

2026/7/23 22:30:25 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

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

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

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

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

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

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

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

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

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

2026/7/23 17:49:47 阅读更多 →

月新闻