日期:2014-05-16  浏览次数:20955 次

熬之滴水成石:最想深入了解的内容--windows内核机制(3)

                                                                                          55--内存管理

winodwsOS的内存管理中,在32位的系统中是将虚拟空间地址按照0-4GB的线性地址空间,任何一个进程都定义了它自己完整的4GB地址空间。其中2GB-4GB之间是进程共享的称为系统空间,0-2GB称为地址空间。在winodws初始化时会将这2GB化分成了一些固定的区域,每个区域都有各自的功能。系统会管理好每个区域的边界,实际上就是用全局变量来对其进行初始化的工作。区域大小的位置其实是可以有据可循的,我们其实可以在注册表中找到相关的大小。这些区域大概包括了像换页内存池、会话空间、系统缓存区等内容。当处理器在执行内存访问指令时,实际上是将这些虚拟地址转换成了物理地址。这个过程相对来说实际上就是一种转换的过程,主要是涉及到了页表和页目表之间的内容,如果转换过来发现一个未能转换的物理地址时一般就会引发异常。页面管理也是一个复杂的过程,这里面涉及到了一些复杂的算法,像换页内存池,在这个池内,实际上是没有映射好的物理页面的,采取位图来管理页面的分配。还有什么非换页内存池等。不管是哪种方式,这些内存区域都是按照页面粒度来管理其分配情况。

我们知道进程的地址空间是随进程一起被创建的,每个进程都有它自己的页面,当然有一些是被共享的,这部分肯定也是属于系统地址空间的部分。随着进程中的映像文件被加载进来,以及各个模块的初始化代码被执行,进程的地址空间也被创建起来。我们编码通常是通过API函数来申请或者是释放地址范围,根据资料查阅内存管理器是通过一颗平衡二叉树的方式管理进程地址使用情况,以节点保存内存区对象,这样也便于OS中两个或者多个进程共享内存的一种方式。所以我们可以理解内存对象实际上是被系统映射成页面文件,可执行映像文件或数据文件都可以被映射到物理内存中,实际上内存区对象就是物理存储的资源。所以内存管理其实就是在有限的物理内存上作文章,在OS中有一个专门的页编号数据库。让每个物理页面都是其数据库中的一项,每个页面都会有自己的状态,其实就是OS系统规定进程的那些什么活动,什么备用,什么空闲等等,这些状态实际上是被进程或是系统空间使用的,内存管理就是利用这个页面数据库,根据状态情况进行管理。当然这是最为简单的情况,实际上复杂的时候就是进程们需要大量内存的时候,这里会涉及到了工作集的概念。当然这些处理自然都离不开数据结构,在winodwsOS中都有一个存储工作集的链表,这个链表记录了每个物理编号、属性的内容。内存管理根据一些实际情况来选择进行进行一些数据的更新,这样便于让处理器知道哪些页面被换到磁盘中去,从而让物理页面腾出手来。工作管理器实际上是被一线程调用的,线程调用工作管理程序实际上采取的就是定时触发的模式。这个线程同时也触发进程,还有一个叫栈交换器的东东。其实这也是一个线程,线程唤醒另一个线程,从而实现换入内存或换出内存的操作。

                                                                                                                            (未完待续.........)