一、进程的内存空间
1、实现
为实现系统中每个进程都有一个私有的虚拟地址空间,系统为每个进程都创建了一个页目录和一组页表。每个进程的页表是独立的,而内核空间中的页表是共享的。
x86平台上,CR3寄存器标识了页目录所在的物理地址。Windows系统上的第一个进程都有独立的页目录,因此系统运行时,CR3寄存器中保存的页目录地址是会变化的,其值为当前运行的进程的页目录地址。当系统要进行进程切换时,会将CR3设置成新进程的页目录地址。 Windows平台的每一个进程都有一个KPROCESS结构的数据块,其中包括了其进程页目录的地址。
2、数据共享与保护
不同进程的虚拟内存分页可以映射为相同的物理内存分页。
同时,为了保证这种在映射到相同物理内存分页上的内存分页在进程上仍然是私有的,系统还提供了一些保护机制。如果将某个系统DLL加载到进程内存空间以后,对该DLL中的数据进行了写操作,系统就会监视到该操作,并在数据写入之前将要写入的进程虚拟内存分页映射到另一个新的物理分页,并将原分页中系统DLL的内容复制到这个分页中,进程间不共享这个新物理内存分页,最后进程完成写操作,将数据写入到这个新分页中。这种对内存中系统DLL数据的写入操作不会影响到其他进程,因此保护了各个进程中数据的独立性,这种机制叫做Copy-On-Write。如果进程间确实要共享数据,可以对特定的页面不使用该机制。
二、内存页面的保护属性和存取权限
保护属性与存储权限
属性常量 |
意义 |
PAGE_EXECUTE |
可执行 |
PAGE_EXECUTE_READ |
可读、可执行 |
PAGE_EXECUTE_READWRITE |
可读、可写、可执行 |
PAGE_EXECUTE_WRITECOPY |
可读、可写、可执行,以Read-On-Write和Copy-On-Write方式共享 |
PAGE_NOACCESS |
不可访问 |
PAGE_READONLY |
只读 |
PAGE_READWRITE |
可读可写 |
PAGE_WRITECOPY |
Copy-On-Write |