如果你写过驱动、调过游戏内存、或者被蓝屏里的 PAGE_FAULT_IN_NONPAGED_AREA 卡过一整天,那这门课的主题其实只有一个:Windows 到底怎么把一块虚拟地址变成真正可用的物理内存,以及这个过程在哪一步会出错。它不是讲 API 怎么调,而是讲 API 背后那套机制怎么运转。

先确认你到底缺哪一块

内存管理这个词太大,不同人对它的缺口完全不同。可以对照下面几类情况自查:

  • 能写 VirtualAlloc、HeapAlloc,但说不清堆和栈在系统层面分别对应什么结构,申请到的地址什么时候才真正有物理页支撑;
  • 调试时看到线性地址、物理地址、PFN 这些词,知道大概意思,但串不起来它们之间的转换链条;
  • 遇到缺页异常只会背「页面不在内存」,不清楚内核在异常处理里按什么顺序补齐、什么情况补不上就直接崩;
  • 做游戏安全方向,能读能改内存,但碰到保护、映射、共享页就失去判断力,只能靠试。

只要命中一条以上,这门课就不是「补充知识」,而是补上你现有技能里最不透明的那层地基。

这门课真正要啃的三件事

一、申请:从调用到真正拿到可用内存

堆和栈的申请路径不一样,走的系统结构也不一样。重点不是记住函数名,而是搞清楚一次申请之后,系统给你的是「保留了地址范围」还是「已经提交了物理页」,这两者在后续访问时的行为完全不同。很多踩坑就出在把保留当成可用。

二、地址:线性地址与物理地址怎么对应

用户态看到的地址、内核态看到的地址、以及最终落到物理内存条上的位置,是三层东西。课里会把地址管理的主线讲清楚:地址空间怎么划分、页表在中间扮演什么角色、为什么同一个物理页可以出现在不同进程的地址里。这部分理解了,看内存布局类的问题就不会再靠猜。

三、异常:缺页发生时系统做了什么

缺页异常是内存管理里最容易考、也最容易在实际排查中遇到的一环。需要弄明白的是:什么条件下算「正常缺页」可以被修复,什么条件下算「非法访问」直接判定为错误。这两者的分界线,决定了你的程序是慢一下还是直接挂掉。

看完应该能回答的问题

检验标准很直接,不需要背概念,能说清楚下面几个问题就算过关:

  • 一次堆申请和一次栈上的局部变量,在内存管理层面走的路径差异在哪;
  • 线性地址到物理地址的转换里,哪一步失败会触发缺页,哪一步失败直接报错;
  • 为什么有的内存访问第一次会慢、之后再访问就正常;
  • 看到某个地址相关崩溃信息时,能判断问题出在申请阶段、映射阶段还是访问阶段。

怎么配合练习

这门课不适合只看不动手。建议边学边做两件事:一是用调试器观察自己写的程序在申请内存前后的地址状态变化,对照课里讲的阶段去验证;二是刻意制造一次缺页和一个非法访问,比较两者的处理结果差异。把这两组现象看明白,比反复读概念有用得多。

如果目前对内核对象、系统调用机制还完全陌生,建议先把驱动或内核基础过一遍再来,否则地址和异常这两块会听得比较吃力。缺什么补什么,别在没打地基的时候硬啃上层结构。

Windows内核-内存管理

课程详情

课程标题:Windows内核-内存管理

本课程深入探讨Windows内核中的内存管理机制,旨在帮助学员全面理解内存申请、地址管理以及异常处理等核心概念。

适合人群

  • 对游戏安全感兴趣的人群

学习收获

  • 了解堆、栈等内存的申请过程
  • 掌握Windows内存管理的主要学习内容
  • 理解线性地址和物理地址的管理方式
  • 了解缺页异常的解决机制

课程亮点

  • 深入解析Windows内核内存管理机制
  • 通过实际案例讲解内存申请、地址管理等问题
  • 帮助学员掌握内存管理的核心概念和技巧

课程目录

01 01.整体介绍.mp4
02 02.用户空间线性地址的管理.mp4
03 03.VAD.mp4
04 04.私有内存.mp4
05 05.共享内存.mp4
06 06.共享文件.mp4
07 07.物理内存的管理.mp4