windows内核情景分析笔记------内核对于物理页面的管理

用户申请很大的一块内存,如何得到每页对应的物理地址 立即下载

内核中有四个物理页面队列

static LIST_ENTRY FreeZeroedPageListHeads;

static LIST_ENTRY FreeUnzeroedPageListHeads;

static LIST_ENTRY BiosPageListHeads;

static LIST_ENTRY UsedPageListHeads[MC_MAXIMUM];

MC_MAXIMUM定义为4

根据不同物理页面的用途把他放入不同的队列,比如

#define MC_CACHE 0

#define MC_USER 1

#define MC_PPOOL 2

#define MC_NPPOOL 3

 

MM_STATS结构体定义如下

typedef struct

{

    ULONG NrTotalPages;

    ULONG NrSystemPages;

    ULONG NrReservedPages;

    ULONG NrUserPages;

    ULONG NrFreePages;

    ULONG NrDirtyPages;

    ULONG NrLockedPages;

    ULONG PagingRequestsInLastMinute;

    ULONG PagingRequestsInLastFiveMinutes;

    ULONG PagingRequestsInLastFifteenMinutes;

} MM_STATS;

 

 

看balance.c第一个函数

MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages)

{

   memset(MiMemoryConsumers, 0, sizeof(MiMemoryConsumers));

   InitializeListHead(&AllocationListHead);

   KeInitializeSpinLock(&AllocationListLock);

 

   MiNrTotalPages = NrAvailablePages;

 

   /* Set up targets. */

   MiMinimumAvailablePages = 64;

   MiMemoryConsumers[MC_CACHE].PagesTarget = NrAvailablePages / 2;

   MiMemoryConsumers[MC_USER].PagesTarget =

      NrAvailablePages - MiMinimumAvailablePages;

   MiMemoryConsumers[MC_PPOOL].PagesTarget = NrAvailablePages / 2;

   MiMemoryConsumers[MC_NPPOOL].PagesTarget = 0xFFFFFFFF;

   MiMemoryConsumers[MC_NPPOOL].PagesUsed = NrSystemPages;

}

其中MiMemoryConsumers定义如下

MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM];

其中MM_MEMORY_CONSUMER定义如下

typedef struct _MM_MEMORY_CONSUMER

{

    ULONG PagesUsed;//已经使用了多少

    ULONG PagesTarget;//配额,也就是预计划最多分配多少

    NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed);

} MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER;

    意思就是MiMemoryConsumers四个配额成员进行赋值

其中有一段代码

MiMemoryConsumers[MC_USER].PagesTarget =NrAvailablePages - MiMinimumAvailablePages;

    可以知道MiMemoryConsumers[MC_USER].PagesTarget =NrAvailablePages - MiMinimumAvailablePages;就是进行配额赋值

    其中前面已经有MiMinimumAvailablePages = 64;,而NrAvailablePages为MmInitializeBalancer传来之参数,故可以 配额(预计划最多分配)=可用页面数-最少可用页面数(意思可能是本来可用页面为100,无论你怎么分配,一定给系统留10个作为保留,也就是配额最多为90)

 

 

 

 

    接下来分析该函数

MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait,

                            PPFN_TYPE AllocatedPage)

    该函数是一个分配页面的函数

 

第一段代码是

 

   OldUsed = InterlockedIncrementUL(&MiMemoryConsumers[Consumer].PagesUsed);

   if (OldUsed >= (MiMemoryConsumers[Consumer].PagesTarget - 1) &&

   !MiIsBalancerThread())//加入配额是100,如果我们已经用了99个或者更多,就要重新申请新的自由页面

   {

      if (!CanWait)//不想等啦,得退出

      {

         (void)InterlockedDecrementUL(&MiMemoryConsumers[Consumer].PagesUsed);

         return(STATUS_NO_MEMORY);

      }

      MiTrimMemoryConsumer(Consumer);

   }

第一段函数用到了MiTrimMemoryConsumer

我们转到这里看看

VOID

NTAPI

MiTrimMemoryConsumer(ULONG Consumer)

