探索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

基于Python的微信聊天记录分析——数据获取

本篇为“基于Python的微信聊天记录分析”第一篇,主要涉及数据获取,包括Python环境配置、WeChatMsg项目配置和运行、获取聊天记录等内容,流程简单、比较基础,后续这个系列会涉及基于Python的数据处理、统计分析、NLP技术等内容。希望和大家多多交流,共同进步!

Henryli1202的博客 1万+

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

本文详细介绍了OpenWrt虚拟机磁盘扩容的完整流程,重点对比了SquashFS和ext4文件系统在扩容操作上的关键差异。通过五步安全迁移法和直接分区调整方案,帮助用户有效解决磁盘空间不足问题,同时提供高级技巧和故障排除指南,确保扩容过程顺利无坑。

weixin_29251131的博客 231

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

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

zhujunwsk的专栏 3144

在中国大陆使用 LiveKit 集成阿里云语音交互服务

通过集成阿里云的语音和模型服务,我们可以快速构建出适合中国用户的 LiveKit 智能语音应用。LiveKit Agents 框架的模块化设计使得替换底层服务变得异常简单,只需要更换相应的插件实例即可。使用 WebSocket 版本的阿里云 ASR 接口以获得更低的延迟。利用通义千问的 Function Calling 能力对接智能家居或企业内部 API。结合 LiveKit 的视频处理能力,打造具备视觉交互的数字人。希望这篇博客能为你在实时音视频与 AI 结合的探索之路上提供帮助!

星空漫野 1237

Windows的内存管理机制

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

Albert_weiku的博客 4666

最小路径和——动态规划求解(Java实现)

最小路径和——动态规划求解(Java实现) 题目: 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例: 输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。 这题和机器人走路的思路类似,就是状态方程有所不同,...

weixin_43395911的博客 895

手把手教你使用YOLOv11模型,训练自己数据集,百分百成功(无废话)

YOLOV11百分百成功训练自己的数据集并进行图像、视频流脚本预测

chenhenGzzz的博客 1953

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

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

Tandy12356_的博客 5751

KEIL5编译报错L6200E:__stdout重定义问题分析与解决

本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。

uran的专栏 954

探索 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

【ComfyUI】多模型 户型图风格渲染效果图

本文介绍了一种基于ComfyUI的室内户型图自动渲染工作流,将平面图转换为风格化效果图。该工作流通过RH_Captioner节点识别空间布局,结合Qwen2.5模型优化文本描述,再使用定制室内设计模型生成渲染图。整个流程包含图像输入、空间识别、文本组织、语言生成、风格转换和渲染输出等9个阶段,各节点协同完成从户型图到效果图的全自动转换。系统融合了语言理解和图像生成技术,可广泛应用于室内设计、装修可视化等领域。

Mr数据杨 3012

【2024遥感应用组一等奖】基于时空融合和水量平衡法的若尔盖高原水源涵养功能评价

考虑到水源涵养的概念和尺度特征、数据的可获得性、模型的模拟精度等,构建了一种基于遥感、气象和水量平衡原理的草原湿地水源涵养评价方法,估算若尔盖湿地近23年(2000-2022)来的水源涵养量。若尔盖湿地是我国黄河源区的重要水源地,所以本研究以若尔盖湿地的水源涵养功能评估为科学问题,基于遥感数据、GIS数据等,利用水量平衡原理,发展计算简单、便捷、数据易获取的“水源涵养估算方法”,科学估算若尔盖湿地水源涵养服务量,探究其时空动态变化趋势及其影响因素;公式中,Z1和Z2为两个不同高度面的高度,u为摩擦速率;

JData_Engineer的博客 239

[转]探索Windows的内存机制

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

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

xu的blog 1546

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

深入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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

滴水逆向培训高级班资源介绍:深入探索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、付费专栏及课程。

余额充值