每个进程有4G内存空间,其中2G内核空间是共享的。另外2G内存是每个进程私有。但是进程这么多,每个进程2G,系统怎么也变不出来。于是有了内存映射一说,使用到的才进入内存,平时为空或者在倒换文件中。这个页式存储机制对于现代操作系统比段式内存机制更重要。
每个进程对于自己的空间使用VadRoot记录。结构如下:
typedef struct _MADDRESS_SPACE
{
PMEMORY_AREA MemoryAreaRoot;
PVOID LowerAddress;
struct _EPROCESS* Process;
......
}
PMEMORY_AREA MemoryAreaRoot便是记录进程的空间,使用二叉树结构。MemoryAreaRoot为该进程空间的二叉树的根节点。至此,便可推知有相应的查找,插入等函数。
以上是对虚拟空间的管理,只有对应相对的物理内存才能使用。系统对于整个物理内存有个记录,记录多少内存多少物理内存页面,使用PFN(页面帧计数)。在windowsX86下是4K一个页面大小。
见结构 struct _PHYSICAL_PAGE .此结构通过PFN联系物理内存。同时结构中表明该页面的性质,有FREE\USED\BIOS。还有队列元素表明此时页面处于何种队列中。比如待清零页面队列,已清零可使用队列,BIOS队列,使用中队列等。使用中队列又分cache\user\ppool\nppool,即分页池,非分页池,用户,缓冲说明他们的用途。
下面将两者联系起来,不过PTE什么的比较麻烦,而从实用出发,一般没有涉及这么深,大概了解了下。(严格来说,整个内存管理在实际使用中都是深埋幕后)。
但是物理内存与虚拟内存映射在实用中有个很重要的应用,共享映射区Section.一般来讲,一个物理页面都是映射到一个进程的虚拟空间。但是一个物理内存页面也可以映射到不同空间的虚拟内存的不同位置。
进行内存共享或者将文件映射到内存,访问文件就和访问内存一样,快捷很多。
然后情景分析分析了NTCREATESECTION函数,对于函数最后一个参数FILEHANDLE,可有可无,区别只是在于,倒换的页面是存放指定文件还是倒换文件中。之后的映射还是文件 内存页 以及相应的记录的数据表格的变换。
以上为个人索引累笔记,恐对其他人没有什么帮助。自用。