{

   LONG Target;

   ULONG NrFreedPages;

 

   Target = MiMemoryConsumers[Consumer].PagesUsed -

            MiMemoryConsumers[Consumer].PagesTarget;

   if (Target < 1)

   {

      Target = 1;

   }

 

   if (MiMemoryConsumers[Consumer].Trim != NULL)

   {

      MiMemoryConsumers[Consumer].Trim(Target, 0, &NrFreedPages);

   }

}

   可以看到首先

  Target = MiMemoryConsumers[Consumer].PagesUsed -

            MiMemoryConsumers[Consumer].PagesTarget;

       我们这里假设MiMemoryConsumers[Consumer].PagesUsed 是99, MiMemoryConsumers[Consumer].PagesTarget是100,则 Target为-1

    经过

   if (Target < 1)

   {

      Target = 1;

   }

    后变为1

    然后调用

     if (MiMemoryConsumers[Consumer].Trim != NULL)

   {

      MiMemoryConsumers[Consumer].Trim(Target, 0, &NrFreedPages);

   }

     此处的trim为一个函数指针(这里不清楚怎么进行初始化的,汗),也就是说白了MiMemoryConsumers[Consumer].Trim(1, 0, &NrFreedPages);,意思应该是分配一个新的页面给这个结构体。

    应当注意,第一段代码针对NPPOOL也就是非置换页面,所以要特殊对待,处理完后退出。

 

第二段代码

  

   if (Consumer == MC_NPPOOL || MiIsBalancerThread())

   {

      Page = MmAllocPage(Consumer, 0);

      if (Page == 0)

      {

         KEBUGCHECK(NO_PAGES_AVAILABLE);

      }

      *AllocatedPage = Page;//page为返回的

      if (MmStats.NrFreePages <= MiMinimumAvailablePages &&

            MiBalancerThreadHandle != NULL)

      {

         KeSetEvent(&MiBalancerEvent, IO_NO_INCREMENT, FALSE);

      }

      return(STATUS_SUCCESS);

   }

   其中 Page = MmAllocPage(Consumer, 0);调用MmAllocPage函数就是返回的该新页面PHYSICAL_PAGE结构体数组的下标,如果返回为0,就代表分配失败。

   MmStats.NrFreePages <= MiMinimumAvailablePages

   分析MmStats,首先它在pool.c中有一句extern MM_STATS MmStats;而MM_STATS定义如下

typedef struct

{

    ULONG NrTotalPages;

    ULONG NrSystemPages;

    ULONG NrReservedPages;

    ULONG NrUserPages;

    ULONG NrFreePages;

    ULONG NrDirtyPages;

    ULONG NrLockedPages;

    ULONG PagingRequestsInLastMinute;

    ULONG PagingRequestsInLastFiveMinutes;

    ULONG PagingRequestsInLastFifteenMinutes;

} MM_STATS;

   而前边的

   static ULONG MiMinimumAvailablePages;

   MiMinimumAvailablePages = 64;

   已经给出了其定义和初始值。

   所以MmStats.NrFreePages <= MiMinimumAvailablePages这句话意思可能是如果当前系统的自由可分配页面小于初始的预留页面(比如要求系统最低保留十个自由页面,但是此时的内存自由页面只有不到十个了,就要退出)

    第三段代码

    if (MmStats.NrFreePages <= MiMinimumAvailablePages)

   {

      MM_ALLOCATION_REQUEST Request;

 

      if (!CanWait)

      {

         (void)InterlockedDecrementUL(&MiMemoryConsumers[Consumer].PagesUsed);

         return(STATUS_NO_MEMORY);

      }

 

      /* Insert an allocation request. */

      Request.Page = 0;

      KeInitializeEvent(&Request.Event, NotificationEvent, FALSE);//初始一个同步事件,初始为未受信,事件变量为 Request的一个变量

      (void)InterlockedIncrementUL(&MiPagesRequired);//原子性的增加全部变量MiPagesRequired(初始为0)

 

      KeAcquireSpinLock(&AllocationListLock, &oldIrql);//获得自旋锁

 

      if (MiBalancerThreadHandle != NULL)//MiBalancerThreadHandle初始为空

      {

         KeSetEvent(&MiBalancerEvent, IO_NO_INCREMENT, FALSE);//设置事件为未受信状态

      }

      InsertTailList(&AllocationListHead, &Request.ListEntry);//将其挂入AllocationListHead队列

      KeReleaseSpinLock(&AllocationListLock, oldIrql);//释放自旋锁

 

      KeWaitForSingleObject(&Request.Event,

                            0,

                            KernelMode,

                            FALSE,

                            NULL);//等待事件变为受信态

 

      Page = Request.Page;

      if (Page == 0)

      {

         KEBUGCHECK(NO_PAGES_AVAILABLE);

      }//如果返回0,则表示没有可用的页面

      MmTransferOwnershipPage(Page, Consumer);讲解点A

      *AllocatedPage = Page;

      (void)InterlockedDecrementUL(&MiPagesRequired);

      return(STATUS_SUCCESS);

   }

  

     第三段是针对非“非置换页面”,如果也是碰到了当前系统的自由可分配页面小于初始的预留页面,就定义一个MM_ALLOCATION_REQUEST 结构变量。定义如下

