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/10/10 23:02:44 阅读更多 →
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/10/6 9:44:09 阅读更多 →
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/10/7 9:43:02 阅读更多 →

最新新闻

基于YOLOv5与PyQt的猪只行为检测系统搭建实战

基于YOLOv5与PyQt的猪只行为检测系统搭建实战

简介:面向养殖场智能化管理场景,这套资源围绕YOLOv5生猪行为状态检测提供成套方案,内含训练权重、1000余条标注数据以及PyQt界面脚本。数据集已按train/val/test划分好,附带data.yaml和txt格式标签,覆盖进食、站立、躺…

2026/10/10 23:43:16 阅读更多 →
用Rust加固存量系统:内存安全从源头杜绝漏洞

用Rust加固存量系统:内存安全从源头杜绝漏洞

Rust 这几年热度居高不下,但大家真正关心的其实不是语言本身,而是"内存安全加固"这件事能不能在工程里落地。我先说个自己的经历:有一次线上服务莫名其妙地间歇性崩溃,排查到最后,核心原因是一段老 C 代码在…

2026/10/10 23:43:16 阅读更多 →
Swin-Transformer落地细胞核分割:从MoNuSeg训练到推理全流程

Swin-Transformer落地细胞核分割:从MoNuSeg训练到推理全流程

简介:一套基于Swin-Transformer的细胞核分割端到端可复现实现方案,面向具备PyTorch基础、从事医学图像分析的研究者与开发者。方案采用SwinUNETR作为主干模型,配合Focal-Tversky损失函数,在MoNuSeg数据集上完成数据下载、预处理、…

2026/10/10 23:43:16 阅读更多 →
商品销售分析系统:从爬虫采集到可视化大屏的完整实现

商品销售分析系统:从爬虫采集到可视化大屏的完整实现

简介:基于Python的商品销售数据分析可视化系统源码,采用Django框架开发,并集成网络爬虫模块,用于采集、清洗商品销售数据并进行可视化展示,覆盖毕业设计或Web开发实训的完整项目链路。压缩包共1480个文件,体…

2026/10/10 23:43:16 阅读更多 →
基于Python的古建筑表面病害检测系统:图像识别与GUI实现

基于Python的古建筑表面病害检测系统:图像识别与GUI实现

简介:这份资源面向具备Python基础、对计算机视觉与深度学习有一定了解的研发人员、文物保护技术人员及研究生,提供一套古建筑表面病害辅助检测系统的完整工程实例。系统以YOLO目标检测模型为核心,结合OpenCV图像处理、FastAPI服务接口与SQLit…

2026/10/10 23:43:16 阅读更多 →
Python练习总练废?分层练习+两个实战项目带你走出误区

Python练习总练废?分层练习+两个实战项目带你走出误区

1. 先聊聊“Python练习”这件事为什么容易练废我见过不少人学Python,开头那几天热情高涨,买了一堆书、收藏了一堆教程,结果练了不到两周就放弃了。回头一问,练的方式基本都是“跟着教程敲一遍”,敲完就忘,忘…

2026/10/10 23:42:15 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →