zoukankan      html  css  js  c++  java
  • 驱动研究日记-链表+后备链表

    链表的使用:

    ①     定义一个链表头,单链表为SINGLE_LIST_ENTRY,双链表为LIST_ENTRY。然后要对链表头进行初始化。单链表链表头初始化要将它的Next域设为NULL,双链表直接调用InitializeListHead。

    ②     往链表中插入元素:

    对于单链表使用PushEntryList双链表可以从链表头也可以从链表尾插入:InsertHeadList,InsertTailList。这三个函数都有两个参数,第一个参数为指向链表头的指针,第二个参数为要插入的元素的链接域。

    ③     从链表中删除元素:

    与插入元素类似,单链表使用PtryList,双链表使用RemoveEntryList,RemoveHeadList,RemoveTailList。他们的参数都是指向链表头的指针。

    ④     为了得到链表中的元素,我们使用CONTAINING_RECORD宏。

     后备链表        

             如果你需要固定尺寸的内存块,但是你事先并不知道它的大小和使用频率,这样的话为了性能的原因,你还是使用后备列表(Lookaside Lists)吧,后备列表是只有内核模式才有的。
              后备列表是一组事先分配的相同尺寸的内存块。这些块有些在使用,有些没被使用。当有内存分配请求的时候,系统会遍历这个列表寻找最近的未分配的块。如果未分配的块找到了,分配请求就很快被满足了。否则系统必须从分页或不分页内存池去分配。根据列表中分配行为发生的频率,系统会自动调整未分配块的数量来满足分配请求,分配的频率越高,会有越多的块被存储在后备列表中。后备列表如果总是不被使用,也会自动减少空间大小。

           

            使用后备链表:

    ①     为一个PAGED_LOOKASIDE_LIST或NPAGED_LOOKASIDE_LIST对象保留非分页内存。

             这里这两种对象都是用来管理后备链表,它本身只能位于非分页内存,因为系统需要在提升的IRQL级上访问它。这两个对象十分相似,但分页类型的链表使用FAST_MUTEX来同步,而非分页类型的链表要使用自旋锁。

    ②     调用相应的初始化函数对Lookaside链表进行初始化。

    ③     从Lookaside链表上面分配存储,使用AllocateFrom()函数。

    ④     使用完之后,将从Lookaside上面申请的存储空间返回Lookaside。

    ⑤     调用Delete函数删除链表。

    服务函数

    描述

    ExInitializeNPagedLookasideList
    ExInitializePagedLookasideList

    初始化lookaside链表

    ExAllocateFromNPagedLookasideList
    ExAllocateFromPagedLookasideList

    分配一个固定大小的内存块

    ExFreeToNPagedLookasideList
    ExFreeToPagedLookasideList

    将一个内存块释放回lookaside链表

    ExDeleteNPagedLookasideList
    ExDeletePagedLookasideList

    删除lookaside链表

  • 相关阅读:
    IL汇编语言介绍(译)
    开源搜索框架Lucene学习系列
    【转】autoHeight为true的时候,autoScroll为true就不起作用了
    [转]反注册 Regsvr32命令应用大全
    [转]sun.misc.BASE64Encoder找不到的解决方法
    mysql数据库导入导出
    【转】MySQL 与MS SQL Server数据库使用多表关联Update时语法的区别
    CRT detected that the application wrote to memory after end of heap buffer
    魔兽争霸窗口化
    GROUP_CONCAT函数
  • 原文地址:https://www.cnblogs.com/Safe3/p/1512941.html
Copyright © 2011-2022 走看看