typedef struct _MM_ALLOCATION_REQUEST

{

   PFN_TYPE Page;

   LIST_ENTRY ListEntry;

   KEVENT Event;

}

MM_ALLOCATION_REQUEST, *PMM_ALLOCATION_REQUEST;

if (!CanWait)

     意思是如果不能等待,则原子性的降低MiMemoryConsumers[Consumer].PagesUsed变量的值

     突然感觉如果这样解释,太繁琐,而且行文不流畅,故今后采用源程序后面注释+重点难点后面详解的方式。

讲解点A

     函数实现如下

MmTransferOwnershipPage(PFN_TYPE  Pfn, ULONG NewConsumer)

{

   KIRQL oldIrql;

 

   KeAcquireSpinLock(&PageListLock, &oldIrql);

   if (MmPageArray[Pfn].MapCount != 0)

   {

      DPRINT1("Transfering mapped page.\n");

      KEBUGCHECK(0);

   }

   if (MmPageArray[Pfn].Flags.Type != MM_PHYSICAL_PAGE_USED)

   {

      DPRINT1("Type: %d\n", MmPageArray[Pfn].Flags.Type);

      KEBUGCHECK(0);

   }

   if (MmPageArray[Pfn].ReferenceCount != 1)

   {

      DPRINT1("ReferenceCount: %d\n", MmPageArray[Pfn].ReferenceCount);

      KEBUGCHECK(0);

   }

   RemoveEntryList(&MmPageArray[Pfn].ListEntry);

   InsertTailList(&UsedPageListHeads[NewConsumer],

                  &MmPageArray[Pfn].ListEntry);

   MmPageArray[Pfn].Flags.Consumer = NewConsumer;

   KeReleaseSpinLock(&PageListLock, oldIrql);

   MiZeroPage(Pfn);

}

   可以看出Pfn就是页面下标,NewConsumer也就说用于UsedListPageListHead数组的哪一个元素,前面几个if都是判断。

   RemoveEntryList(&MmPageArray[Pfn].ListEntry);

   InsertTailList(&UsedPageListHeads[NewConsumer],

              &MmPageArray[Pfn].ListEntry);

   MmPageArray[Pfn].Flags.Consumer = NewConsumer;

    第一行意思是将该页面从页面链表中移除,第二行意思是在UsedPageListHeads[NewConsumer]后面插入该页面,第三行意思是将该页面的consumer改为新的consumer。

至此,MmRequestPageMemoryConsumer函数分析完毕。

 

 

 

既然理解了申请页面,那我们就看看释放页面

MmReleasePageMemoryConsumer(ULONG Consumer, PFN_TYPE Page)

