Windows核心编程(十三)Windows内存体系结构

本文详细介绍了Windows操作系统中进程的虚拟地址空间,包括空指针赋值区、用户模式分区和内核模式分区,强调了地址空间的分区、内存调拨、页交换文件以及页面保护属性的重要性。此外,还讨论了内存对齐规则对程序性能的影响。
摘要由CSDN通过智能技术生成

一、进程虚拟地址空间

1、每个进程都有自己的虚拟地址空间。对于32位操作系统来说,它的地址空间是4GB。这是因为32位指针可以表示从0x000000000xFFFFFFFF之间的任一值。对于64位的操作系统来说有0到264次方之间的任一值。


2、由于每个就进程都有自己的地址空间,因此每个进程都只能访问属于自己的地址空间而不能访问其他进程的空间。这保护了进程,也是之所以我们说进程是资源分配和保护的基本单位的原因。


3、每个进程都有自己的私有地址空间,进程A可以访问它的地址空间0x11009333处的地址。进程B当然也有这个地址,但进程B的此地址处存储的与进程A的数据完全不同。它们没有任何关系。进程A不能访问进程B的地址空间。反之亦然。


4、每个进程的地址空间都被分成多个分区。由于地址空间分区依赖于操作系统底层实现,因此各个版本的Windows的分区各不相同。此处我们主要介绍32位和64位的Windows内核下的分区情况。

 

一)空指针赋值区

这一分区是进程地址空间从0x000000000x0000FFFF的区域。共64KB。该分区的作用是帮助程序员捕获对空指针的赋值。如果进程中的线程试图访问此区域将会导致访问违规。(原因:此区域未调拨空间,访问未调拨空间的地址将会导致访问违规)。这种情况经常由调用API申请空间失败引起,如malloc。但未对指针进行检查。

没有任何方法能够访问到此区域的虚拟内存。

 

二)用户模式模式分区。

1、这一部分空间是进程地址空间的驻地。它的大小也取决于cpu体系结构。


2、X86cpu体系下的用户模式分区从0x00010000——0x7FFEFFFF总共2GB。进程的大部分数据都保存在这一分区。这其中包括程序加载的dll


3、有些用户程序需要大于2G的用户模式地址空间。为此Windows提供了一种大用户分区模式来增大用户模式分区,但最多为3GB。要启动大用户分区模式可以查询其他资料,此处不再介绍。


4、当32位的应用程序在64位下的环境下运行时,Windows会让此程序在地址空间沙箱中运行。系统将64位地址的高33位都设为0,这样就截断成了32位地址,也就将可用的地址空间限制在最底部的2GB中。对于大多数的程序来说,2GB的地址空间已经足够,为了让64位应用程序能够访问整个用户模式分区,必须用/LARGEADDRESSAWARE连接器开关来链接应用程序。

 

三)内核模式分区

1、这一分区是操作系统代码的驻地。系统需要这一部分空间来存放内核代码、设备驱动程序代码、设备输入输出高速缓存、非分页缓冲池分配表、进程页面表等。驻留在这一分区任何东西为所有进程共有,被映射到所有进程地址空间中。如果一个应用程序试图访问这一区域将会导致访问违规。


2、当系统创建一个进程同时为其创建它地址空间时,此地址空间中大部分都是闲置的。为了使用这部分地址空间,我们必须调用VirtualAlloc来分配其中的区域。分配区域的操作被称为预定。


3、当应用程序预定地址空间区域时,系统会确保预定的区域的起始地址正好是分配粒度的整数倍。分配粒度根据不同的CPU平台而有所不同。现在所有的平台都是用相同的分配粒度。大小为64KB


4、而对于预定的地址空间的大小,系统会确保区

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值