第13章 Windows内存体系结构学习笔记

一、进程的虚拟地址空间#

每个进程都有自己的虚拟地址空间。当进程中的各线程运行时,它们只能访问属于该进程的内存。

二、虚拟地址空间的分区#

1、空指针赋值分区#

这一分区是进程地址空间中从0x00000000到0x0000FFFF的闭区间,保留该分区的目的是为了帮助程序员捕获空指针的值。如果进程中的线程试图读取或写入位于这一分区内的内存地址,就会引发访问违规。

2、用户模式分区#

这一分区是进程地址空间的驻地。可用的地址区间和用户模式分区的大小取决于CPU体系结构。从0x00010000开始。进程无法通过指针来读取、写入或以任何方式,访问驻留在这一分区中其他进程的数据。

3、内核模式分区#

这一分区是操作系统代码的驻地。与线程调度、内存管理、文件系统支持、网络支持以及设备驱动程序相关的代码都载入到该分区。驻留在这一个分区内的任何东西为所有进程共有。虽然这一分区就在每个进程中用户模式分区的上方,但该分区中所有代码和数据都被完全保护起来。如果一个应用程序试图读取或写入位于这一分区中的内存地址、会引发违规。

三、地址空间中的区域#

当系统创建一个进程并赋予它地址空间时,可用地址空间中的大部分都是闲置(free)或尚未分配的(unallocated)。为了调用这部分地址空间,我们必须调用VirutalAlloc来分配其中的区域(region)。分配区域的操作成为预订(reserving)。
当应用程序预定地址空间中的一块区域时,系统会确保区域的大小正好是系统页面大小的整数倍。
当程序不再需要访问所预订的地址空间区域时,应该释放该区域。这个过程被称为释放地址空间区域,通过调用VirtualFree函数来完成。

四、给区域调拨物理存储器#

为了使用所预订的地址空间区域,我们还必须分配物理存储器,并将存储器映射到所预订的区域。这个过程被称为调拨物理存储器。
当我们调拨物理存储器给区域时,并不需要给整个区域都调拨物理存储器。

五、物理存储器和页交换文件#

磁盘上的文件被称为页交换文件,其中包含虚拟内存,可供任何进程使用。
当一个线程试图访问所属进程的地址空间中的一块数据,有两种情况:
1.线程要访问的数据就在内存中
2.线程要访问的数据不在内存中,而是位于页交换文件中的某处。
当用户要求执行一个应用程序时,系统会打开该应用程序对应的.exe文件并计算出应用程序的代码和数据的大小。然后系统会预订一块地址空间,并注明该区域相关联的物理存储器时.exe文件本身。也就是将.exe文件的实际内容(或文件映像,即file image)用作程序预订的地址空间区域。
当把一个程序位于硬盘上的文件映像(即一个.exe或DLL文件)用作地址空间区域对应的物理存储器时,我们称这个文件映像为内存映射文件。

六、页面保护属性#

我们可以给每个已分配的物理存储页指定不同的页面保护属性。

posted @   Ctrl_C+Ctrl_V  阅读(143)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示
主题色彩