{

   PMM_ALLOCATION_REQUEST Request;

   PLIST_ENTRY Entry;

   KIRQL oldIrql;

 

   if (Page == 0)

   {

      DPRINT1("Tried to release page zero.\n");

      KEBUGCHECK(0);

   }

    KeAcquireSpinLock(&AllocationListLock, &oldIrql);//进入时候,会提升优先级,旧的级别会保存在oldlrql中

   if (MmGetReferenceCountPage(Page) == 1)讲解点A  如果返回引用次数为1

   {

      (void)InterlockedDecrementUL(&MiMemoryConsumers[Consumer].PagesUsed);//该用途的页面数目减去一

                                      if(IsListEmpty(&AllocationListHead)||MmStats.NrFreePages<MiMinimumAvailablePages)//讲解点B

      {

         KeReleaseSpinLock(&AllocationListLock, oldIrql);

         MmDereferencePage(Page);

      }

      else

      {//讲解点C

         Entry = RemoveHeadList(&AllocationListHead);

         Request = CONTAINING_RECORD(Entry, MM_ALLOCATION_REQUEST, ListEntry);

         KeReleaseSpinLock(&AllocationListLock, oldIrql);

         Request->Page = Page;

         KeSetEvent(&Request->Event, IO_NO_INCREMENT, FALSE);

      }

   }

   else

   {  //如果被引用数大于1

      KeReleaseSpinLock(&AllocationListLock, oldIrql);

      MmDereferencePage(Page);//递减引用次数

   }

 

   return(STATUS_SUCCESS);

}

 

      

讲解点A

   MmGetReferenceCountPage(Page)函数实现如下

ULONG

NTAPI

MmGetReferenceCountPage(PFN_TYPE Pfn)

{

   KIRQL oldIrql;

   ULONG RCount;

 

   DPRINT("MmGetReferenceCountPage(PhysicalAddress %x)\n", Pfn << PAGE_SHIFT);

 

   if (Pfn == 0 || Pfn >= MmPageArraySize)

   {

      KEBUGCHECK(0);

   }

 

   KeAcquireSpinLock(&PageListLock, &oldIrql);

 

   if (MmPageArray[Pfn].Flags.Type != MM_PHYSICAL_PAGE_USED)

   {

      DPRINT1("Getting reference count for free page\n");

      KEBUGCHECK(0);

   }

 

   RCount = MmPageArray[Pfn].ReferenceCount;//保留该页面引用次数

 

   KeReleaseSpinLock(&PageListLock, oldIrql);

   return(RCount);//返回其引用次数

}

 

讲解点B

   从前面的申请页面可以知道,该页面挂入到了AllocationListHead,所以这里要判断下AllocationListHead是不是空,如果是空,代表该页面仅仅是个普通的可用页面,所以只需要MmDereferencePage(Page);减去其引用值。

 

讲解点C

    首先把AllocationListHead的元素提出来,然后通过CONTAINING_RECORD宏找到其所在的MM_ALLOCATION_REQUEST结构体首地址

   Request->Page = Page;

   KeSetEvent(&Request->Event, IO_NO_INCREMENT, FALSE);

    把页面付给request结构体的这个域(还记得申请页面函数中Page = Request.Page;

吗,明显,Page = Request.Page;前面是waitforsingleobject,这里setevent变成有信号,于是cpu就跳到页面申请函数中,而这里既然request得到了page值,那个函数里就把得到的值再赋给page)。

 

   

    

 

 

   

 

 

 

 

【电机学复习笔记】同步电机的特性及参数的求取 同步电机的主要特性包括:空载特性、短路特性、零功率因数负载特性、外特性和调整特性。 基于以上特性我们可以实现: 从空载特性和短路特性求同步电抗的不饱和值和短路比; 从零功率因数负载特性和空载特性确定保梯电抗(定子漏抗)和电枢反应电动势 阅读详情

相关推荐

深入解析LCD DRM驱动框架中的KMS与GEM机制

本文深入解析了Linux内核中DRM(Direct Rendering Manager)驱动框架的核心机制,重点剖析了KMS(内核模式设置)与GEM(图形执行管理器)的工作原理。KMS作为显示系统的总指挥,负责原子化地控制CRTC、Encoder、Plane等硬件资源,确保画面同步更新,避免撕裂;GEM则作为显存大管家,通过DUMB和PRIME机制高效管理图形缓冲区的分配、共享与同步。文章结合RK3568平台实战,阐述了如何利用这些机制优化显示性能,并提供了调试技巧与常见问题解决方案。

weixin_29188997的博客 386

Windows内核情景分析-内存管理2

