第十三章:Windows内存体系结构

1:分区

1:0x00000000~0x0000FFFF为空指针赋值分区,占64KB

0x00010000~0x7FFEFFFF用户模式分区,DLL和内存映射文件也在这一分区

0x7FFF00000~0x7FFFFFFF为64KB禁入分区

2:64位Windows用户模式为8TB

2:预订(reserving)区域

1:区域是虚拟内存地址的一段

2:分配区域的操作被称为预订,分配和释放是VirtualAlloc(),VirtualFree()

3:系统保证预订的起始地址是分配粒度的整数倍,目前所有CPU分配粒度都是64KB,但是系统对自己的预订操作不作此保证

4:系统保证预订的大小是系统页面大小的整数倍,x86和x64页面大小为4KB
3:给区域调拨(committing)物理存储器

1:分配物理存储器,并将其映射到预订的区域,这个过程叫调拨物理存储器,同样使用VirtualAlloc(),VirtualFree()

2:调拨以页面大小为基本单位

3:调拨后,操作系统应该维护着一个区域到物理存储器(页交换文件或者物理内存)的映射表

4:被调拨的物理存储器也叫后备存储器

4:页交换文件,虚拟内存,物理存储器

1:磁盘上的文件被称为页交换文件,其中包含虚拟内存

2:调拨操作实际上是使用的是页交换文件

3:最好将物理存储器看成页交换文件

5:线程访问一块数据过程

如果数据在内存中,CPU把数据的虚拟内存地址映射到物理内存地址,然后访问

如果数据不在内存中,这次访问会产生一个页面错误,CPU通知操作系统,操作系统会在内存中找一个闲置页面,如果找不到,系统会释放一个页面,如果此页面没修改过,就直接释放,如果修改过,就将此页面复制到页交换文件再释放,然后,系统将要访问的数据复制到内存中,更新自己的表项使虚拟内存映射到物理内存,然后重新执行此访问数据指令

6:内存映射文件

1:错误的理解:执行一个可执行文件,操作系统会调拨物理存储器(也就是页交换文件),将此可执行文件的数据和代码拷贝到物理存储器,然后在实际执行时换进物理内存

实际的情况是:操作系统先获得可执行文件代码和数据大小,预订此大小区域,但不在页交换文件中调拨物理存储器,而是以此文件为物理存储器, 然后在实际执行时换进物理内存

2:当把一个exe或者dll本身作为物理存储器时,它就被称为内存映射文件

3:系统提供一组API,用于将数据文件(不是exe或者dll)变为内存映射文件

4:当Windows从软盘载入exe或者dll时,系统会将整个文件从软盘复制到内存中,并在页交换文件中保留同样的大小

7:页面属性

1:页面可以有读,写,可执行等属性,其中几个如下:

PAGE_NOACCESS	//读写执行都违规
PAGE_WRITECOPY  //执行违规,写时拷贝
PAGE_EXECUTE_WRITECOPY //任何操作都不违规,写时拷贝
PAGE_GUARD		//页面中任何一个字节写入时,程序会得到通知,创建线程栈时会用到此标志,此标志对物理存储有意义,对虚拟地址空间没意义,并且只能用于块

2:数据执行保护(DEP),如果CPU试图执行一个页面的代码,但此页面没有PAGE_EXECUTE_*属性,则抛出异常

3:写时复制:

3.1:写时复制是应用于exe和dll的,所以我们在预定或调拨物理存储器时是不能指定此属性的

3.2:写时复制是为了满足exe和dll这样的需求,比如打开10个记事本,我们以记事本程序为物理存储器,当真正需要记事本数据和代码时,将其换入物理内存,但我们希望10个程序都共享内存中的数据和代码,这样便能节约内存,但我们又要预防多个进程同时写时的冲突

3.3:操作系统在将一个exe或者dll映射进一个虚拟地址空间时,会为共享的存储页指定写时复制属性,并计算有多少页面是可写的,然后再页交换文件中分配这样的大小,如果程序没有执行写入操作,便不会用到此页交换文件,当一个线程试图写入一个写时复制页面,会执行如下操作:

(1)系统在物理内存中找到一个闲置页面,如果没有,则从开始在页交换文件中分配的空间中置换

(2)复制那个写时复制页面,并去掉写时复制属性

(3)更新进程页面表,让虚拟内存空间映射到此物理内存页面,然后开始执行真正的写操作

8:区域相关

1:区域类型

(1)闲置:该空间尚未被预订

(2)私有:后备存储器是页交换文件

(3)映像:一开始以exe或者dll为后备存储器,但此后不一定以exe或者dll为后备存储器,如写时复制机制会将此区域改用页交换文件作为后备存储器

(4)已映射:一开始以内存映射文件(应该是非exe和dll)为后备存储器,但此后不一定以内存映射文件为后备存储器

2:为节省磁盘空间,连接器会压缩PE文件,当PE文件映射到进程虚拟地址空间时,每一个段(section)必须另起一页,并且起始地址必须是页面大小整数倍,这意味这PE文件在虚拟地址空间的大小一般大于其在硬盘中的大小

3:一个是一些连续的页面的数量,这些页面有相同的属性,并且以相同类型的物理存储器作为后备存储器

4:如果同时给区域和物理存储器指定属性,则以物理存储器为准

5:一个块的页保护属性优先于所属区域的保护属性

9:数据对齐

1:数据对齐是CPU体系的一部分

2:当访问未对齐的数据时,CPU要么抛出异常,要么通过多次访问对齐的数据得到未对齐的数据

3:X86CPU EFlags AC位(对齐检查标志),默认情况下在CPU通电时被置为0,CPU则会执行必要的操作来访问对齐数据,如果被置为1,则会产生数据错位异常,X86CPU永远置0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值