精华内容
下载资源
问答
  • windows分页机制

    2013-09-07 12:06:42
    网上找的资料,介绍windows内存分页相关知识
  • windows分页管理机制

    千次阅读 2015-04-10 18:59:18
    存储器分页管理 80386开始支持存储器分页管理机制。分页机制是存储器管理机制的第3二部分。段管理机制实现虚拟地址(由段和偏移构成的逻辑地址)到线性地址的转换,分页管理机制实现线性地址到物理地址的转换。...

    80386开始支持存储器分页管理机制。分页机制是存储器管理机制的第3二部分。段管理机制实现虚拟地址(由段和偏移构成的逻辑地址)到线性地址的转换,分页管理机制实现线性地址到物理地址的转换。如果不启用分页管理机制,那么线性地址就是物理地址。本文将介绍80386的存储器分 页管理机制和线性地址如何转换为物理地址。

    <一>存储器分页管理机制

        在保护模式下,控制寄存器CR0中的最高位PG位控制分页管理机制是否生效。如果PG=1,分页机制生效,把线性地址转换为物理地址。如果PG=0,分页机制无效,线性地址就直接作为物理地址。必须注意,只有在保护方式下分页机制才可能生效。只有在保证使PE位为1的前提下,才能够使PG位 为1,否则将引起通用保护故障。
        分页机制把线性地址空间和物理地址空间分别划分为大小相同的块。这样的块称之为页。通过在线性地址空间的页与物理地址空间的页之间建立的映射,分页机制实现线性地址到物理地址的转换。线性地址空间的页与物理地址空间的页之间的映射可根据需要而确定,可根据需要而改变。线性地址空间的任何一页,可以映射为物理地址空间中的任何一页。
        采用分页管理机制实现线性地址到物理地址转换映射的主要目的是便于实现虚拟存储器。不象段 的大小可变,页的大小是相等并固定的。根据程序的逻辑划分段,而根据实现虚拟存储器的方便 划分页。
        在80386中,页的大小固定为4K字节,每一页的边界地址必须是4K的倍数。因此,4G大小的地址空间被划分为1M个页,页的开始地址具有“XXXXX000H”的形式。为此,我们把页开始地址的高20位XXXXXH称为页码。线性地址空间页的页码也就是页开始边界线性地址的高20位;物理地址空间页的页码也就是页开始边界物理地址的高20位。可见,页码左移12位就是页的开始地址,所 以页码规定了页。
        由于页的大小固定为4K字节,且页的边界是4K的倍数,所以在把32位线性地址转换成32位物理地址的过程中,低12位地址保持不变。也就是说,线性地址的低12位就是物理地址的低12位。假设分页机制采用的转换映射把线性地址空间的XXXXXH页映射到物理地址空间的YYYYYH页,那么线性地址XXXXXxxxH被转换为YYYYYxxxH。因此,线性地址到物理地址的转换要解决的是线性地址空间的页到物理地址空间的页的映射,也就是线性地址高20位到物理地址高20位的转换。

    <二>线性地址到物理地址的转换

    1.映射表结构

        线性地址空间的页到物理地址空间的页之间的映射用表来描述。由于4G的地址空间划分为1M个页,因此,如果用一张表来描述这种映射,那么该映射表就要有1M个表项,若每个表项占用4个字节,那么该映射表就要占用4M字节。为避免映射表占用如此巨大的存储器资源,所以80386把页映射表 分为两级。
        页映射表的第一级称为页目录表,存储在一个4K字节的物理页中。页目录表共有1K个表项,其中,每个表项为4字节长,包含对应第二级表所在物理地址空间页的页码。页映射表的第二级称为页表,每张页表也安排在一个4K字节的页中。每张页表都有1K个表项,每个表项为4字节长,包含对应物理地址空间页的页码。由于页目录表和页表均由1K个表项组成,所以使用10位的索引就能指定表项,即用10位的索引值乘以4加基地址就得到了表项的物理地址。
        下图显示了由页目录表和页表构成的页映射表结构。从图中可见,控制寄存器CR3指定页目录表;页目录表可以指定1K个页表,这些页表可以分散存放在任意的物理页中,而不需要连续存放;每张页表可以指定1K个物理地址空间的页,这些物理地址空间的页可以任意地分散在物理地址空间中。需要注意的是,存储页目录表和页表的基地址是对齐在4K字节边界上的。
    windows分页管理机制 - sam - MyBestLove Siberia;

    2.表项格式

        页目录表和页表中的表项都采用如下图所示的格式。从图中可见,最高20位(位12—位31)包含物理地址空间页的页码,也就是物理地址的高20位。低12位包含页的属性。下图所示的属性中内容为0的位是Intel公司为80486等处理器所保留的位,在为80386编程使用到它们时必须设置为0。 在位9至位11的AVL字段供软件使用。表项的最低位是存在属性位,记作P。P位表示该表项是否有效。P=1表项有效;P=0表项无效,此时表项中的其余各位均可供软件使用,80386不解释P=0的表项中的任何其它的位。在通过页目录表和页表进行的线性地址到物理地址的转换过程中,无论在页目录表还是在页表中遇到无效表项,都会引起页故障。其它属性位的作用在下文中介绍。

    页目录表或页
    表的表项格式
    BIT31—BIT12 BIT11—BIT9 BIT8 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
    物理页码 AVL 0 0 D A 0 0 U/S R/W P

    3.线性地址到物理地址的转换

        分页管理机制通过上述页目录表和页表实现32位线性地址到32位物理地址的转换。控制寄存器CR3的高20位作为页目录表所在物理页的页码。首先把线性地址的最高10位(即位22至位31)作为页目录表的索引,对应表项所包含的页码指定页表;然后,再把线性地址的中间10位(即位12至位21)作为所指定的页目录表中的页表项的索引,对应表项所包含的页码指定物理地址空间中的一页;最后,把所指定的物理页的页码作为高20位,把线性地址的低12位不加改变地作为32位物理地址的低12位。
        为了避免在每次存储器访问时都要访问内存中的页表,以便提高访问内存的速度,80386处理器的硬件把最近使用的线性—物理地址转换函数存储在处理器内部的页转换高速缓存中。在访问存储器页表之前总是先查阅高速缓存,仅当必须的转换不在高速缓存中时,才访问存储器中的两级页表。 页转换高速缓存也称为页转换查找缓存,记为TLB。
        在分页机制转换高速缓存中的数据与页表中数据的相关性,不是由80386处理器进行维护的,而必须 由操作系统软件保存,也就是说,处理器不知道软件什么时候会修改页表,在一个合理的系统中,页表只能由操作系统修改,操作系统可以直接地在软件修改页表后通过刷新高速缓存来保证相关性。高速缓存的刷新通过装入处理器控制寄存器CR3完成,实际过程可能用如下的两条指令实现:
        mov     eax,cr3
        mov     cr3,eax
    
        一个重要的修改页表项的特殊情况不需要对页转换高速缓存刷新,这种情况是指修改不存在表项的任一部分,即使P位本身从P=0改变为P=1时也一样,因为无效的表项不会存入高速缓存。因此,当无效的表项被改变时,不需要刷新高速缓存。这表明在从磁盘上读入一页使其存在时,不必刷新高 速缓存。
        在一个多处理器系统中,必须特别注意是否在一个处理器中执行的程序,会改变可能由另外的处理器同时访问的页表。在80386处理器中,每当要更新页表项并设置D位和A位时,通过使用不可分的读/修改/写周期支持多处理器的配置。对于页表项的软件更新需要借助于使用LOCK前缀,从而保证修改页表的指令工作在不可分的读/修改/写周期中。在改变一个可能由另外的处理器使用的页表之前,最好使用一条加锁的AND指令在一个不可分的操作中将P位清除为0,然后,该表项可根据要求进行修改,并随后把P位置成1而使表项成为可用。当修改页表项时必须及时通知(通常使用中断方式)系统中该表项已被高速缓存的所有处理器刷新各自的页转换高速缓存,以撤消该表项的旧拷贝。在表项的旧拷贝被刷新之前,各处理器仍可继续访问旧的页,并可以设置正被修改的表项的D位。如果这样做引起表项修改失败,则分页机制高速缓存最好在标记为不存在之后,并在对表项进行另外的修 改之前进行刷新。

    4.不存在的页表

        采用上述页映射表结构,存储全部1K张页表需要4M字节,此外还需要4K字节用于存储页目录表。这样的两级页映射表似乎反而比单一的整张页映射表多占用4K字节。其实不然,事实上不需要在内存中存储完整的两级页映射表。两级页映射表结构中对于线性地址空间中不存在的或未使用的部分不必分配页表。除必须给页目录表分配物理页外,仅当在需要时才给页表分配物理页,于是页映射表的大小就对应于实际使用的线性地址空间大小。因为任何一个实际运行的程序使用的线性地址空间都远小于4G字节,所以用于分配给页表的物理页也远小于4M字节。
        页目录表项中的存在位P表明对应页表是否有效。如果P=1,表明对应页表有效,可利用它进行地址转换;如果P=0,表明对应页表无效。如果试图通过无效的页表进行线性地址到物理地址的转换,那么将引起页故障。因此,页目录表项中的属性位P使得操作系统只需给覆盖实际使用的线性地址范围 的页表分配物理页。
        页目录表项中的属性位P页可用于把页表存储在虚拟存储器中。当发生由于所需页表无效而引起的页故障时,页故障处理程序再申请物理页,从磁盘上把对应的页表读入,并把对应页目录表项中的P位置1。换言之,可以当需要时才为所要的页表分配物理页。这样页表占用的物理页数量可降到最小。

    5.页的共享

        由上述页映射表结构可见,分页机制没有全局页和局部页的规定。每一个任务可使用自己的页映射 表独立地实现线性地址到物理地址的转换。但是,如果使每一个任务所用的页映射表具有部分相同 的映射,那么也就可以实现部分页的共享。
        常用的实现页共享的方法是线性地址空间的共享,也就是不同任务的部分相同的线性地址空间的映射信息相同,具体表现为部分页表相同或页表内的部分表项的页码相同。例如,如果任务A和任务B分别使用的页目录表A和页目录表B内的第0项中的页码相同,也就是页表0相同,那么任务A和任务B的00000000H至003FFFFFH线性地址空间就映射到相同的物理页。再如,任务A和任务B使用的页表0不同,但这两张页表内第0至第0FFH项的页码对应相同,那么任务A和任务B的00000000H至000FFFFFH线性地址空间就映射到相同的物理页。
    需要注意的是,共享的页表最好由两个页目录中同样的目录项所指定。这一点很重要,因为它保证 了在两个任务中同样的线性地址范围将映射到该全局区域。

    <三>页级保护和虚拟存储器支持

    1.页级保护

        80386不仅提供段级保护,也提供页级保护。分页机制只区分两种特权级。特权级0、1和2统称为系 统特权级,特权级3称为用户特权级。在上图所示页目录表和页表的表项中的保护属性位R/W和U/S就 是用于对页进行保护。
        表项的位1是读写属性位,记作R/W。R/W位指示该表项所指定的页是否可读、写或执行。若R/W=1,对表项所指定的页可进行读、写或执行;若R/W=0,对表项所指定的页可读或执行,但不能对该指定的页写入。但是,R/W位对页的写保护只在处理器处于用户特权级时发挥作用;当处理器处于系 统特权级时,R/W位被忽略,即总可以读、写或执行。
        表项的位2是用户/系统属性位,记作U/S。U/S位指示该表项所指定的页是否是用户级页。若U/S=1,表项所指定的页是用户级页,可由任何特权级下执行的程序访问;如果U/S=0,表项所指定的页是系统级页,只能由系统特权级下执行的程序访问。下表列出了上述属性位R/W和U/S所确定的页级保护下,用户级程序和系统级程序分别具有的对用户级页和系统级页进行操作的权限。

    页级
    保护
    属性
    U/S R/W 用户级访问权限 系统级访问权限
    0 0 读/写/执行
    0 1 读/写/执行
    1 0 读/执行 读/写/执行
    1 1 读/写/执行 读/写/执行

        由上表可见,用户级页可以规定为只允许读/执行或规定为读/写/执行。系统级页对于系统级程序总是可读/写/执行,而对用户级程序总是不可访问的。于分段机制一样,外层用户级执行的程序只能访问用户级的页,而内层系统级执行的程序,既可访问系统级页,也可访问用户级页。与分段机制不同的是,在内层系统级执行的程序,对任何页都有读/写/执行访问权,即使规定为只允许读/执行的用户页,内层系统级程序也对该页有写访问权。
        页目录表项中的保护属性位R/W和U/S对由该表项指定页表所指定的全部1K各页起到保护作用。所以,对页访问时引用的保护属性位R/W和U/S的值是组合计算页目录表项和页表项中的保护属性位的值所得。下表列出了组合计算前后的保护属性位的值,组合计算是“与”操作。

    组合页的
    保护>属性
    目录表项U/S 页表项U/S 组合U/S 目录表项R/W 页表项R/W 组合R/W
    0 0 0 0 0 0
    0 1 0 0 1 0
    1 0 0 1 0 0
    1 1 1 1 1 1

        正如在80386地址转换机制中分页机制在分段机制之后起作用一样,由分页机制支持的页级保护也在由分段机制支持的段级保护之后起作用。先测试有关的段级保护,如果启用分页机制,那么在检查通过后,再测试页级保护。如果段的类型为读/写,而页规定为只允许读/执行,那么不允许写;如果段的类型为只读/执行,那么不论页保护如何,也不允许写。
        页级保护的检查是在线性地址转换为物理地址的过程中进行的,如果违反页保护属性的规定,对 页进行访问(读/写/执行),那么将引起页异常。

    2.对虚拟存储器的支持

        页表项中的P位是支持采用分页机制虚拟存储器的关键。P=1,表示表项指定的页存在于物理存储器中,并且表项的高20位是物理页的页码;P=0,表示该线性地址空间中的页所对应的物理地址空中的页不在物理存储器中。如果程序访问不存在的页,会引起页异常,这样操作系统可把该不存在的页从磁盘上读入,把所在物理页的页码填入对应表项并把表项中的P位置为1,然后使引起 异常的程序恢复运行。
        此外,表项中的访问位A和写标志位D也用于支持有效地实现虚拟存储器。
        表项的位5是访问属性位,记作A。在为了访问某存储单元而进行线性地址到物理地址的转换过程中,处理器总是把页目录表内的对应表项和其所指定页表内的对应表项中的A位置1,除非页表或页不存在,或者访问违反保护属性规定。所以,A=1表示已访问过对应的物理页。处理器永不清除A位。通过周期性地检测及清除A位,操作系统就可确定哪些页在最近一段时间未被访问过。当存储器资源紧缺时,这些最近未被访问的页很可能就被选择出来,将它们从内存换出到磁盘上去。
        表项的位6是写标志位,记作D。在为了访问某存储单元而进行线性地址到物理地址的转换过程中,如果是写访问并且可以写访问,处理器就把页表内对应表项中的D位置1,但并不把页目录表内对应表项中的D置1。当某页从磁盘上读入内存时,页表中对应对应表项的D位被清0。所以,D=1表示已写过对应的物理页。当某页需要从内存换出到磁盘上时,如果该页的D位为1,那么必须进行写操作(把内存中的页写入磁盘时,处理器并不清除对应页表项的D位)。但是,如果要写到磁盘上的页的D位为0,那么不需要实际的磁盘写操作,而只要简单地放弃内存中该页即可。因为内存中的 页与磁盘中的页具有完全相同的内容。

    <四>页异常

        启用分页机制后,线性地址不再直接等于物理地址,线性地址要经过分页机制转换才成为物理地 址。在转换过程中,如果出现下列情况之一就会引起页异常:
        (1)涉及的页目录表内的表项或页表内的表项中的P=0,即涉及到页不在内存;
        (2)发现试图违反页保护属性的规定而对页进行访问。
        报告页异常的中断向量号是14(0EH)。页异常属于故障类异常。在进入故障处理程序时,保存的指 令指针CS及EIP指向发生故障的指令。一旦引起页故障的原因被排除后,即可从页故障处理程序通 过一条IRET指令,直接地重新执行产生故障的指令。
        当页故障发生时,处理器把引起页故障的线性地址装入CR2。页故障处理程序可以利用该线性地址 确定对应的页目录项和页表项。
    页故障还在堆栈中提供一个出错码,出错码的格式如下图所示。其中,U位表示引起故障程序的特权级,U=1表示用户特权级(特权级3),U=0表示系统特权级(特权级0、1或2);W位表示访问类型,W=0表示读/执行,W=1表示写;P位表示异常类型,P=0表示页不存在故障,P=1表示 保护故障。页故障的响应处理模式同其它故障一样。

    出错码
    的格式
    BIT15—BIT3 BIT2 BIT1 BIT0
    未使用 U W P

    <五>演示分页机制的实例(实例十)

        下面给出一个演示如何启用分页管理机制的实例。该实例的逻辑功能是,在屏幕上显示一条表示 已启用分页管理机制的提示信息。该实例演示内容包括:初始化页目录表和部分页表;启用分页 管理机制;关闭分页管理机制等。该实例假设系统至少有4M字节物理内存。

    1.演示步骤和源程序清单

        为了简单化,实例只有一个任务,并且没有局部描述符表和中断描述符表,不允许中断,也不考 虑发生异常,甚至没有使用堆栈。实例执行步骤如下:
        (1)在实模式下为进入保护模式作初始化;
        (2)切换到保护模式后进入临时代码段,把部分演示代码传送到预定的内存,然后转演示代 码段;
        (3)建立页目录表;
        (4)建立页表;
        (5)启用分页管理机制;
        (6)演示在分页管理机制启用后的程序执行和数据存取;
        (7)关闭分页管理机制;
        (8)退出保护模式,结束。
    实例十源程序清单如下:
    1. ;名称:ASM10.ASM  
    2. ;功能:演示使用分页管理机制  
    3. ;编译:TASM ASM10.ASM  
    4. ;连接:TLINK ASM10.OBJ  
    5. ;============================================================================  
    6. INCLUDE         386SCD.INC  
    7. ;============================================================================  
    8. PDT_AD          =       200000h ;页目录表所在物理页的地址  
    9. PT0_AD          =       202000h ;页表0所在物理页的地址  
    10. PT1_AD          =       201000h ;页表1所在物理页的地址  
    11. PhVB_AD         =       0b8000h ;物理视频缓冲区地址  
    12. LoVB_AD         =       0f0000h ;程序使用的逻辑视频缓冲区地址  
    13. MPVB_AD         =       301000h ;线性地址0B8000H所映射的物理地址  
    14. PhSC_AD         =       303000h ;部分演示代码所在内存的物理地址  
    15. LoSC_AD         =       402000h ;部分演示代码的逻辑地址  
    16. ;============================================================================  
    17. GDTSeg          SEGMENT PARA USE16                ;全局描述符表数据段(16位)  
    18. ;----------------------------------------------------------------------------  
    19.                 ;全局描述符表GDT  
    20. GDT             LABEL   BYTE  
    21.                 ;空描述符  
    22. DUMMY           Desc    <>  
    23.                 ;规范段描述符及选择子  
    24. Normal          Desc    <0ffffh,,,ATDW,,>  
    25. Normal_Sel      =       Normal-GDT  
    26.                 ;页目录表所在段描述符(在保护方式下初始化时用)及选择子  
    27. PDT             Desc    <0fffh,PDT_AD AND 0ffffh,PDT_AD SHR 16,ATDW,,>  
    28. PDT_Sel         =       PDT-GDT  
    29.                 ;页表0所在段描述符(在保护方式下初始化时用)及选择子  
    30. PT0             Desc    <0fffh,PT0_AD AND 0ffffh,PT0_AD SHR 16,ATDW,,>  
    31. PT0_Sel         =       PT0-GDT  
    32.                 ;页表1所在段描述符(在保护方式下初始化时用)及选择子  
    33. PT1             Desc    <0fffh,PT1_AD AND 0ffffh,PT1_AD SHR 16,ATDW,,>  
    34. PT1_Sel         =       PT1-GDT  
    35.                 ;逻辑视频缓冲区段描述符及选择子  
    36. LoVideo         Desc    <3999,LoVB_AD AND 0ffffh,LoVB_AD SHR 16,ATDW,,>  
    37. LoVideo_Sel     =       LoVideo-GDT  
    38.                 ;逻辑上的部分演示代码段的描述符及选择子  
    39. LoCode          Desc    <SCodeLen-1,LoSC_AD AND 0ffffh,LoSC_AD SHR 16,ATCE,,>  
    40. LoCode_Sel      =       LoCode-GDT  
    41.                 ;预定内存区域(用于部分演示代码)的段描述符及选择子  
    42. TPSCode         Desc    <SCodeLen-1,PhSC_AD AND 0ffffh,PhSC_AD SHR 16,ATDW,,>  
    43. TPSCode_Sel     =       TPSCode-GDT  
    44. ;----------------------------------------------------------------------------  
    45.                 ;以下是需额外初始化的描述符  
    46. EFFGDT          LABEL   BYTE  
    47.                 ;临时代码段描述符及选择子  
    48. TempCode        Desc    <0ffffh,TempCodeSeg,,ATCE,,>  
    49. TempCode_Sel    =       TempCode-GDT  
    50.                 ;演示代码段描述符及选择子  
    51. DemoCode        Desc    <DemoCodeLen-1,DemoCodeSeg,,ATCE,,>  
    52. DemoCode_Sel    =       DemoCode-GDT  
    53.                 ;演示任务数据段描述符及选择子  
    54. DemoData        Desc    <DemoDataLen-1,DemoDataSeg,,ATDW,,>  
    55. DemoData_Sel    =       DemoData-GDT  
    56.                 ;初始化时要移动的代码段描述符及选择子(移动时作为数据对待)  
    57. SCode           Desc    <SCodeLen-1,SCodeSeg,,ATDR,,>  
    58. SCode_Sel       =       SCode-GDT  
    59. ;----------------------------------------------------------------------------  
    60. GDTLen          =       $-GDT                     ;全局描述符表长度  
    61. GDNum           =       ($-EFFGDT)/(SIZE Desc)    ;需特殊处理的描述符数  
    62. ;----------------------------------------------------------------------------  
    63. GDTSeg          ENDS                              ;全局描述符表段定义结束  
    64. ;============================================================================  
    65. ;这部分代码在初始化时被复制到预定的内存区域,其功能是在屏幕上显示提示信息  
    66. ;----------------------------------------------------------------------------  
    67. SCodeSeg        SEGMENT PARA USE16  
    68.                 ASSUME  CS:SCodeSeg,DS:DemoDataSeg  
    69. ;----------------------------------------------------------------------------  
    70. SBegin          PROC    FAR  
    71.                 mov     ax,LoVideo_Sel  
    72.                 mov     es,ax  
    73.                 mov     di,0  
    74.                 mov     ah,17h  
    75.                 mov     cx,MessLen  
    76. S1:             lodsb  
    77.                 stosw  
    78.                 loop    S1  
    79.                 JUMP16  DemoCode_Sel,Demo3  
    80. SBegin          ENDP  
    81. ;----------------------------------------------------------------------------  
    82. MLen            =       $-SBegin  
    83. SCodeLen        =       $  
    84. SCodeSeg        ENDS  
    85. ;============================================================================  
    86. DemoDataSeg     SEGMENT PARA USE16                ;演示任务数据段  
    87. Mess            DB      'Page is OK!'  
    88. MessLen         =       $-Mess  
    89. DemoDataLen     =       $  
    90. DemoDataSeg     ENDS  
    91. ;============================================================================  
    92. DemoCodeSeg     SEGMENT PARA USE16                ;演示任务代码段  
    93.                 ASSUME  CS:DemoCodeSeg  
    94. ;----------------------------------------------------------------------------  
    95. DemoBegin       PROC    FAR  
    96.                 mov     ax,PDT_Sel  
    97.                 mov     es,ax  
    98.                 xor     di,di  
    99.                 mov     cx,1024  
    100.                 xor     eax,eax                   ;先把全部表项置成无效  
    101.                 rep     stosd                     ;再置表项0和表项1  
    102.                 mov     DWORD PTR es:[0],PT0_AD OR (USU+RWW+PL)  
    103.                 mov     DWORD PTR es:[4],PT1_AD OR (USU+RWW+PL)  
    104.                 mov     ax,PT0_Sel                ;初始化页表0  
    105.                 mov     es,ax  
    106.                 xor     di,di  
    107.                 mov     cx,1024  
    108.                 xor     eax,eax  
    109.                 or      eax,USU+RWW+PL  
    110. Demo1:          stosd  
    111.                 add     eax,1000h                 ;先全部置成对应等地址的  
    112.                 loop    Demo1                     ;物理页,再特别设置两广表项  
    113.                 mov     di,(PhVB_AD SHR 12)*4  
    114.                 mov     DWORD PTR es:[di],MPVB_AD+USS+RWW+PL  
    115.                 mov     di,(LoVB_AD SHR 12)*4  
    116.                 mov     DWORD PTR es:[di],PhVB_AD+USU+RWR+PL  
    117.                 mov     ax,PT1_Sel                ;初始化页表1  
    118.                 mov     es,ax  
    119.                 xor     di,di  
    120.                 mov     cx,1024  
    121.                 mov     eax,400000h  
    122. Demo2:          stosd                             ;先把全部表项设置为无效  
    123.                 add     eax,1000h  
    124.                 loop    Demo2                     ;再特别设置1项  
    125.                 mov     di,((LoSC_AD SHR 12)AND 3ffh)*4  
    126.                 mov     DWORD PTR es:[di],PhSC_AD+USU+RWR+PL  
    127.                 mov     eax,PDT_AD  
    128.                 mov     cr3,eax  
    129.                 mov     eax,cr0  
    130.                 or      eax,80000000h  
    131.                 mov     cr0,eax  
    132.                 jmp     SHORT PageE  
    133. PageE:          mov     ax,DemoData_Sel  
    134.                 mov     ds,ax  
    135.                 mov     si,OFFSET Mess  
    136.                 JUMP16  LoCode_Sel,SBegin  
    137. Demo3:          mov     eax,cr0  
    138.                 and     eax,7fffffffh             ;关闭分页机制  
    139.                 mov     cr0,eax  
    140.                 jmp     SHORT PageD  
    141. PageD:          mov     ax,Normal_Sel  
    142.                 JUMP16  TempCode_Sel,ToDOS  
    143. DemoBegin       ENDP  
    144. ;----------------------------------------------------------------------------  
    145. DemoCodeLen     =       $  
    146. DemoCodeSeg     ENDS  
    147. ;============================================================================  
    148. TempCodeSeg     SEGMENT PARA USE16                ;临时任务的代码段  
    149.                 ASSUME  CS:TempCodeSeg  
    150. ;----------------------------------------------------------------------------  
    151. Virtual         PROC    FAR  
    152.                 cld                               ;为演示在启用分页机制后执  
    153.                 mov     ax,SCode_Sel              ;行位于较高线性地址空间中  
    154.                 mov     ds,ax                     ;的代码作准备  
    155.                 mov     ax,TPSCode_Sel  
    156.                 mov     es,ax  
    157.                 mov     si,OFFSET SBegin  
    158.                 mov     di,si  
    159.                 mov     cx,MLen                   ;把分页演示代码复制到预定  
    160.                 rep     movsb                     ;内存  
    161.                 JUMP16  DemoCode_Sel,DemoBegin  
    162. ToDOS:          mov     ds,ax  
    163.                 mov     es,ax  
    164.                 mov     eax,cr0                   ;准备返回实模式  
    165.                 and     al,11111110b  
    166.                 mov     cr0,eax  
    167.                 JUMP16  <SEG Real>,<OFFSET Real>  
    168. Virtual         ENDP  
    169. ;----------------------------------------------------------------------------  
    170. TempCodeSeg     ENDS  
    171. ;============================================================================  
    172. RCodeSeg        SEGMENT PARA USE16                ;实方式的初始化代码和数据  
    173.                 ASSUME  CS:RCodeSeg,DS:RCodeSeg  
    174. ;----------------------------------------------------------------------------  
    175. VGDTR           PDesc   <GDTLen-1,>  
    176. ;----------------------------------------------------------------------------  
    177. Start           PROC  
    178.                 push    cs  
    179.                 pop     ds  
    180.                 cld  
    181.                 call    InitGDT                   ;初始化全局描述符表GDT  
    182.                 EnableA20  
    183.                 lgdt    QWORD PTR VGDTR           ;装载GDTR  
    184.                 cli                               ;关中断  
    185.                 mov     eax,cr0  
    186.                 or      al,1  
    187.                 mov     cr0,eax  
    188.                 JUMP16  <TempCode_Sel>,<OFFSET Virtual>  
    189. Real:           DisableA20  
    190.                 sti  
    191.                 mov     ax,4c00h  
    192.                 int     21h  
    193. Start           ENDP  
    194. ;----------------------------------------------------------------------------  
    195. InitGDT         PROC  
    196.                 push    ds  
    197.                 mov     ax,GDTSeg  
    198.                 mov     ds,ax  
    199.                 mov     cx,GDNum  
    200.                 mov     si,OFFSET EFFGDT  
    201. InitG:          mov     ax,[si].BaseL  
    202.                 movzx   eax,ax  
    203.                 shl     eax,4  
    204.                 shld    edx,eax,16  
    205.                 mov     WORD PTR [si].BaseL,ax  
    206.                 mov     BYTE PTR [si].BaseM,dl  
    207.                 mov     BYTE PTR [si].BaseH,dh  
    208.                 add     si,SIZE Desc  
    209.                 loop    InitG  
    210.                 pop     ds  
    211.                 mov     bx,16  
    212.                 mov     ax,GDTSeg  
    213.                 mul     bx  
    214.                 mov     WORD PTR VGDTR.Base,ax  
    215.                 mov     WORD PTR VGDTR.Base+2,dx  
    216.                 ret  
    217. InitGDT         ENDP  
    218. ;----------------------------------------------------------------------------  
    219. RCodeSeg        ENDS  
    220.                 END     Start  

    2.关于实例十的说明

        上述演示程序的许多内容与其它实例相同,下面仅就演示分页管理机制方面的内容作些说明:

    (1)部分演示代码的移动

        为了充分说明分页机制所实现的线性地址到物理地址的转换,在初始化时把部分演示代码移动到预定的内存区域。预定的内存区域从00303000H开始,即页码为00303H的物理页。该部分演示代码的功能是显示指定的字符串。在进入保护模式后做此初始化工作的原因是预定的内存区域 在扩展内存中,注意初始化时还没有启用分页机制。

    (2)页映射表的初始化

        页目录表安排在页码为00200H的物理页中,页表0安排在页码为00202H的物理页中,页表1安排在页码为00201H的物理页中。演示程序涉及的线性地址空间不超过007FFFFFH,所以只使用两张页表,为此页目录表中的其它项被置为无效(P=0)。
        页表0把线性地址空间中的00000000H—003FFFFFH映射到物理地址空间中。实例在初始化页表0时,使该线性地址空间直接映射到相同地址的物理地址空间,除线性地址空间中页码为000B8H和000F0H这两页以外。000B8H页被映射到页码为00301H的物理页,而000F0H页被映射到页码为000B8H的物理页。
        页表1把线性地址空间中的00400000H—007FFFFFH映射到物理地址空间中。实例在初始化页表1时,似乎使该线性地址空间直接映射到相同地址的物理地址空间,但是处理对应线性地址空间中00402H的表项被另外设置外,其它表项中的P位为0,也即表示对应物理页不存在。初始化后,页表1的第2项把线性地址空间中的00402H页映射到页码为00303H的物理页,也就是存放部 分演示代码的指定内存区域。

    (3)启动分页管理机制

        在建立好页映射表后,启用分页机制所要做的操作是简单的,只要把控制寄存器CR0中的最高 位,也就是PG位置1。具体指令如下:
    [plain] view plaincopy
    1.         mov     eax,cr0  
    2.         or      eax,80000000h  
    3.         mov     cr0,eax  
    4.         jmp     SHORT PageE  
    5. PageE:  ...  
        在启用分页机制前,线性地址就是物理地址;在启用分页机制后,线性地址要通过分页机制的转换,才成为物理地址。尽管使用一条转移指令,可清除预取队列,但随后在取指令时使用的线性地址就要经过分页机制转换才成为物理地址。为了顺利过渡,在启用分页机制之后的过渡代码段,仍要维持线性地址等同于物理地址。为了作到这一点,在建立也映射表时,必须使实现过渡的代码所在的线性地址空间页映射到具有相同地址的物理地址空间页。实例 中页表0就做到了这一点。

    (4)关闭分页管理机制

        只要把控制寄存器CR0中的PG位清0,便关闭了分页机制。在这一过渡阶段,也要保持地址转 换前后的一致。

    (5)地址转换的演示

        在启用分页机制之后,就转移到位于线性地址空间中00402000H处开始的代码,该部分代码的 功能是显示提示信息"Page is OK!"。实际上这部分代码存放在从物理地址00303000H开始的 物理内存区域中,是在初始化时被移到此区域的。
        在显示提示信息时,要把显示的ASCII字符和显示属性填到线性地址空间中000F0000H开始的区域中,而不是000B8000H开始的区域。从初始化时建立的映射表可见,线性地址空间中的000F0H页,被映射到物理地址空间中的000B8H页。所以,向线性地址空间中的000F0H页写,实际上是向物理地址空间中的000B8H页写,也就是真正显示。

    (6)页级保护的说明

        在进入保护模式之后,特权级一直是0,所以,无论系统级和用户级页,无论只能读/执行, 还是读/执行/写,总是可进行各种形式的访问。


    来源:http://blog.csdn.net/jha334201553/article/details/6708550#t1
    展开全文
  • 当然,在关机时清除Windows分页文件可能不是保证计算机物理安全的一个合适的替代方法,但有些时候我们可能仍然需要通过这个方法来增加计算机上数据的安全性。 要想在关机的过程中清除Windows分页文件,我们只需在...

          一些第三方程序可能会临时的在我们的计算机内存中存储一些未加密的密码或者是一些敏感信息,因为Windows的虚拟内存架构,这些信息会在分页文件中存在。当然,在关机时清除Windows分页文件可能不是保证计算机物理安全的一个合适的替代方法,但有些时候我们可能仍然需要通过这个方法来增加计算机上数据的安全性。

          要想在关机的过程中清除Windows分页文件,我们只需在注册表中稍加配置即可,点击清除Windows分页文件即可使用我们的自动化解决方案来帮助大家配置。

          注意:

          此解决方案适用于以下操作系统:

          Windows XP, Windows 7, Vista, Windows Server 2k8, Windows Server 2k8 R2

          如果大家想自己手动配置注册表以便在关机时清除Windows分页文件,请访问微软官方技术支持网站上提供的技术文章,大家也可以通过这篇文章提供的链接下载使用我们提供的自动化解决方案:

          http://support.microsoft.com/kb/314834/en-us

    转载于:https://www.cnblogs.com/msfixit/archive/2011/03/16/1986007.html

    展开全文
  • windows 分页缓冲池 非分页缓冲池

    千次阅读 2017-11-29 09:23:00
    最近在windows server 2012机器上在做性能测试时,发现8G物理内存,内存使用率占到了90%多,在“进程”列表中所有进程内存相加才2个多G,同时任务管理器-&gt;“性能”标签一项中,非内存缓冲池很高占到了5个多G...

    最近在windows server 2012机器上在做性能测试时,发现8G物理内存,内存使用率占到了90%多,在“进程”列表中所有进程内存相加才2个多G,同时任务管理器->“性能”标签一项中,非内存缓冲池很高占到了5个多G。

    在网上找了一些资料,说是windows8系列有内存泄露的BUG,会引起“非内存缓冲池”一直占用很高。当前系统初步怀疑可能也是这个问题。

    参考文档:

    一次DB服务器性能低下引发的对Nonpaged Pool Leak问题的诊断

     http://tieba.baidu.com/p/2728129582

     

    先使用poolmon.exe来分析哪个组件占用内存高,再对这个组件做相应的处理。

     

    对于分页缓冲池与非页面缓冲池

    PagedPool 和 NoPagedPool的区别Windows kernel pool

    1、页面一直锁定在物理内存中,不会被换出到页面交换文件中

     2、Windows把虚拟地址分为用户地址空间和系统地址空间,用户地址空间是给应用程序使用的,系统地址空间是给系统核心和驱动程序使用的。系统地址空间分为分页池和非分页池,分页池是指映射到分页文件的虚拟地址,当要使用该地址时才交换到物理内存中,由系统来调度;非分页池是指直接在物理内存中分配的内存。“页面缓冲池”就是进程占用的分页池中的虚拟内存,是进程调用某些系统功能时,由系统核心或者驱动程序分配的。如果一个程序占用的页面缓冲池内存不断增大,就是内存泄露,通常应该是创建或打开了句柄没有关闭。

     

    在perfmon计数器里统计这两个参数时,momory对象与process对象里都存在相关的值(两种pool都会被映射到每一个进程空间内)。

    Perfmon - Windows 自带系统监测工具

     

    展开全文
  • 在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管是在直接访问数据库的场景还是使用网络方式访问WCF服务获取数据,都能获得较好的效率,因此WInform程序里面的分页控件的使用是很好的一个解决...

      在我的博客里面,很多Winform程序里面都用到了分页处理,这样可以不管是在直接访问数据库的场景还是使用网络方式访问WCF服务获取数据,都能获得较好的效率,因此WInform程序里面的分页控件的使用是很好的一个解决方式,它能够快速获取数据,并将可能减少我们增加太多的代码逻辑,实现简单、高效、统一的理念。本篇主要介绍如何在分页的GridControl里面如何实现数据的统计功能。

      一般情况下,分页控件呈现分为两种方式,一种需要有分页码的真正分页处理,一种是不需要分页处理,但是列表和功能基本保持一致的界面,其实这两种情况都是对列表控件的进一步封装,以方便使用的目的。

      有分页底栏的控件界面:

    展开全文
  • 什么是PAE模式:PAE,物理地址扩展,是基于x86 的服务器的一种功能,它使运行 Windows Server 2003, Enterprise Edition 和 Windows Server 2003,Datacenter Edition 的计算机可以支持4GB 以上物理...
  • 一)先来针对未开启PAE模式来进行分析 测试机器XP 32位系统:(Dbgview.exe程序的线性(虚拟)地址与物理地址的对应)     这里关闭了PAE模式。 ...我先用OD载入Dbgview.exe程序,并且运行, ...
  • (二)针对开启PAE模式来进行分析 测试机器Win7 32位系统:(Dbgview.exe程序的线性(虚拟)地址与物理地址的对应) 根据读INTEL手册可知,开启了PAE模式后线性(虚拟)地址的结构发生了变化(开启PAE后PDE共4*4kb...
  • Windows 分页文件 环境 Windows7 64位 一、定义介绍   分页一词由Paging翻译而来。所谓的分页,其本质是对页的一种操作。页是磁盘和内存间传输数据块最小单位
  • 其实功能实现很简单。我做的是一个通用的分页控件。项目时间很紧,可能有点粗糙。欢迎大家斧正。不说了直接贴代码吧
  • Windows分页机制

    2020-06-11 11:00:34
    对于Windows分页机制, 我一直还是比较自信的, 但是今天我发现在重写NewBluePill的X64分页机制到Win32上面的时候, 居然感觉有些棘手, 看来啊, 很多东西还是不是看上去那样简单, 难点主要集中在原来倒腾没有分页的...
  • windows server 2008 ado 分页补丁
  • Windows内存分页机制

    千次阅读 2016-07-15 15:14:44
    分析下MmIsAddressValid函数, 加深下对分页机制的了解.(参考combojiang大叔) 下面是ida 看到的ntoskrnl.exe中导出的MmIsAddressValid。 .text:0040C661 ; BOOLEAN __stdcall MmIsAddressValid(PVOID ...
  • 详解Windows内存分页机制

    千次阅读 2015-03-14 13:53:07
    标 题: 【原创】详解Windows内存分页机制 作 者: 莫灰灰 时 间: 2011-06-11,19:18:49 链 接: http://bbs.pediy.com/showthread.php?t=135274 昨天新买了两本书, 看到了内存分页部分, 特此记录下,
  • If you’ve upgraded your Windows Vista computer’s memory(RAM) after you installed the memory, you may be wondering why you suddenly lost some drive space. 如果在安装内存后升级了Windows Vista计算机...
  • 推动Windows的限制:分页和非分页

    千次阅读 2018-01-31 21:27:47
    在之前的“极限”帖子中,我描述了两个最基本的系统资源,即物理内存和虚拟内存。这一次我将描述两个基本的内核资源,分页池...推动Windows的限制:物理内存推动Windows的限制:虚拟内存推动Windows的限制:分页和非...
  • Windows系统下的分段机制和分页机制一直以来困惑着我,我结合以前的博文加上最近看的一篇文章做一个小总结,以后如果有新的想法也会更新。 首先来了解下系统CPU的地址线 、数据线和工作模式: CPU型号 ...
  • 解决windows 2008在安装Symantec杀毒软件后内存溢出、内存持续升高、内存增长等问题,该安装包无法在微软官方找到。利用poolmon工具提示FWxp非分页占用内存过大。
  • Windows内核编程之:分页内存与非分页内存 Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存 有些虚拟内存永远不会交换到文件中,这些内存叫非分页内存 #define PAGEDCODE code_seg(“PAGE”...
  • Windows phone开发之分页方法

    千次阅读 2012-06-01 13:43:40
    分页方法:using System; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Ink; using System.Windows.Input; using System....
  • 4.1 分页模式和控制位 分页控制有关的寄存器 CR0 标志位:WP(bit 16)、PG(bit 31) CR4 标志位:PSE(bit 4)、PAE(bit 5)、PGE(bit 7)、PCIDE(bit 17)、SMEP(bit 20)、SMAP(bit 21)、PKE(bit 22)、...
  • Windows规定有些虚拟内存可以交换到文件中,这类内存被称为分页内存 有些虚拟内存 永远不会交换到文件中,这些内存叫非分页内存 #define PAGEDCODE code_seg(“PAGE”);//分页内存 #define LOCKEDCODE ...
  • DataGrid Web 控件有内置的自动或自定义分页功能,...本文介绍如何为 DataGrid Windows 控件生成简单的分页机制。 本文中的代码示例利用了数据集对象。在 ADO.NET 中,数据集对象是通过单次操作填充的,
  • 本文介绍了一种在Windows系统下让打印机进行连续不分页打印的方法

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,459
精华内容 28,183
关键字:

windows分页