内核对于物理页面的管理 物理内存的管理和使用是以页面为单位的,所以物理内存的管理实际上是对物理页面的管理。 在系统初始化过程中,内核构建一个PHYSICAL_PAGE结构的数组,并使全局变量MmPageArray指向这个数组,系统存在多少物理页面,该数组就有多大。页面号(Pfn)为下标,物理地址与Pfn有着固定的对应关系,物理地址右移12bit得到的值,即为对应的物理页面。结构如下: ...

airushaonian 779

手把手教你用LaTeX完成Elsevier期刊投稿:附完整文件上传清单与注意事项

本文提供了一份详尽的Elsevier期刊LaTeX投稿实战指南。文章系统拆解了从稿件准备、文件上传到最终提交的全流程,重点解析了Manuscript、Figure(s)等关键文件的上传逻辑与注意事项,并附有PDF生成前后的详细检查清单,旨在帮助研究者高效、规范地完成投稿,规避常见错误。

weixin_29300931的博客 486

PFN的基础概念

  一、PFN的基础概念      页帧:即CPU的分页,常见的是4KB大小的分页。操作系统分页即用页帧为最小单位。      我们之前在保护模式中所学习到的PTE,其指向的就是页地址+页属性。(这个页地址是物理地址,唯一的)      页帧编号:4KB,即1000h,每个页大小1000h,即说明每个页的首地址必须是1000h的整数倍。      又因为页帧有唯一的物理地址,将该地址 x/1000...

li123128的博客 1万+

君正T31x metartc集成测试

metartc为国内杨大侠部分开源的一款用于嵌入式领域webrtc库,它与谷歌官方webrtc相比,编译到君正平台的可执行文件仅有5M即可实现webrtc的通信。1. 目前实现的是基于开源版v5.0-b0版本做的简单修改,官方的好几个版本都多少缺点东西,我这里给整理了一下。目前是局域网连接的webrtc,后续尝试走stun和turn试一下NAT穿越的效果。

fsmpeg的博客 3155

程序化广告行业(23/89):深度剖析广告效果评估指标

大家好,我一直希望能和大家一起在技术领域不断探索、共同进步。在之前的文章中,我们了解了程序化广告中腾讯的业务布局和广告效果评估的基础概念,今天让我们进一步深入剖析广告效果评估的各项指标,这对理解程序化广告的运作机制至关重要

yyy173611的博客 4862

windows内核情景分析笔记---虚存向物理页面的映射

