精华内容
下载资源
问答
  • 使用 win7旗舰版系统 一段时间后,系统堆积大量程序和文件,导致内存空间不够用。有时候在运行程序时提示“您的系统内存空间不足。请保存您的文件,然后关闭一些文档或其他应用程序以释放内存。”如果内存不够用可以...

    使用 win7旗舰版系统 一段时间后,系统堆积大量程序和文件,导致内存空间不够用。有时候在运行程序时提示“您的系统内存空间不足。请保存您的文件,然后关闭一些文档或其他应用程序以释放内存。”如果内存不够用可以删除一些不常用的文件,适当增加系统内存空间。如果还是没办法解决的话,参考下面教程来解决问题。

    11376707_14671657515971_thumb.jpg

    具体方法如下:

    1、在桌面计算机处,经鼠标右键,选择“属性”,进入系统属性界面。接着我们在左侧窗口中看到“高级系统设置”,点击进入;

    eaad3a48c96e569225d428b57d70b0bf.gif

    2、在弹出的系统属性窗口中,在上面的菜单栏中切换到“高级”选项,接着在第一栏中的“性能”后面点击“投置”按钮,进入到虚拟内存的设置中;

    eaad3a48c96e569225d428b57d70b0bf.gif

    3、我们可以在性能选项中,切换到高级按钮,下面的虚拟内存,选择更改。这时候界面会再弹出一个虚拟内存的窗口;

    4、在“自动管理所有驱动器的分页文件大小”里勾选上。再点击确定。

    eaad3a48c96e569225d428b57d70b0bf.gif

    上述就是win7旗舰版系统提示“您的系统内存不足,关闭一些文档释放空间”的解决方法,遇到内存空间不够用的情况,参考上述教程设置即可。

    展开全文
  • 它主要是当电脑上的物理内存不够用时,把硬盘上的一块空间当作内存来用,用于缓解当前系统内存不足的问题。在当下电脑硬件飞速发展的今天,可能大家的电脑内存都配置比较多,比如4G,甚至是8G以上都有。如果你的内...

    在 Windows 系统上有虚拟内存这样一个功能,它是干什么的呢?它主要是当电脑上的物理内存不够用时,把硬盘上的一块空间当作内存来用,用于缓解当前系统内存不足的问题。在当下电脑硬件飞速发展的今天,可能大家的电脑内存都配置比较多,比如4G,甚至是8G以上都有。如果你的内存在4G以上的话,那是可以考虑关闭系统的虚拟内存功能。这里以 Windows 2008 系统为例,简单介绍下怎么关闭的操作方法。

    尤其是对于服务器用户来说50G的c盘,30多g的pagefile.sys文件,只要设置一下将pagefile.sys放到别的盘或者分区,c盘就非常的够用了。

    1、先请在桌面上找到“计算机”图标,如图所示

    ae3c2157bf16544a7cb340fffe4d15d1.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片1

    2、选中计算机,点击鼠标右键并选择“属性”选项,如图所示

    a0a3dbd5f204c73c5bedd272bc1f4fd1.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片2

    3、在系统的属性窗口中请点击左侧的“高级系统设置”选项,如图所示

    83166d3e9da0bf19a4a9d223df9ddb9a.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片3

    4、接着请点击性能一栏的“设置”按钮,如图所示

    eb3856d85f5077356736200419d7bbfe.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片4

    5、随后请点击顶部的“高级”栏目,如图所示

    e116f288815e52e9cddf03580f2a7c60.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片5

    6、在高级设置界面窗口中,即可看到虚拟内存选项,点击“更改”按钮继续。

    d8705d4f3552278cd7de881e73f078c0.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片6

    7、在虚拟内存的设置窗口中,请先取消“自动管理所有驱动器分页文件大小”这个选项,如图所示

    53f06be7adb95d54bd0890a944559b1d.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片7

    8、接着再点击下方的“无分页文件”选项,再点击“设置”按钮,如图所示

    e823da964819ee84c5b8c04d7404a862.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片8

    9、随后系统会提示我们是否要确认关闭虚拟内存,点击“是”按钮继续 。

    906e43123e5cf8110fce3b13105b8b72.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片9

    10、设置完成以后,一路点击“确定”按钮返回。重新启动系统以后,我们再查看当前系统的虚拟内存,发现此时已经变成 0 M,说明已经关闭了虚拟内存了。

    5b278ca3b326aa9806832e784e99a235.png

    Windows 2008 关闭系统虚拟内存功能,如何删除pagefile.sys-图片10

    展开全文
  • Windows内存管理

    千次阅读 2014-04-05 23:46:50
    Windows内存管理 在驱动程序编写中,分配和管理内存不能使用熟知的Win32API函数,取而代之的是DDK提供的高效的内核函数。程序员必须小心地使用这些内存相关的内核函数。因为在内核模式下,操作系统不会检查内存使用...

    Windows内存管理

    在驱动程序编写中,分配和管理内存不能使用熟知的Win32API函数,取而代之的是DDK提供的高效的内核函数。程序员必须小心地使用这些内存相关的内核函数。因为在内核模式下,操作系统不会检查内存使用的合法性稍有不慎就可能导致操作系统的崩溃。另外,C语言和C++中大多数关于内存操作的运行时函数,大多在内核模式下是无法使用的。

    1、内存管理概念

    编写windows驱动之前,需要读者进一步理解windows操作系统是如何管理和使用内存的。

    1.1、物理内存的概念(Physical Memory Address

    PC上有三条总线,分别是数据总线,地址总线和控制总线。32位的CPU的寻址能力为4GB2^32)个字节。用户最多可以使用4GB的真实的物理内存。PC中会拥有很多设备,其中很多设备都提供了自己的设备内存。一个设备可以有好几块设备内存映射到物理内存上。

    1.2、虚拟内存地址概念(Virtual Memory Address

    虽然可以寻址4GB的内存,而在PC里往往没有如此多的真实物理内存。操作系统和硬件为使用者提供了虚拟内存的概念。Windows的所有程序包括RIng0层和Ring3层的程序可以操作的都是虚拟内存。之所以称为虚拟内存,是因为对它的所有操作,最终会变成一系列对真实物理内存的操作。

    虚拟内存转换为物理内存:在CPU中有一个重要的寄存器CR0,它是32位的寄存器,其中的一位PG位是复制告诉系统是否分页的。Windows在启动前会将它的PG位置1,即WIndows允许分页。DDK中有个宏PAGE_SIZE记录着分页大小,一般为4KB4GB的虚拟内存会被分割成1M4GB/4KB)个分页单元。

    其中,有一部分单元会和物理内存对应起来,即虚拟内存中第N个分页单元对应着物理内存第M个分页单元。这种对应不是一一对应,而是多对一的映射,多个虚拟内存页可以映射同一个物理内存页。还有一部分单元会被映射成磁盘上的文件,并标记为脏的。读取这段虚拟内存的时候,系统会发出一个异常,此时会触发异常的处理函数,异常处理函数会将这个页的磁盘文件读入内存,并标记设置为不脏。当让经常不读写的内存页,可以交换成文件,并将此页设置为脏。还有一部分单元什么也没有对应即空的。

    大部分的虚拟内存是没有被映射到物理内存上的。

     

    这样的设计基于以下两个原因:

    第一是虚拟的增加了内存的大小。不管PC是否有足够的4GB的物理内存,操作系统总会有4GB的虚拟内存。这就允许使用者申请更多的内存,当物理内存不够时,可以通过将不常用的虚拟内存页交换成文件,等需要的时候再去读取。

    第二是使不同进程的虚拟内存互不干扰,为了让系统可以同时运行不同的进程,windows操作系统让每个进程看到的虚拟内存都不同。这个方法就使得不同的进程会有不同的物理内存到虚拟内存的映射。

    1.3、用户模式地址和内核模式地址

    虚拟地址在0~0X7FFFFFFF范围内的虚拟内存,即低2GB的虚拟内存地址,被称为用户模式地址。而0X80000000~0XFFFFFFF范围内的虚拟内存,即高2GB的虚拟内存,被称为内核模式地址。WIndows规定运行在用户态Ring3层的程序只能访问用户模式地址,而运行在核心态Ring0层的程序,可以访问整个4GB的虚拟内存,即用户模式地址和内核模式地址。Windows的核心代码和Windows的驱动程序加载的位置都是在高2GB的内核地址里,所以一般的应用程序是不能访问到这新核心代码和重要数据的,这大大提高了系统的稳健性。同时,Windows操作系统在进程切换时,保存内核模式地址是完全相同的。也就是说,所有进程的内核地址映射完全一致,进程切换的时候,只改变用户模式地址的映射。

    1.4Windows驱动程序和进程的关系

    驱动程序可以看成是一个特殊的DLL文件被应用程序加载到虚拟内存中,只不过加载地址是内核模式地址,而不是用户模式地址。他能访问的只是这个进程的虚拟内存,而不能是其他进程的虚拟内存。需要指出的是,Windows驱动程序里的不同例程运行在不同的进程中。DriverEntry例程和AddDevice例程是运行在系统(System)进程中的。System进程是Windows中非常重要的进程,也是Windows第一个运行的进程。当需要加载的时候,System进程中会有一个线程将驱动程序加载到内核模式地址空间内,并调用DriverEntry例程。

    其他一些例程,例如IRP_MJ_READIRP_MJ_WRITE的派遣函数会运行与应用程序的“上下文”中。所谓运行在进程的“上下文”,指的是运行于某个进程的环境中,所能访问的虚拟地址是这个进程的虚拟地址。

    VOID DisplayItsProcessName()

    {

    //得到当前进程

    PEPROCESS pEProcess = PsGetCurrentProcess();

    //得到当前进程名称

    PTSTR ProcessName = (PTSTR)((ULONG)pEProcess+0x174);

    KdPrint(("%s\n",ProcessName));

    }

    1.5、分页与非分页内存

    前面介绍了虚拟内存页与物理内存页之间的关系,Windows规定有些虚拟内存页面是可以交换到文件中的,这类内存被称为分页内存。而有些虚拟内存页永远不会交换到文件中,这些内存被称为非分页内存。

    当程序的中断请求级在DISPATCH_LEVEL之上(包括DISPATCH_LEVEL)时,程序只能使用非分页内存,否则将导致蓝屏死机。

    如果将某个函数载入到分页内存中,我们需要在函数的实现中加入以下代码:

    #pragma PAGEDCODE

    VOID SomeFunction()

    {

    PAGED_CODE();

    //do something

    }

    PAGED_CODE()DDK提供的宏,他只在check版本中生效。它会检验这个函数是否运行低于DISOATCH_LEVEL的中断请求级,如果等于或者高于这个中断请求级,将产生一个断言。

    如果让函数加载到非分页内存中,需要在内存的实现中加入以下代码:

    #pragma LOCKEDCODE

    VOID SomeFunction()

    {

    //do something

    }

    还有一种特殊情况,就是某个例程需要在初始化的时候载入内存,然后就可以从内存中卸载掉。这种情况只出现在DriverEntry情况下。尤其是NT式的驱动,DriverEntry会很长,占据很大的空间,为了节省内存,需要及时地从内存中卸载掉。代码如下:

    #pragma INITCODE

    Extern C NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING RegistryPath)

    {

    //do something

    }

     

    1.6、分配内核内存

    Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约。和应用程序一样,局部变量是存放在栈空间中的。但栈空间不会像应用程序那么大,所以驱动程序不适合递归或者局部变量是大型结构体。如果需要大型结构体,请在堆中申请。

    堆中申请内存的函数有以下几个:

    PVOID 
      ExAllocatePool(
        IN POOL_TYPE  PoolType,
        IN SIZE_T  NumberOfBytes
        );

     

    PVOID 
      ExAllocatePoolWithTag(
        IN POOL_TYPE  PoolType,
        IN SIZE_T  NumberOfBytes,
        IN ULONG  Tag
        );

     

    PVOID 
      ExAllocatePoolWithQuota(
        IN POOL_TYPE  PoolType,
        IN SIZE_T  NumberOfBytes
        );

     

    PVOID 
      ExAllocatePoolWithQuotaTag(
        IN POOL_TYPE  PoolType,
        IN SIZE_T  NumberOfBytes,
        IN ULONG  Tag
        );

     

    PoolType是个枚举变量,如果此值为NonPagedPool,则分配非分页内存,如果此值为PagedPool,则分配内存为分页内存。

    NumberOfByte是分配内存的大小,最好是4的倍数

    返回值分配的内存地址,一定是内核模式地址,如果返回0表示分配失败

    以上四个函数功能类似,函数以WithQuota结尾的代表分配的时候按配额分配。函数以WithTag结尾的函数和ExAllocatePool功能类似,唯一不同的是多了一个Tag参数,系统在要求的内存外有额外地分配了4个字节的标签,在调试的时候,可以找出是否有标有这个标签的内存没有被释放。

    将分配的内存,进行回收的函数是ExFreePoolExFreePoolWithTag

    VOID 
      ExFreePool(
        IN PVOID  P
        );

     

    NTKERNELAPI
    VOID
      ExFreePoolWithTag(
        IN PVOID  P,
        IN ULONG  Tag 
        ); 

     

    2、在驱动中使用链表

    在驱动程序开发中,经常使用链表这种数据结构,DDK为用户提供两种链表的数据结构,简化了对链表的操作。

    链表中可以记录将整型,浮点,字符型或者程序员自定义的数据结构。链表通过指针将这些数据结构组成一条“链”,链中每个袁术对应着记录的数据。对于单向链表,每个元素中有一个Next指针指向下一个元素。对于双向链表,每个元素有两个指针,指向前驱元素BLINK和后继元素FLINK。本节以双向链表为例:

    2.1、链表结构

     

    2.2、链表初始化

    初次使用时需要初始化,主要将链表头的FLinkBLink两个指针都指向自己。这意味着链表头所代表的链是空链。使用InitializeListHead宏实现初始化。

    2.3、从首部插入链表

    对链表的插入有两种方式,一种是在链表的头部插入,一种是在链表的尾部插入。在头部插入链表使用语句InsertHeadList,用法:

    InsertHeadList(&head,&mydata->ListEntry);

    HeadLIST_ENTRY结构的链表头,mydata是用户定义的数据结构,而他的子域ListEntry是包含其中的LIST_ENTRY数据结构。

    2.4、从尾部插入链表

    在尾部插入链表使用语句InsertTailList(&head,&mydata->ListEntry);

    2.5、从链表删除

    a)、从链表头删除RemoveHeadList

    b)、从链表尾删除RemoveTailList

    //链表的操作

    VOID LinkListTest()

    {

    LIST_ENTRY linkListHead;

    //初始化链表

    InitializeListHead(&linkListHead);

    PMYDATASTRUCT pData;

    ULONG i=0;

    KdPrint(("Begin insert to link list"));

    //在链表中插入10个元素

    for(i=0;i<10;i++)

    {

    //分配分页内存

    pData = (PMYDATASTRUCT)ExAllocatePool(PagedPool,sizeof(MYDADASTRUCT));

    pData->number = i;

    //从头部插入链表

    InsertHeadList(&linkListHead,&pData->ListEntry);

    }

    //从链表中取出,并显示

    KdPrint(("Begin remove from link\n"));

    while(!IsListEmpty(&linkListHead))

    {

    //从尾部删除一个元素

    PLIST_ENTRY pEntry = RemoveTailList(&linkListHead);

    pData = CONTAAINING_RECORD(pEntry,MYDATASTRUCT,ListEntry);

    KdPrint(("%d\n",pData->number));

    ExFreePool(pData);

    }

    }

     

    3、Lookaside结构

    频繁申请和回收内存,会导致在内存上产生大量的内存“空洞”,从而导致最终无法申请内存。DDK为程序员提供了Lookaside结构来解决这个问题。

    3.1、频发申请内存的弊端

    频繁地申请内存,会导致一个问题,就是在内存中产生“空洞”,即内存碎片。如果系统中存在大量的内存碎片,即使内存中有大量的可用内存,也会导致申请内存失败。在操作系统空闲时,系统会整理内存碎片,将其合并。

    3.2、使用Lookaside

    如果驱动程序需要频繁地从内存中申请、回收固定大小的内存,DDK提供了一种机制来解决,即使用Lookaside对象。

    可以将Lookaside对象想象成一个内存容器。在初始的时候,它先向Windows申请了一块比较大的内存。以后程序员每次申请内存的时候,不是直接向Windows申请 内存,而是向Lookaside申请内存。Lookaside对象会智能地避免产生内存碎片。如果有Lookaside对象内部的内存不够用时,他会向操作系统申请更多的内存。当Lookaside对象内部有大量的未使用的内存时,他会自动让Windows回收一部分内存,总之,Lookaside是一个自动的内存分配容器。通过对Lookaside对象申请内存,效率要高于直接向windows申请内存。Lookaside一般会在以下情况使用:

    a)、程序员每次申请固定大小的内存。

    b)、申请和回收的操作十分频繁。

    初始化Lookaside对象:

    VOID 
      ExInitializeNPagedLookasideList(
        IN PNPAGED_LOOKASIDE_LIST  Lookaside,
        IN PALLOCATE_FUNCTION  Allocate  OPTIONAL,
        IN PFREE_FUNCTION  Free  OPTIONAL,
        IN ULONG  Flags,
        IN SIZE_T  Size,
        IN ULONG  Tag,
        IN USHORT  Depth
        );

     

    VOID 
      ExInitializePagedLookasideList(
        IN PPAGED_LOOKASIDE_LIST  Lookaside,
        IN PALLOCATE_FUNCTION  Allocate  OPTIONAL,
        IN PFREE_FUNCTION  Free  OPTIONAL,
        IN ULONG  Flags,
        IN SIZE_T  Size,
        IN ULONG  Tag,
        IN USHORT  Depth
        );

    这两个函数分别是对非分页和分页Lookaside对象进行初始化。初始化完成后,可以进行申请内存操作:

    PVOID 
      ExAllocateFromNPagedLookasideList(
        IN PNPAGED_LOOKASIDE_LIST  Lookaside
        );

     

    PVOID 
      ExAllocateFromPagedLookasideList(
        IN PPAGED_LOOKASIDE_LIST  Lookaside
        );

    这两个函数分别是对非分页和分页内存的申请

    VOID 
      ExFreeToNPagedLookasideList(
        IN PNPAGED_LOOKASIDE_LIST  Lookaside,
        IN PVOID  Entry
        );

     

    VOID 
      ExFreeToPagedLookasideList(
        IN PPAGED_LOOKASIDE_LIST  Lookaside,
        IN PVOID  Entry
        );

    这两个函数分别是对非分页内存和分页内存的回收。

    VOID 
      ExDeleteNPagedLookasideList(
        IN PNPAGED_LOOKASIDE_LIST  Lookaside
        );

     

    VOID 
      ExDeletePagedLookasideList(
        IN PPAGED_LOOKASIDE_LIST  Lookaside
        );

    以上两个函数分别是对非分页和分页Lookaside对象的删除

     

    4、运行时函数

    一般编译器厂商,在发布其编译器的同时,会将运行时函数一起发布给用户。运行时函数是程序运行的时候必不可少的,它有编译器提供。针对不同的操作系统,运行时函数的实现方法不同,但接口基本保持一致。例如:malloc函数就是典型的运行时函数,所有编译器厂商都必须提供这个函数,它在不同操作系统上的实现方法就不尽相同。

    4.1、内存间复制(非重叠)

    在驱动程序开发中,经常用到内存的复制。例如,将需要的内容,从缓冲区复制到显卡内存中。DDK为程序提供了以下函数:

    VOID 
      RtlCopyMemory(
        IN VOID UNALIGNED  *Destination,//表示要复制内存的目的地址
        IN CONST VOID UNALIGNED  *Source,//表示要复制内存的源地址
        IN SIZE_T  Length//表示要复制内存的长度,单位为字节
        );

     

    4.2、内存间复制(可重叠)

    RtlCopyMemory可以复制内存,但其内部没有考虑内存重叠的情况。RtlCopyMemory函数的内部实现方式是依靠memcpy函数实现的。不能保证重叠部分是否被复制。

    为了保证重叠部分也被正确复制,C99规定memmove函数完成这个任务。这个函数对两个内存是否重叠进行了判断,这个判断却牺牲了速度。DDK用宏对memmove进行了封装,名称变为RtlMoveMemory

    VOID 
      RtlMoveMemory(
        IN VOID UNALIGNED  *Destination,
        IN CONST VOID UNALIGNED  *Source,
        IN SIZE_T  Length
        );

     

    4.3、填充内存

    驱动程序开发中,还经常用到对某段内存区域用固定字节填充。DDK为程序员提供了函数RtlFillMemory

    VOID 
      RtlFillMemory(
        IN VOID UNALIGNED  *Destination,
        IN SIZE_T  Length,
        IN UCHAR  Fill
        );

     

    在驱动程序开发中,还经常要对某段内存填零,DDK提供了宏RtlZeroMemoryRtlZeroByte

    VOID 
      RtlZeroMemory(
        IN VOID UNALIGNED  *Destination,
        IN SIZE_T  Length
        );

    VOID 
      RtlZeroBytes( 
        PVOID  Destination, 
        SIZE_T  Length 
        );

    4.4、内存比较

    驱动程序开发中,还会用到比较两块内存是否一致。该函数是RtlCompareMemory

    SIZE_T 
      RtlCompareMemory(
        IN CONST VOID  *Source1,
        IN CONST VOID  *Source2,
        IN SIZE_T  Length
        );

     

    4.5、关于运行时函数使用的注意事项

    DDK提供的标准的运行时函数名都是RtlXX形式。其中,大部分是以宏的形式给出。

    5、使用C++特性分配内存

    C++语言中分配内存时,可以使用new操作符,回收内存时使用delete操作符。但是在驱动程序开发中,使用newdelete操作符,将得到错误的链接指示。

    6、其他

    6.1、数据类型

    C语言的数据类型和DDK中对应的数据类型

     

    DDK中又添加了一种64位的无符号长整型整数,范围0~2^64-1,用LONGLONG类型表示,后面加上i64

    使用如下:

    LONGLONG val = 100i64;

    这种64位整数支持加减乘除等运算。

    还有一种64位的表示方法LARGE_INTEGER数据结构。

    定义如下:

    Typedef union _LARGE_INTEGER{

    Struct{

    ULONG LowPart;

    ULONG HighPart

    };

    Struct{

    ULONG LowPart;

    ULONG HighPart

    }u;

    LONGLONG QuadPart

     

    }

    LARGE_INTEGER是个联合体,这种设计非常巧妙。联合体中的三个元素可以认为是LARGE_INTEGER的三个定义。可以认为是由两个部分组分。一个是低32位的整数LowPart,一个是高32位的整数HighPart

    LARGE_INTEGER LargeValue;

    LargeValue.LowPart=100;

    LargeValue.HighPart = 0;

    6.2、返回状态值

    DDK大部分函数返回类型是NTSTATUS类型,查看DDK.h文件,可以看到

    typedef LONG NTSTATUS;

    NTSTATUS的定义和LONG等价。为了函数的形式统一,所有的函数的返回值都是NTSTATUS类型。

     

     

    6.3、检查内存可用性

    在驱动程序开发中,对内存的操作要格外小心。如果某段内存是只读的,而驱动程序试图去写操作,会导致系统的崩溃。同样,当某段内存不可读的情况下,驱动程序试图去读,同样会导致系统的崩溃。

    DDK提供了两个函数帮助程序员在不知道某段内存是否可读写的情况下试探内存可读写性。ProbeForReadProbeForWrite

    VOID 
      ProbeForRead(
        IN CONST VOID  *Address,
        IN SIZE_T  Length,
        IN ULONG  Alignment
        );

     

    VOID 
      ProbeForWrite(
        IN CONST VOID  *Address,
        IN SIZE_T  Length,
        IN ULONG  Alignment
        );

    Address:需要被检查的内存的地址

    Length:需要被检查的内存的长度,单位是字节

    Alignment:描述该段内存是多少字节对齐的

     

    6.4、结构化异常处理(try-except块)

    结构化异常处理是微软编译器提供的独特处理机制,这种处理方式能在一定程度上出现错误的情况下,免于程序崩溃。为了说明结构化异常,有两个概念需要说明一下:

    a)、异常:异常的概念类似于中断的概念,当程序中某种错误触发一个异常,操作系统会寻找处理这个异常的处理函数。如果程序提供错误处理函数,则进入错误处理函数,如果没有提供,则有操作系统的默认错误处理函数处理。在内核模式下,操作系统默认处理错误的办法往往很简单,直接让系统蓝屏,并在蓝屏上简单描述出错信息,之后系统就进入死机状态。所以一般程序员需要自己设置异常处理函数。

    b)、回卷:程序执行到某个地方出现异常错误时,系统会寻找出错点是否处于一个try{}块中,并进入try块提供才异常处理程序代码。如果当前try块没有提供异常处理,则会向更外一层的try块,寻找异常处理代码,直到最外层try{}块也没有提供异常处理程序代码,则交个操作系统处理。

    这种向更外一层寻找异常处理的机制,被成为回卷。一般处理异常,是通过try-except块来处理的。

    6.5、结构化异常处理(try-finally块)

    结构化异常处理的另外一种使用方法就是利用try-finally块,强迫函数在退出前执行一段代码。

    6.6、使用宏需要注意的地方

    宏一般由多行组成,用“\”代表换行。

    6.7、断言

    在驱动程序开发中,还有一个技巧,就是使用“断言”,在驱动程序使用“断言”,一般是通过使用ASSERT宏。

    ASSERT(表达式);

    如果表达式返回FALSE,表示断言失败,会引发一个异常。

    7、小结

    本章围绕着驱动程序中的内存操作进行了介绍,在驱动程序开发中,首先要注意分页内存和非分页内存的使用。同时,还需要区分物理内存地址和虚拟内存地址这两个概念。

    在驱动程序开发中,还会经常使用单向链表和双向链表等数据结构,本章对这些数据结构的使用进行了介绍。另外,在驱动程序开发中,内存复制,内存搬移,内存填充和应用程序有所区别,要使用DDK提供专用的内核函数,而不能使用C语言提供的运行时函数。

     

    以上内容参考自张帆 史彩成等编著的《Windows 驱动开发技术详解》第五章

    展开全文
  • 很多小伙伴都遇到过win7系统电脑总是提示“计算机的内存不足”的困惑吧,一些朋友看过网上零散的win7系统电脑总是提示“计算机的内存不足”的处理方法,并没有完完全全明白win7系统电脑总是提示“计算机的内存不足”...

    很多小伙伴都遇到过win7系统电脑总是提示“计算机的内存不足”的困惑吧,一些朋友看过网上零散的win7系统电脑总是提示“计算机的内存不足”的处理方法,并没有完完全全明白win7系统电脑总是提示“计算机的内存不足”是如何解决的,今天小编准备了简单的解决办法,只需要按照①关闭不需要的应用软件。 ②删除剪贴板中的内容。删除方法是打开“开始—所有程序一附件一剪贴板查看器”,接着在“剪贴板查看器”窗口中用鼠标单击“编辑”菜单,选择“删除剪贴板内容”命令即可。的顺序即可轻松解决,具体的win7系统电脑总是提示“计算机的内存不足”教程就在下文,一起来看看吧!

    1HR62c1-0.png

    1、系统提示“内存不足”的原因分析

    “内存不足”故障的原因主要包括如下几个。

    ①  同时运行的应用程序太多。

    ②  硬盘剩余空间太少。

    ③  系统中的“虚拟内存”设置太少。

    ④  运行的程序太大。

    ⑤  笔记本电脑感染了病毒。

    2、系统提示“内存不足”的解决办法

    系统出现“内存不足”故障后,可以按照如下方法解决。

    ①关闭不需要的应用软件。

    ②删除剪贴板中的内容。删除方法是打开“开始—所有程序一附件一剪贴板查看器”,接着在“剪贴板查看器”窗口中用鼠标单击“编辑”菜单,选择“删除剪贴板内容”命令即可。

    ③设置注册表自动关闭失去响应的程序。“系统资源”是一些小内存区,Windows用它们来存储已打开的窗口、对话框和桌面配置(如“墙纸”)等的位置和大小。如果你的“系统资源”用完了,即使笔记本电脑中仍有几兆的内存,Windows依然会显示“内存不足”的信息。这时可以让系统自动关闭失去响应的程序和卸载内存中没用的DLL文件,设置方法是首先在“运行”对话框中输入“regedit",然后单击“确定”按钮,打开“注册表编辑器”,接着在注册表编辑器中单击左边的HKEY—LOCAL MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersionYExplorer,在右侧的窗格中新建一个字符串值AlwaysUnloadDLL,将其值设置为“1”,然后关闭注册表编辑器,重启计算机即可生效。此后系统会自动关闭失去响应的程序和卸载内存中没用的DLL文件,释放内存。

    ④  增加系统的虚拟内存。如果系统中的虚拟内存太少,在系统运行的程序较多时,就会出现“内存不足”的错误提示。增加虚拟内存的方法参见前面章节。

    ⑤  重新启动笔记本电脑系统会释放以前占用的内存,逦常会解决“内存不足”的故障。

    展开全文
  • 我推荐做开发的朋友:赶快加入8G的行列吧....呵呵..超爽...速度超快...基本没有等待的概念......     ...为什么要使用8G内存?在国内外各大论坛上,这都是一个有争议的问题。...除了少数专业领域,大多数应用程序... 8G内存
  • windows底层内存管理技术

    千次阅读 2009-10-16 09:27:00
    1.1. 物理地址在物理存储器上的内存地址,一般由内核管理,应用程序无法直接得到。1.2. 虚拟地址在进程私有空间中的地址,即应用程序指针所指向的地址值。1.3. 寻址空间进程所能够...2. windows内存结构2.1. 虚拟地址空
  • windows XP vista 及windows 7系统的电脑有时候会出现系统提示“内存不足”,这是由多方面原因造成的。本文具体分析下故障出现的原因及解决方法。 一、剪贴板占用了太多的内存 实际上,剪贴板是内存中的一块临时...
  • Windows系统内存计数器理解解析

    千次阅读 2015-04-16 09:08:38
    说明:本文的计数器以Windows2003为准。 序言 内存的使用情况是系统性能中重要的因素之一,频繁的页交换及内存泄露都会影响到系统的性能。本文主要是描述内存的一些概念、计数器含义,以及可能存在的性能瓶颈。 ...
  • Windows是一个多任务的操作系统,由于同时可以运行多个任务,因此Windows必须小心地管理系统的存储空间,以便一个应用程序对内存的要求得到满足的同时不会影响其他任务的执行。  尽管微处理机向物理内存写或读都是...
  • 史上最详细的虚拟机VMware12安装Windows7教程

    万次阅读 多人点赞 2018-08-21 11:45:36
    摘要: VMware是一个强大的虚拟机,可以在一台电脑上模拟真实的...但是优化的过程可能阉割了某些系统的文件,或者被植入一些广告等,文本一步步详细说明如何利用VMware12安装一个Win7系统,虚拟机win7镜像文件iso...
  • Windows 7

    千次阅读 2010-03-31 19:00:00
    系统简介 系统名称:Windows 7 核心版本号:Windows NT 6.1 开发代号:Blackcomb及Windows Vienna 测试历史: 2007年12月20日 :windows 7 Milestone1(build 6519.1) 2008年12月12日 :windows 7 beta...
  • 是不是总觉得自己的系统内存不够用,或者明明没用完却没什么实用效率,除了增大内存之外还有没有什么别的方法优化呢?  Windows系统内存技巧优化的绿色系统收藏九个要点:  如何进行内存优化的管理,提高内存的...
  •  一、当C盘空间不足时,首先使用系统工具删除一些临时文件,步骤如下: 依次选择:开始——所有程序——附件——系统工具——磁盘清理——当前默认驱动器是C盘——确定——勾选择要删除的文件——删除。...
  • 1. Windows平台下主要的内存管理途径 申请 释放 new delete malloc free CoTaskMemAlloc CoTaskMemFree IMalloc::alloc IMalloc/free ...
  • Windows 7 下安装Ubuntu14.04

    千次阅读 2016-12-14 15:50:41
    Windows 7 下安装 Ubuntu 14.04
  • 电脑上的windows图片查看器提示内存不足如何解决电脑上的windows图片查看器提示内存不足的原因跟连接的打印机有关,一起来看看吧。1. 打开电脑,进入桌面,点击左下角的搜索框,然后在打开的窗口中,点击“设置”...
  • ”指令引用的“0x00000000”内存,该内存不能为“read”或“written”」,然后应用程序被关闭。 如果去请教一些「高手」,得到的回答往往是「Windows就是这样不稳定」之类的义愤和不屑。其实,这个错误并不一定是...
  • Windows7&Windows2008 C盘空间扩展

    千次阅读 2014-12-02 16:44:29
    大家常会遇到C盘不够用,变红色. 系统其实自代了扩展工具   ...3.删除D盘(如果删不了,是不是设过虚拟内存到D盘,请设回C盘) 4.C盘上右键扩展可以点击了. 5.C盘扩展完,把余的新建盘D 把原来数据Co
  • Win7系统一直被认为是最安全的操作系统,但是在这个Win7系统上也是有发生很多的问题的,就比如的Win7系统上在工作一段时候后就会弹出内存不足。让我们一起看看解决办法吧! 第一步:查看系统和软件所占用的内存情况...
  • 目录 ...先来理解下SWAP是什么,这是Linux中的虚拟内存,用于扩充物理内存不足而用来存储临时数据存在的。它类似于Windows中的虚拟内存。在Windows中,只可以使用文件来当作虚拟内存。而linux可以文...
  • 出处:http://www.duote.com/tech/2/3006_3.html  Windows 7已经正式和大家见面了,微软公布了电脑硬件需求,表示要运行Windows7,硬盘为16GB(32位系统)或者20GB(64位系统),内存要求为1GB(32位)/2GB内存(6
  • Windows下安全删除Ubuntu

    2014-01-05 13:44:12
    本人:win7系统下删除U盘安装的ubuntu (1) 启动Windows系统 (2) 下载Mbrfix(回复windows启动的小工具) (3) 解压到你的系统目录(一般是c:\) (4) 打开Windows命令行(开始/程序/附件/命令提示符) ...
  • 灌装Windows7到VHD

    千次阅读 2012-02-09 13:33:52
    Imagex灌装Windows7到VHD,差分VHD还原保护,BCDEDIT创建XP&Windows7多系统引导 Windows7/Windows2008 R2 差分VHD 还原保护 BCDEDIT 【本文前面实际操作部分为原创,转载请联系。后续资料部分来至网络,未经...
  • 转自: ...1. 物理内存概念(Physical Memory Address)  PC上有三条总线,分别是数据总线、地址总线和控制总线。32位CPU的寻址能力为4GB(2的32次方)个字节。用户最多可以使用4GB的真实物理内存。P
  • 释放Windows7空间全攻略

    千次阅读 2012-07-14 22:03:32
    win7RTM发布之后,很多朋友都装上了windows7系统,但是windows7系统没有winxp那么苗条,刚装完的windows7新系统在没有装任何软件的情况下占用的硬盘空间都已经达到了10G以上。笔者对微软的系统有所研究,发现系统盘...
  • jvm探查内存不足/内存泄漏问题

    千次阅读 2010-10-09 10:52:00
    <br />探查内存不足/内存泄漏问题   问题描述 内存不足 (OOM) - 由于 java 堆或本地内存中的内存耗尽,应用程序显示“内存不足”错误。 内存泄漏 - java 堆或本地内存的持续内存增长...
  • windows7 安装向导

    千次阅读 2014-10-24 23:09:48
    开篇我们附上最符合本吧主题的Windows 7微软原版无修改的系统镜像下载地址: Windows 764位旗舰版 ed2k://|file|cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso|3420557312|B58548681854236C7939003B583A...
  • 装系统——windows7

    千次阅读 2010-11-01 13:40:00
    以下是本人装windows7的过程中用到的资源或者...更改为最佳性能(节省内存)计算机属性——高级——性能——最佳性能更改为XP的快速启动栏(习惯啊~)用惯了XP的快速启动,感觉Windows7的超级工具栏不怎么好用(对于我

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,436
精华内容 22,174
关键字:

windows7内存不足怎么删除