Windows内存管理学习之一

今天看了《windows核心编程》 的第13章——windows的内存结构,解决了一些疑问,但还不是全部。
笔记如下:(强烈建议大家看《windows核心编程》时,找一个英文版的电子书《Programming Applications for Microsoft Windows》对照着看)

1)地址空间的分区是根据操作系统的基本实现方法来进行的。不同的Windows内核,其分区也略有不同。

2)win2000的内存映射文件在用户方式分区中,win98将内存映射文件放入共享的MMF分区中而决不会将其放入用户方式分区。

3)每当你保留地址空间的一个区域时,系统要确保该区域从一个分配粒度的边界开始。对于不同的CPU平台来说,分配粒度是各不相同的。但是,截止到撰写本书时,所有的CPU平台(x86、32位Alpha、64位Alpha和IA-64)都使用64KB这个相同的分配粒度。
虽然系统规定,要求保留的地址空间区域均从分配粒度边界(目前所有平台上均为64KB)开始,但是系统本身并不受这个规定的限制。为你的进程的PEB和TEB保留的地址空间区域很可能不是从64KB这个边界开始的。不过这些保留区域仍然必须是CPU的页面大小的倍数。
非空闲区域的所有基地址几乎都是从64KB的倍数上开始的。这是由系统采用的保留地址空间的分配粒度所决定的。不是从分配粒度边界开始的区域,表示该区域是由操作系统代码代表你的进程来分配的。
PS:系统给用户定规矩,自己不遵守,呵呵。

4)当你保留地址空间的一个区域时,系统还要确保该区域的大小是系统的页面大小的倍数。页面是系统在管理内存时使用的一个内存单位。与分配粒度一样,不同的CPU,其页面大小也是不同的。x86使用的页面大小是4KB,而Alpha(当既能运行32位Windows2000也能运行64位Windows2000时)使用的页面大小则是8KB。在撰写本书时,Microsoft预计IA-64也使用8KB的页面。但是,如果测试显示使用更大的页面能够提高系统的总体性能,那么Microsoft可以切换到更大的页面(16KB或更大)。

5)当启动一个应用程序的时候,系统将打开该应用程序的.exe文件,确定该应用程序的代码和数据的大小。然后系统要保留一个地址空间的区域,并指明与该区域相关联的物理存储器是在.exe文件本身中。即系统并不是从页文件中分配地址空间,而是将.exe文件的实际内容即映像用作程序的保留地址空间区域。当然,这使应用程序的加载非常迅速,并使页文件能够保持得非常小。

6)x86和AlphaCPU不支持“执行”保护属性,不过操作系统软件却支持这个属性。这些CPU将读访问视为执行访问。这意味着如果将PAGE_EXECUTE保护属性赋予内存,那么该内存也将拥有读优先权。当然,不应该依赖这个行为特性,因为在其他CPU上的Windows实现代码很可能将“执行”保护视为“仅为执行”保护。
PS:这个还是头一次听说。

7)Usually, the pages containing code are marked as PAGE_EXECUTE_READ while the pages containing data are marked PAGE_READWRITE.

8)CPUs operate most efficiently when they access properly aligned data. Data is aligned when the memory address of the data modulo of the data's size is 0. For example, a WORD value should always start on an address that is evenly divided by 2, a DWORD value should always start on an address that is evenly divided by 4, and so on.
对齐有助于CPU存取执行。

9)copy-on-write访问。简单地说,这个机制是为了减少物理内存和页面文件开销,让一个程序的多个副本共享代码和数据页面。但是,各个副本对源程序中的同一变量会进行不同的修改,如果该变量(更精确地说,是变量在内存中对应的页面)在内存是唯一的,那么,一个副本对其进行修改就会影响到其他副本的运行。为了解决这个问题,win2k引入了copy-on-write机制。每个副本开始加载运行时,系统首先在页面文件(Pagefile)中为可能写入的页面(比如上文提到的可能发生冲突的变量)分配虚拟内存,当一个副本要向可写入的页面存入数据时,系统会将事先分配好的页面从虚拟内存换入物理内存,供当前副本读写,从而解决冲突。

10)进程地址空间分布

分区

32Windows2000(x86Alpha处理器)

32Windows2000(x86w/3GB用户方式)

64Windows2000(AlphaIA-64处理器)

Windows98

NULL指针分配的分区

0x00000000

0x0000FFFF

0x00000000

0x0000FFFF

0x0000000000000000

0x000000000000FFFF

0x00000000

0x00000FFF

DOS/16Windows应用程序兼容分区

0x00001000

0x003FFFFF

用户方式

0x00010000

0x7FFEFFFF

0x00010000

0xBFFEFFFF

0x0000000000010000

0x000003FFFFFEFFFF

0x00400000

0x7FFFFFFF

64-KB

禁止进入

0x7FFF0000

0x7FFFFFFF

0xBFFF0000

0xBFFFFFFF

0x000003FFFFFF0000

0x000003FFFFFFFFFF

共享内存映射

0x80000000

0xBFFFFFFF

文件(MMF)内核方式

0x80000000

0xFFFFFFFF

0xC0000000

0xFFFFFFFF

0x0000040000000000

0xFFFFFFFFFFFFFFFF

0xC0000000

0xFFFFFFFF


11)页面的保护属性

保护属性

描述

PAGE_NOACCESS

如果试图在该页面上读取、写入或执行代码,就会引发访问违规

PAGE_READONLY

如果试图在该页面上写入或执行代码,就会引发访问违规

PAGE_READWRITE

如果试图在该页面上执行代码,就会引发访问违规

PAGE_EXECUTE

如果试图在该页面上对内存进行读取或写入操作,就会引发访问违规

PAGE_EXECUTE_READ

如果试图在该页面上对内存进行写入操作,就会引发访问违规

PAGE_EXECUTE_READWRITE

对于该页面不管执行什么操作,都不会引发访问违规

PAGE_WRITECOPY

如果试图在该页面上执行代码,就会引发访问违规。如果试图在该页面上写入内存,就会导致系统将它自己的私有页面(受页文件的支持)拷贝赋予该进程

PAGE_EXECUTE_WRITECOPY

对于该地址空间的区域,不管执行什么操作,都不会引发访问违规。如果试图在该页面上的内存中进行写入操作,就会将它自己的私有页面(受页文件的支持)拷贝赋予该进程

PAGE_NOCACHE

停用已提交页面的高速缓存

PAGE_WRITECOMBINE

把单个设备的多次写入合并在一起,以便提高运行性能

PAGE_GUARD

在页面上写入一个字节时使应用程序收到一个通知(通过一个异常条件)。

Windows 98 supports only the PAGE_NOACCESS, PAGE_READONLY, and PAGE_READWRITE protection attributes.

----------------------------------------

以上便是今日所学,尚有诸多问题没有解决,如页表的存储、内存管理的整个架构等等。另外,我在查找intel x86寄存器的详细信息,确实之后便发一篇保护模式寻址的帖子,其实也是读书笔记。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值