Win32之内存管理

一丶虚拟内存和物理内存

  我们知道每个应用程序都有自己独立的4GB空间.  假设A进程的 地址123 存储了10  那么B进程的123地址 存储了20

那么它们两个是互不影响的. 但是值是真实存在的. 而值是存储在物理内存的.如下图所示.

根据上图所示. 我们可以分清虚拟内存跟物理内存. 如果我们更改了物理内存的值.那么就会影响A进程或者B进程.

当然如果你学过内核驱动.就知道内核驱动读写就是你这个意思.我也有写过一个简单的内核驱动读写.详情请看内核驱动目录.

所以说虚拟内存是假的.当用的时候才会存储在物理内存

二丶物理内存的管理.

  物理内存是使用4K的方式来管理的.也就是4096个字节.也成为一页.所以以后我们使用API的时候. 大多数都会发现跟页相关.这也是因为管理是页方式管理的原因.

如下图所示

  

进程A 的数值放到物理页中.

而我们进程传统意义上说是由4GB 其实分为高低2G. 高两G是给内核使用的.所以用户只能使用低2G. 而低两G也有高低64k不能使用的. (学过内核想使用自己构造即可)

如下图所示:

用户模式可以使用的内存就是橘黄色的位置.但是没有对应的物理页.当我们申请了内存才会有对应的物理页

如果想看三环程序使用的物理页.可以通过双机调试. 调试我们的程序. 使用Windbg.

1.首先使用命令  !Process 遍历出我们程序Exe的地址.

2.使用   dt EPROCESS  遍历出的地址  得到这个应用程序的EPROCESS结构.

3. 得到EPROCESS + 11c (也就是成员)VadRoot的偏移. 使用!VAD 地址. (EPROCESS + 地址)  可以得出这个EXE使用的内存物理页.

如果不会使用也无所谓. 观看下图:

这个图说明了 我们的线性地址10开始 - 10结束. 因为物理页是4K 存储的.所以10 代表的就是1000  后面大小是1000 所以下一个位置是20开始也就是 2000线性地址.

三丶物理页大小.  

  物理页大小根据你的物理内存.大小来设置的.也就是说你的物理内存多大就可以换算出来.我们可以通过任务管理器查看你的物理页总数.

例如下图:

  

我们换算一下. 1048048 / 4  转换为16进制 则是可以有多少个物理页. 例如我们例子则是 3FF7C 个物理页.

我们也可以使用Windbg dd一下查看. 只需要DD这个变量即可.

如果我们的物理页超过了.那么操作系统还支持使用硬盘来当物理内存.

具体设置

计算机属性 -> 高级系统设置 -> 高级 - > 性能设置 -> 高级 -> 虚拟内存更改.

而这快内存会在windows上保存着. 文件名是 pagefile.sys 一般是C盘的隐藏文件.我们可以通过

EveryThing搜索一下. 

三丶操作系统可识别内存

  我们可用的内存就是 我们算出的物理页的大小 + 虚拟内存的大小.但是操作系统可识别的不是这么大的.

也就是说我们物理内存条加了好多好多.那是一点用没有.

  32位系统下能识别64G内存. winxp只能识别4G内存. 具体知识需要学习Windows内核中的页表 (PTE PDE) 页目录表 等才能清楚. 不多说.只需要了解即可.

Win32之内存管理之虚拟内存跟物理内存的更多相关文章

  1. Linux内存管理 (1)物理内存初始化

    专题:Linux内存管理专题 关键词:用户内核空间划分.Node/Zone/Page.memblock.PGD/PUD/PMD/PTE.lowmem/highmem.ZONE_DMA/ZONE_NOR ...

  2. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  3. MySQL 调优基础(二) Linux内存管理

    进程的运行,必须使用内存.下图是Linux中进程中的内存的分布图: 其中最重要的 heap segment 和 stack segment.其它内存段基本是大小固定的.注意stack是向低地址增长的, ...

  4. [内存管理]linux内存管理 之 内存节点和内存分区

    Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理.为此,Linux有了内存节点.内存区.页框的概念,这些概念也是一目了然的. 内存节点:主要依据CPU访 ...

  5. Linux内存管理(一)

    Linux内存管理之一:基本概念篇 物理地址.线性地址(虚拟地址)和逻辑地址:阐述段式管理和页式管理基本概念:Linux操作系统内存管理和虚拟内存概念:为内核开发做一个基础铺垫. 内存是linux内核 ...

  6. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  7. 【转载】浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多? 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在 ...

  8. 全面介绍Windows内存管理机制及C++内存分配实例

    转自:http://blog.csdn.net/yeming81/article/details/2046193 本文基本上是windows via c/c++上的内容,笔记做得不错.. 本文背景: ...

  9. 从内存管理原理,窥探OS内存管理机制

    摘要:本文将从最简单的内存管理原理说起,带大家一起窥探OS的内存管理机制,由此熟悉底层的内存管理机制,写出高效的应用程序. 本文分享自华为云社区<探索OS的内存管理原理>,作者:元闰子 . ...

随机推荐

  1. 20个Linux防火墙应用技巧

    转载 1.显示防火墙的状态 以root权限运行下面的命令: # iptables -L -n -v 参数说明: -L:列出规则. -v:显示详细信息.此选项会显示接口名称.规则选项和TOS掩码,以及封 ...

  2. python 中爬虫 content和text的区别

    一直在想requests的content和text属性的区别,从print 结果来看是没有任何区别 import requests headers = { "User-Agent" ...

  3. gitlab 之 项目管理

    首先git是什么? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git的读音为/gɪt/. Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常 ...

  4. OpenCV Mat格式存储YUV图像

    YUV图像用的比较多,而且YUV图像的格式众多(YUV格式可以参考YUV pixel formats),如何用OpenCV的Mat类型来存储YUV图像也是经常遇到的问题. 对于YUV444图像来说,就 ...

  5. 学习Python第六天

    今天我们讲讲数据类型中的集合,博客写得有点糙,后续应该要进行优化优化了........ 集合:无序,不重复的数据组合,主要作用:去重,把一个列表变成集合,就自动去重了 基本语法:S = {1}类型为集 ...

  6. Python学习笔记-函数基础

    函数基础 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 为什么使用函数:减少重复代码.使程序变的可扩展使程序变得易维护 1.定义一个函数 #定 ...

  7. day_5字符串和列表的各种操作方法

    字符串类型: 字符串的定义是可以有多种引号嵌套 定义字符串是以开头的引号然后匹配和第一个引号相同的引号,所以当字符串中间出现和第一个引号相同的引号就会出错,这个时候就可以选择别的引号进行创建字符串,或 ...

  8. 【转】odoo nginx 配置

    ## OpenERP backend ## upstream odoo { server 127.0.0.1:8069 weight=1 fail_timeout=0; } upstream odoo ...

  9. Html/CSS前端如何实现文字边框阴影

    上次我们聊了<Html5前端如何实现文字阴影>,其实在开发中现在对于阴影效果的使用已经越来越广泛了,那么今天我们就来说一说用同样的手法实现边框阴影. 一.边框阴影box-shadow 边框 ...

  10. lvs、nginx、HAProxy、keepalive工作原理

    1. lvs.nginx.HAProxy.keepalive工作原理 1.1. 前言 遇到了负载均衡和高可用选型问题,我觉的有必要好好理解下lvs,nginx,haproxy和keepalive的区别 ...