内存管理策略!(13)

本文详细介绍了32位和64位进程的虚拟地址空间布局,包括不同分区的作用及意义,如用户模式分区、内核模式分区等。还探讨了内存映射文件的概念及其在系统加载可执行文件中的应用,并介绍了写时复制机制如何处理共享页面的写入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程的虚拟地址

对于32位进程而言,这个地址空间的大小为4GB。而64位进程则可以到达16EB的地址空间。每个进程都有自己专有的地址空间,当进程中的线程运行时,他们只能访问属于该进程的内存。

每个进程的虚拟空间都被划分成许多分区:
0x00000000-0x0000FFFF是空指针赋值分区
0x00010000-0x7FFEFFFF是用户模式分区
0x7FFF0000-0x7FFFFFFF是64KB禁入分区
0x80000000-0xFFFFFFFF是内核模式分区
空指针赋值分区:该分区可以帮助程序员捕获对空指针的赋值。如果有线程试图读取或写入位于这一分区内的内存地址,就会引起违规操作。
用户模式分区:进程地址空间的驻地。对于应用程序来说,进程的大部分数据都保存在这一分区中。每个进程都有自己的数据分区,因此进程无法通过指针来读取、写入或以任何方式,访问驻留在这一分区中其他进程的数据。

装载文件

内存映射文件的物理存储器来自磁盘上已有的文件,而不是来自也交换文件。系统在加载exe和dll文件的时候使用的是内存映射文件来载入并运行exe和dll,这样大大节省了页交换文件的空间以及应用程序的启动时间。所以,实际上系统载入exe文件的时候就是利用内存映射文件技术把磁盘中的exe文件映射到内存(实际上,系统只是预定了一块足够大的地址空间来容纳exe文件,一定要注意“预定”这个词,待预定的地址空间区域的具体位置已经在exe文件中指定。默认情况下,exe的基地址为0x00400000.系统也会对这个地址空间的区域进行标注,表明该区域的后备物理存储区来自磁盘上的exe文件,而非来自系统的页交换文件。

以上就是,系统装载可执行文件的时经常被称为“映射到地址空间”的解释了,实际上就是创建了exe文件对应的页交换文件,也就是系统为这个exe文件的执行预定了足够大的地址空间,在x86下为4G的地址空间。

以上是系统加载exe文件的过程,映射到地址空间之后,系统开始执行exe文件的启动代码。完成了这个映射过程后,系统会负责所有的换页(paging),缓存(buffering)以及高速缓存(caching)的操作。例如,如果.exe文件中的代码跳到一个指令地址,但是该地址尚未载入内存,那么会引发一个页错误(page fault)。系统会检测到这个错误并自动将该页代码从文件载入到内存。然后系统会把该内存页映射到进程地址空间中的适合位置,并让线程继续执行,就好像该页代码早就在内存中一样。

从理想来分析整个装载的过程,我们需要了解PE文件的结构,实际上,在载入的过程PE文件会按照磁盘中的各个页的排列顺序映射到地址空间中,也即是映射到内存映射文件中。改变的只是每一个页在磁盘中的对齐大小要按照在内存中的页对齐大小来排列了。假如,在磁盘中的文件对齐为0x1000,内存对齐其0x2000,那么PE文件的内存映像中每一也都将扩大1倍了,但是每一个页的相对位置不变。这样,对于磁盘映像到内存映像的双向都可以很容易的一一对应起来,这为windows虚拟内存的管理提供了很好的一个机制。文件对齐和内存对齐的值在PE文件中都有指定,具体的位置在PE的头部信息中。

写时复制

当线程试图写入一个共享页面时,系统会接入并执行一下操作。
(1)系统在内存中找到一个闲置页面。注意,该闲置页面的后备页面来自页交换文件,它是系统最初将模块映射到进程的地址空间时分配的。由于系统在第一次进行映射的时候分配了所有可能需要的页交换文件空间,这一步时不可能失败的。
(2)系统把线程想要修改的页面内容复制到在第1步中得到的闲置页面。
(3)然后,系统更新进程表,这样一来,原来的虚拟地址现在就对应到内存中一个新的页面了。
在执行完以上步骤后,进程就可以访问它自己的副本了。

数据对齐

把数据的地址模除数据的大小,如果结果为0,那么数据就是对其的。如果数据未对齐,那么会有两种可能,第一种是CPU会引发一个异常,另一种时CPU会通过多次访问已对齐的内存,来取得整个错位的数据。在X86-x64平台下,CPU会自动修正未对齐错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值