既然懂了虚存和物理存储的管理,下面谈谈虚存向物理存储的映射 首先看第一个函数 NTSTATUS NTAPI MmCreateVirtualMapping(PEPROCESS Process,                        PVOID Address,                        ULONG flProtect,                    

lycommand的专栏 1765

Docker版OnlyOffice中文字体配置全攻略:从字号调整到字体添加

本文详细介绍了在Docker版OnlyOffice中配置中文字体和调整字号的完整方案。通过容器内操作和配置文件修改,实现中文标准字号映射及思源、阿里巴巴等优质字体的集成,提升文档排版的规范性和专业性。特别针对企业级部署提供了性能优化建议和常见问题解决方案。

weixin_28309571的博客 136

网页浏览器的“内核”与“外壳”[z]

注:现在无论在工作中还是在生活中浏览器都占据着非常重要的作用,但是浏览器大致有哪些分类,什么是内核,什么是外壳这些问题却可能不是很清楚,正好在优快云上看到这篇文章,推荐给大家看看。另外还有一个比较简洁的介绍,也贴过来同大家分享。 ============================================================ 浏览器最重要或者说核心的部分是“Renderi...

liudaoru - 悟 379

【迁移学习综述】

迁移学习的目标是将某个领域或任务上学习到的知识应用到不同的但相关的领域或问题中。迁移学习的研究来源于一个观测:人类可以将以前的学到的知识应用于解决新的问题,更快的解决问题或取得更好的效果。迁移学习被赋予这样一个任务:从以前的任务当中去学习知识(knowledge)或经验,并应用于新的任务当中。换句话说,迁移学习目的是从一个或多个源任务(source tasks)中抽取知识、经验,然后应用于一个目标领域(target domain)当中去。

afadgas的博客 4318

从零搭建openEuler ARM64开发测试环境:手把手教你用libvirt+KVM配置虚拟机(含VNC远程安装)

本文详细介绍了如何在ARM64平台上从零搭建openEuler开发测试环境,涵盖libvirt和KVM配置虚拟机的完整流程,包括环境准备、存储配置、网络优化、XML配置详解以及VNC远程安装。特别针对华为欧拉(openEuler)系统进行了优化,帮助开发者快速构建高效的ARM架构虚拟化环境。

weixin_30545945的博客 586

[windows内核]PDE&PTE

Cr3 描述: 在所有的寄存器中,只有Cr3存储的是物理地址,其它寄存器存的都是线性地址 Cr3所存储的物理地址指向了一个页目录表(PDT) 在Windows中,一个页的大小通常为4KB,即一个页可以存储1024个页目录表项(PDE) 下面是手册中的描述在第3卷2.5 CONTROL REGISTERS 物理页结构图: 注意:但其实上面这种结构方式是错误的,这个以后再解释,先这样理解 PDE(页目录表项) 描述: 页目录表(PDT)的每一项元素称为页目录表项(PDE) 每个页目录表项指向一个页表(

r250414958的博客 3820

目标检测YOLO实战应用案例100讲-基于数据融合的SAR图像中海上目标检测与跟踪(中)

本文使用的数据集为欧空局(European Space Agency, ESA)提供的Sentinal-1 数据集,Sentinel-1是欧洲“哥白尼计划”的SAR卫星机群,主要是用于陆地和海 洋服务的极地轨道全天候昼夜雷达成像任务[ 34]。Sentinel-1A于2014年4月3日发 射升空,Sentinel-1B于2016年4月25日发射升空,每颗卫星都携带C波段SAR, 共同提供地球表面的全天候、昼夜图像。

qq_36130719的博客 355

windows 内核情景分析

原文很长;先转部分过来,有时间看一下; 一 windows 内核情景分析---说明 说明 本文结合《Windows内核情景分析》(毛德操著)、《软件调试》(张银奎著)、《Windows核心编程》 、《寒江独钓-Windows内核安全编程》、《Windows PE权威指南》、《C++反汇编与逆向分析揭秘》以及 ReactOS操作系统 (V0.3.12)源码,以《Windows内核情景分析》为蓝本,对Windows内核重要框架、函数 、结构体进行解析 由于工程庞大,我能理解到的只是冰山一角,但本文.

bcbobo21cn的专栏 1931

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Windows内核情景分析-采用开源代码ReactOS下册高清pdf版:深入解析系统核心

Windows内核情景分析-采用开源代码ReactOS下册高清pdf版:深入解析系统核心 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 《Windows内核情景分析-采用开源代码ReactOS(下册)高清pdf版》是一份深入剖析Windows内核机制的宝贵资源。本书以ReactOS的开源代码为基础,详细解读了Windows操作系统的内存管理、进程调度、进程间通信以及设...

gitblog_06788的博客 477

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Windows内核情景分析-采用开源代码ReactOS(下册)高清pdf版

Windows内核情景分析-采用开源代码ReactOS(下册)高清pdf版 去发现同类优质开源项目:https://gitcode.com/ 本书详细介绍了采用开源代码ReactOS的Windows内核各个方面的结构、功能、算法与具体实现。以下是对该资源文件的详细介绍: 内容概述 全书分为“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个章节,全面剖析了Windows内核的构成和工作机制。...

gitblog_06702的博客 529

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

windows内核情景分析--内存管理(精细分析系统物理内存使用)

32位系统中有4GB的虚拟地址空间   每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间)   各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同   虚拟地址如0x11111111, 看似这8个数字是一个整体,其实是由三部分组成的,是一个三维地址,将这个32位的值拆开,高10位表示二级页表号,中间10位表示二级页表中的页号,...

kingswb的博客 1271

《Windows内核情景分析》系统空间缓冲区管理

    用户空间是从“堆(heap)”分配缓冲区的,内核中是从“池(pool)”中分配的。     用户空间的堆是属于进程的,而内核中的池则是全局的,属于整个系统。内核中池有两种:PagedPool,所占页面可以倒换的,NonPagedPool,所占页面是不可倒换的,每个页面都占着物理内存。 ntdll!_POOL_TYPE NonPagedPool = 0 PagedPo

strongxu的专栏 2788

Windows内核情景分析-概述

现在的Windows 现在的windows内核包含了两大部分,一部分是本来意面上的操作系统内核,另一部分则是移到了内核中的视窗服务,前者对应ntoskrnl.exe后者win32k.sys;后者部分为了保证效率。windows操作系统包含多个子系统,最常用就是windows子系统;貌似现在的windows10提供了linux子系统,所以在windows上可以运行linux的程序。 现代意...

airushaonian 3869

Windows内核情景分析 下 pdf

下载地址:网盘下载[图书简介]本书通过分析reactos的源代码介绍了windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有reactos的源代码(以及部分由微软公开的源代码)作为依据,使读者能深入理解windows内核的方方面面,也可以使读者的软件开发能力和水...

weixin_30642869的博客 641

《Windows内核情景分析》内存区间的动态分配

    物理页面是以PHYSICAL_PAGE代表的。MmPageArray指向PHYSICAL_PAGE的数组(MS是在ReactOS中是这样,真正Windows内核找不到PHYSICAL_PAGE结构,不知道是未公开还是策略不一样)    物理内存有三种   1.已分配的内存队列:存放正在被使用的内存   2.待清理的内存队列:存放已被释放的内存,但是这些内存未被清零   3.空闲队列

strongxu的专栏 2795

Windows内核情景分析 上 pdf

下载地址:网盘下载[图书简介]本书通过分析reactos的源代码介绍了windows内核各个方面的结构、功能、算法与具体实现。全书从“内存管理”、“进程”、“进程间通信”、“设备驱动”等多个方面进行分析介绍,所有的分析都有reactos的源代码(以及部分由微软公开的源代码)作为依据,使读者能深入理解windows内核的方方面面,也可以使读者的软件开发能力和水...

weixin_30765475的博客 640

毛德操老师重磅著作:Windows 内核情景分析--采用开源代码ReactOS(上、下册)

毛德操老师重磅著作:Windows 内核情景分析--采用开源代码ReactOS(上、下册) 详情请查看:http://www.china-pub.com/195486 编辑推荐 历时3年,近1500页篇幅,毛德操老师重磅著作!市面上唯一一本讲述Windows内核源代码分析的图书!具有高度应用价值与实用价值!中国开源软件推进联盟 陆首群、中国工程院院士 倪光南联手推荐! 【内容简介】本书通过...

weixin_30325487的博客 856

Windows内核情景分析学习笔记(四)

内存管理 物理内存 //申请一页物理地址并挂入到对应的链表 PFN_NUMBER MmAllocPage(ULONG ConsumerType); 首先判断FreeZeroedPageListHead链表是否为空,如果不为空则从FreeZeroedPageListHead取下一个节点,并修改该节点属性为对应类型并挂入对应的链表中,如果FreeZeroedPageListHead为空,则判断FreeUnzeroedPageListHead是否为空,如果不为空,则跟上述一样不过需要多加一步给页面清零的操作,如

weixin_44356908的博客 312

windows内核情景分析--内存管理

32位系统中有4GB的虚拟地址空间 每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同 虚拟地址如0x11111111,  看似这8个数字是一个整体,其实是由三部分组成的,是一个三维地址,将这个32位的值拆开,高10位表示二级页表号,中间10位表示二级页表中的页号,最后12位

maomao171314的专栏 2613

[3]windows内核情景分析--内存管理

32位系统中有4GB的虚拟地址空间 每个进程有一个地址空间,共4GB,(具体分为低2GB的用户地址空间+高2GB的内核地址空间) 各个进程的用户地址空间不同,属于各进程专有,内核地址空间部分则几乎完全相同 虚拟地址如0x11111111,  看似这8个数字是一个整体,其实是由三部分组成的,是一个三维地址,将这个32位的值拆开,高10位表示二级页表号,中间10位表示二级页表中的页号,最后12位...

jadeshu的博客 759
上一篇: <学习笔记>Windows驱动开发技术详解__Windows内存管理
下一篇: windows内核情景分析笔记---虚存向物理页面的映射
lycommand
博客等级 码龄14年 31粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值