操作系统学习笔记(三) windows内存管理
//系统物理页面是由 (Page Frame Number Database )简称PFN数据库来进行管理,实际上是一个数组,每个物理页面都对应一个PFN项。
进程的地址空间是通过VAD(Virtual Address Destriptor)管理。每个进程都有一个AVL树来保存这些VAD节点,来记录使用的地址以及属性等。

进程的内存地址属性分为保留和提交,保留即是使用时候才实际分配内存,而提交时需要交割对现空间的,需要分配物理页面的,然后将两者关联起来。
我们从NtAllocateVirtualMemory函数入手
首先检查函数参数的正确性,并且对涉及到的地址进行地址对齐,再计算实际需要的空间长度。
接下来,获取需要操作的进程对象和进程对象的地址AVL树。
如果改地址空间已经分配,在地址AVL树中找到,那么根据此次调用函数的参数设置地址空间的属性,进行同属性空间的分割合并。
如果空间未在地址AVL树中找到合适的或者地址未指定,那么就调用MmCreateMemoryArea()分配一块空间并且插入到AVL树中。
创建结束。
//================================================
//内存映射对象 section object
进程的用户空间映射到物理页面,一般来说只属于该进程。但是一个物理页面也可以映射到多个进程中,供多个进程共享访问。使用内存映射对象可以达到这个目的。
而使用内存映射对象将文件映射到内存地址空间中,像访问内存一样访问文件,既简化文件读写操作,也提升了性能。
NtCreateSection()->MmCreateSection()
根据参数的不同确认是映射系统页面文件,或者是映射映像文件,或者是映射数据文件。
以映射数据文件为例,创建section对象,调用ObReferenceObjectByHandle()获取文件对象,使用IoQueryFileInformation()获取文件信息,映射区大小和文件大小必须符合。
创建一个映射段Segment,配合Segment的参数,说明此段对应文件中起始偏移空间。
(不同于映像文件,数据文件只有一个段Segment),创建结束。
//================================================
创建内存映射对象后,需要调用NtMapViewOfSection()将内存映射映射到进程中。
使用ObReferenceObjectByHandle()获取Section对象 Process对象
->MmMapViewOfSection()->MmMapViewOfSegment();映射映射区中的段
创建进程内存空间 填充参数 并且插入到进程的地址AVL树中.
//==============================================
这里记录一个windows驱动的博客 由于作者禁止任何形式的转载 所以仅仅写下地址
学习的时候切过去看
http://www.cnblogs.com/gussing/archive/2011/01/18/1938140.html
操作系统学习笔记(三) windows内存管理的更多相关文章
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- 【cocos2d-x 3.x 学习笔记】对象内存管理
内存管理 内存管理一直是一个不易处理的问题.开发人员必须考虑分配回收的方式和时机,针对堆和栈做不同的优化处理,等等.内存管理的核心是动态分配的对象必须保证在使用完成后有效地释放内存,即管理对象的生命周 ...
- JVM学习笔记一:内存管理
参考资料 本文参考:<深入理解Java虚拟机>作者 周志明 知识产权归作者所有 走近java java组成部分:java语言.各平台虚拟机.Class文件结构.java api 类库.第三 ...
- Spring学习笔记三:Bean管理
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6775827.html 一:如何使用Spring获取对象 1:定义bean类:要按照注入方式来定义对应的bea ...
- kvm虚拟化学习笔记(三)之windows kvm虚拟机安装
KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...
- 操作系统学习笔记----进程/线程模型----Coursera课程笔记
操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...
- Windows内存管理[转]
本文主要内容:1.基本概念:物理内存.虚拟内存:物理地址.虚拟地址.逻辑地址:页目录,页表2.Windows内存管理3.CPU段式内存管理4.CPU页式内存管理 一.基本概念1. 两个内存概念物理内存 ...
- 全面介绍Windows内存管理机制及C++内存分配实例
转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...
- 操作系统学习笔记5 | 用户级线程 && 内核级线程
在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...
随机推荐
- psi
purchase 采购sales 销售inventory 库存 outstock/instock/inventory taking outstock/instock/inventory 出库 入库 盘 ...
- 性能测试day04_性能监控
好了,今天接着来学习性能,在今天开始前,我今天在网上又看到了理发师经典模型,这里稍微提一下,详情可以百度哈,下面这张图是网上找到的经典场景性能相关的图,大致说明下: 这张图中展示的是1个标准的软件性能 ...
- Android 开发 Handler的基本使用
转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/72677227 深入理解Handler.Looper.Messagequeue ...
- 3.1链表----链表(Linked List)入门
在分析链表之前,我们先来对之前的动态数组.栈.队列总结一下: (1)底层依托于静态数组 (2)依靠resize解决固定容量问题 (3)是一种假的的动态数据结构 1.什么是链表 可以从以下两个部分来理解 ...
- [python]Generators
generators(生成器)是python提供的一种机制,可以让函数一边循环一边计算,通常函数是一遍执行,而生成器可以在执行中间交出变量,下次调用时从交出变量的地方重新开始,这种机制通过yield关 ...
- Django之如何预防csrf功能的方式 form提交与ajax提交
1. 什么是csrf认证: 主要是防止别人恶意登录你的账户信息用的: 2. csrf认证在django的实现方式: 分为两种, 一种是from表单提交的方式,另一种是ajax提交实现方式 前端: &l ...
- python爬虫之scrapy
架构概览 本文档介绍了Scrapy架构及其组件之间的交互. 概述 接下来的图表展现了Scrapy的架构,包括组件及在系统中发生的数据流的概览(绿色箭头所示). 下面对每个组件都做了简单介绍,并给出了详 ...
- jqueryValidate
参数详情可参见: http://www.runoob.com/jquery/jquery-plugin-validate.html 基本使用: /** 数据保存前校验 **/ $("#use ...
- 编织织物的knit course direction and knit wale direction
来自:http://www.definetextile.com/2013/04/course-wale.html
- 深入剖析GPU Early Z优化
最近在公司群里同事发了一个UE4关于Mask材质的优化,比如在场景中有大面积的草和树的时候,可以在很大程度上提高效率.这其中的原理就是利用了GPU的特性Early Z,但是它的做法跟我最开始的理解有些 ...