探索Windows的内存机制

深入探索Windows内存管理与缓存机制 本文深入分析了Windows操作系统中内存管理器和缓存管理器的工作原理,包括内存写操作、缓存写入策略、写限流机制以及磁盘I/O记账。通过实验和代码示例,揭示了缓存管理器如何优化系统性能,并应对内存变化和I/O操作。文章还探讨了在不同条件下,如何调整缓存管理器的行为以适应低速磁盘和动态内存环境。 阅读详情
 内存是操作系统的核心部分,所以我们非常有必要了解内存的分配机制。在DOS下,访问内存的指针是用段地址:偏移量来表示,所有程序共用一个内存空间,由低向高分配内存空间,所以任何程序都可以随便修改内存中的数据,包括不属于自己程序的内存空间和中断向量表。而且所有程序被局限在1M的基本内存(Base Memory)中,不能直接访问扩充内存。对于Windows下的程序来说,它所访问的内存地址不再是真实的。而是虚拟的、独立的全平坦式(flat)的内存空间。如一个32位的程序可访问内存地址是0x00000000到0xffffffff(4G),指针不再存储段地址。所谓独立,指的是当进程A加载到内存0x400000处时,进程B加载到内存的地址时一样是0x400000,两者的地址空间是相互独立的。程序访问内存地址时,由Windows自动换算为真实的内存地址。这样,程序A是无法直接访问程序B的内存空间的,也就提高了系统的稳定性。
    其实,在这4G的内存地址中,我们能使用的内存地址不到一半。我们的程序是无法分配到0x80000000以上的内存地址的,这2G的内存地址都是被系统占用,是只读的。如果一个应用程序企图对大于0x80000000的内存地址进行写操作,则会产生"非法操作"。例如: char *pstr; if(pstr!=NULL) *ptr='a'; 这里声明了一个指针,在没有对其初始化时,它指向0xCCCCCCCC(这里很奇怪不知为什么所有没初始化的变量,其值都为0xCCCCCCCC),所以不为空,因而执行 *pstr=“a” 。由于0xCCCCCCCC在0x80000000以上,产生了一个“非法操作”,这就是有的朋友常犯的错误。
    在Win2000中,用户可以使用0x80000000以上的1G地址(在Boot.ini 中加上参数 /3G) 不过似乎对于普通程序员来说,是没有什么意义的。 Win9x内存中与Win2000的内存分配略有不同。在Win98下,应用程序可使用的内存是从0x400000开始,而在Win2000下,是从0x100000开始。可是加载应用程序时,都是加载到0x400000 。试试这段代码: BYTE buff[0x300]; DWORD dwRead; ReadProccessMemory(GetCurrentProcess(),(PVOID)0x400000,buff,0x300,&dwRead); 请把Buff输出到文件中,你会发现正好是你的应用程序的文件头。
    Windows的内存分配是以页(page)为单位(与磁盘的扇区很相似),每一页的大小因CPU而异。我们常用的PC机是x86构架,每页为4096字节,可以用GetSystemInfo()函数得到页面大小。一个内存块由多个页面组成。每个页都有一个访问属性: PAGE_NOACCESS 不可访问 PAGE_READONLY 只读 PAGE_READWRITE 读写 PAGE_EXECUTE 可执行 …… 我们可以用: DWORD VirtualQuery( LPCVOID lpAddress, // 内存地址 PMEMORY_BASIC_INFORMATION lpBuffer, // 内存地址信息 DWORD dwLength // lpBuffer 的大小,也就是结构 MEMORY_BASIC_INFORMATION 的大小 ); 来得到某个内存块的状态。使用 VirtualQueryEx() 还可以访问其它进程的内存分配信息。要注意的是这两个函数是得到一个内存块的信息,而不是一个页的信息。在Win9x,当对一个低于0x80000000地址进行写操作时,即使此内存地址为只读(PAGE_READONLY)或是此内存根本就没有分配,Win9x一般也不会报错,这样使得Win9x兼容性好了些,但也使Win9x非常脆弱。在Win2000下则严格遵守页面属性规则,如果你企图对非写属性的内存地址进行操作时,会立刻被中断。这就是为什么很多程序能在Win9x下运行,而转到Win2000下就出现非法操作的原因。虽然我们不能直接读取其它进程的内存空间,但Windows也还是给我们留下了一个后门: ReadProcessMemory()、WriteProcessMemory()。这两个函数可以直接对其它进程的内存进行读写操作。也许你会发现,如果Windows同时启动两次一个相同的应用程序(如同时启动两个Visual Studio),第二次起动的速度明显快于第一次。这是因为,虽然每个程序的内存空间是独立的,但它们有一部分内存是只读的,是可以几个进程共享包括放在0x80000000内存空间以上的系统服务。Windows提供这个功能可以很有效的节省内存空间,提高系统的效率。谈到这里,我们又有问题了,如何在两个进程之间的正常的进行数据交换,而不是用ReadProcessMemory的WriteProcessMemory去强行读写呢? 常用的方法是用MapViewOfFile()把文件映射到内存中,其它进程可以用OpenViewOfFile()来访问,或是用Windows的DDE数据传输协议。还有一种访问是放到DLL中,通过: #pragma data_seg("AllUser") ....//数据 #pragma data_seg() #pragma comment(linker,"/SECTION:AllUser,SRW") // SRW 为共享读写 把某个内存块设置为公用内存,那么就可象使用全局变量一样访问此内存空间。
    如果有这样一个问题,下面的Struct 在内存中占用多大的字节。 struct{ char a[2]; int b; }abc; 也许你会这样回答,在Windows下Char占一个字节,Int占4个字节,所以是6个字节。其实如果我们用Sizeof得到的大小是8个字节。因为在Windows下对结构变量分配内存空间缺省大小是8的倍数。它不再象DOS一样按本身结构的大小分配,这是由于CPU访问对齐的数据速度要比访问非对齐数据速度要快好几倍。如果你的数据量太大,希望按真实大小对结构分配空间,则可以设置 Project => Setting => C/C++ => Category => Code Generation => struct member alignment 将其设为1就行了。分配非内存对齐的变量同样也会影响执行速度,如: char *pstr=(char *)malloc(5); DWORD *pdw=(DWORD *)(pstr+1); PDW指针指向的就是一个奇数地址,对PDW操作时就很费时。
    小结:对于一个VC程序员来说,很多程序的错误都出现在内存分配上,如未经检查就使用一个空指针等,如果能很好的管理、分配你程序的内存空间,你的程序将会少去一些不必要的错误。
深入探索Windows内核:从WRK开始 分页和分段是内存管理的两种基本技术,它们以不同的方式管理物理和虚拟内存。分页将虚拟内存空间划分为固定大小的块,称为“页”,物理内存被划分为同样大小的“页框”。这样,每个进程虚拟地址空间中的页可以映射到任意一个物理页框中。分页机制使得内存的分配更加灵活,同时还可以利用页表来实现内存访问的权限控制。分段则根据数据的逻辑关系将内存划分为不同的段。例如,程序的代码段、数据段和堆栈段等。分段的大小是由数据结构的大小决定的,不必是固定的,这样可以更好地适应程序的逻辑结构。 阅读详情

相关推荐

win7系统32位内存限制完美破解:真正使用4G内存

32位的Windows7系统怎么使用4G内存?把使用时间长的笔记本扩充到了4G内存,但是因为系统是32位的,导致不能完美的使用4G内存

windows内存管理操作

堆内存,虚拟内存 , 文件映射

ylh的博客 2151

全部介绍windows内存的分配机制

主要用于介绍window的内存机制,可以通过辅助windows情景分析进行开发学习。

Windows内存工作原理详解

Windows内存管理系统是操作系统的核心组件,负责物理内存和虚拟内存的管理、分配和保护。现代Windows系统(Windows 10/11)采用基于虚拟内存的复杂内存管理机制,支持32位和64位架构。

m0_63331248的博客 1281

Phantom Omni的力与力矩操作

*本说明为对Phantom Omni的力与力矩操作 ****************虚拟夹具的力读取与控制************************ 1、首先力的读取要声明【全局变量】 hduVector3Dd F;//三维矢量力(x,y,z三个方向的力) 2、对力的控制可以采用配置函数Set()与Get()函数; 3、对力觉的控制或读取操作需要放到【回调帧】开始与结束之间,如例子

xuliang355的博客 2562

利用wolcmd.exe批处理执行远程唤醒

代码如下: @echo off cls :check if exist wolcmd.exe goto targetmac echo 缺少wolcmd.exe echo. goto end :targetmac cls echo -------------------------------------------------------- echo 目标主机PC-01地址:40235678A...

Chriseo的博客 6949

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

(一):进程空间   本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。 本文目的: 对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。 1.      进程地址空间 1.1地址空间 ·        32|

zhujunwsk的专栏 3143

【技术解析】Point-NeRF:如何通过点云优化加速神经辐射场渲染

本文深入解析了Point-NeRF技术,它通过引入3D点云作为几何先验,有效解决了传统神经辐射场渲染速度慢的痛点。该方法利用神经点云构建局部辐射场,结合点剪枝与生长策略进行动态优化,在保证高渲染质量的同时,实现了高达30倍的训练加速,为高效3D场景重建提供了新范式。

weixin_29159127的博客 268

Windows的内存管理机制

内存管理方式建议大家多看看计算机组成原理,回过头来看windows的内存管理机制就能更好的明白windows为啥这么做~而不是直接让你操作物理内存

Albert_weiku的博客 4666

CPU系统级验证——测试激励——imperas公司riscvOVPsimPlus文件分析

本分析重点关注该repo向量扩展部分。 1. repo简介 该repo是指令集验证的仿真环境包括,大部分是指令集的测试用例,也包含了一些模拟器,如riscvOVPsimPlus。 主要介绍的是riscvOVPsimPlus指令集模拟器,riscvOVPsimPlus(下面统称ISS)是imperas公司在riscvOVPsim基础上扩充了向量扩展的指令集模拟器,该repo于今年9月份部分开源 什么叫部分开源呢? 首先该repo必须在imperas官网注册下载,而且必须是企业用户(免费邮箱人家瞧不上.

知识,既贵,又便宜。 4460

CLIP-Count代码配置以及踩坑记录

CLIP-Count代码配置以及踩坑记录

学术菜鸡 1011

Windows管理内存的3种方式——堆、虚拟内存、共享内存

本文主要介绍了Windows管理内存的3种方式——堆、虚拟内存、共享内存

Tandy12356_的博客 5751

DySAT+: Enhancing Dynamic Graph Representation Learning with Multi-Head Self-Attention and Temporal-

本文深入探讨了DySAT+模型在动态图表示学习中的创新应用,通过多头时空注意力机制和层级信息融合策略,有效解决了动态图数据中的时间维度信息捕捉和结构演变动态适应问题。该模型在社交网络异常检测和金融交易网络分析等场景中表现出色,显著提升了预测准确率和响应速度。

weixin_29035405的博客 336

探索 Windows 2000 的内存管理机制

翻译: Kendiv( %20%20);%20document.write(%20addy78904%20);%20document.write(%20%20);%20//-->%20"> <!-- var prefix = ma + il + to; var path = hr + ef + =; var addy78904 = fcczj

2854

rk3576 适配摄像头 (mipi 五摄)

在RK3576上实现五路CSI摄像头方案,核心思路是充分复用其视频输入接口,并通过巧妙的软件配置来实现。

weixin_35723192的博客 183

75、CAN总线收发器共模范围扩展与抗干扰芯片选型

摘要:本文探讨了CAN总线收发器共模范围扩展与抗干扰芯片选型的关键问题。作者通过风电场的实际案例,指出共模电压超标会导致总线故障甚至芯片损坏。文章分析了不同芯片(如SN65HVD1050、TJA1043等)的共模范围特性,并提供了电路设计建议,包括正确使用共模扼流圈和终端电阻。最后强调选型时要结合实际工况,在共模范围、功耗、速度和成本之间取得平衡,普通工业现场建议选择正负36V共模范围的芯片。

2401_88858637的博客 53

[转]探索Windows的内存机制

内存是操作系统的核心部分,所以我们非常有必要了解内存的分配机制。在DOS下,访问内存的指针是用段地址:偏移量来表示,所有程序共用一个内存空间,由低向高分配内存空间,所以任何程序都可以随便修改内存中的数据,包括不属于自己程序的内存空间和中断向量表。而且所有程序被局限在1M的基本内存(Base Memory)中,不能直接访问扩充内存。对于Windows下的程序来说,它所访问的内存地址不再是真实的。而是

wuhran的Blog-C++,Linux,MySQL,PHP 1004

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

探索Windows的内存机制http://www.sjhf.net/Article/PRODOC/200603/160.html

内存是操作系统的核心部分,所以我们非常有必要了解内存的分配机制。在DOS下,访问内存的指针是用段地址:偏移量来表示,所有程序共用一个内存空间,由低向高分配内存空间,所以任何程序都可以随便修改内存中的数据,包括不属于自己程序的内存空间和中断向量表。而且所有程序被局限在1M的基本内存(Base Memory)中,不能直接访问扩充内存。对于Windows下的程序来说,它所访问的内存地址不再是真实的。而是

xu的blog 1546

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

深入SQL SERVER 2000的内存管理机制(一)

深入SQL SERVER 2000的内存管理机制  http://msdn.microsoft.com/data/default.aspx?pull=/library/en-us/dnsqldev/html/sqldev_01262004.asp Ken HendersonMicrosoft Corporation备注:Ken Henderson 从开发者的角度来阐述了

2042

滴水逆向培训高级班资源介绍:深入探索Windows底层机制的利器

滴水逆向培训高级班资源介绍:深入探索Windows底层机制的利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在计算机科学领域,逆向工程是一项至关重要的技术,它使我们能够深入理解软件的运作原理。今天,我将为您推荐一套名为"滴水逆向培训高级班"的高质量逆向工程培训资源。这套资源不仅适合有一定基础的学者,更是Windows操作系统底层机制探索者的宝贵...

gitblog_06704的博客 1094

推荐文章:轻松控制你的Windows系统内存占用,迈向高效测试环境

推荐文章:轻松控制你的Windows系统内存占用,迈向高效测试环境 去发现同类优质开源项目:https://gitcode.com/ 在追求极致性能与系统管理的道路上,我们常常需要模拟各种系统负载场景。今天,为大家带来一个极具实用性的开源小工具——一键提升Windows系统内存占用至70% 的解决方案。对于开发者、系统管理员乃至性能测试爱好者而言,这无疑是一个不可或缺的神器。 项目介绍 这个名为“...

gitblog_09792的博客 526

KDU:通过易受攻击驱动实现Windows内核探索的实用工具

KDU(Kernel Driver Utility)是一款专为安全研究人员和系统分析师设计的Windows内核探索工具,它通过利用已知漏洞驱动绕过系统安全机制,提供对内核内存的直接读写能力。这款工具主要面向Windows 7到Windows 11系统,需要管理员权限运行,为内核安全研究、驱动开发和系统诊断提供强大的支持。 ## 核心功能概览 KDU的核心功能基于一个简单而强大的理念:利用合法软

gitblog_00755的博客 969

Windows内核设计思想完整版.pdf简介

Windows内核设计思想完整版.pdf简介 【下载地址】Windows内核设计思想完整版.pdf简介 这本《Windows内核设计思想 完整版》电子书深入解析了Windows操作系统的内核架构、原理及实现机制,内容涵盖内存管理、进程与线程、设备驱动程序、文件系统、网络通信等关键领域。通过通俗易懂的语言和丰富的实例,本书...

gitblog_06708的博客 441
上一篇: 值得纪念的日子
下一篇: 9.16 俺结婚了 ♡ ♡
rainlight
博客等级 码龄25年 11粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值