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链表

  • 相关阅读:
    c++命名空间重命名
    ssh保持长连接的配置方法
    macos平台上使用 sed
    c++的使用
    NAT介绍以及穿透各种类型nat的技术实现包括对称型nat
    组态图绘制软件的实现
    关于五防系统
    Linux的应用
    java常用包及其类概述
    springboot整合redis
  • 原文地址:https://www.cnblogs.com/Safe3/p/1512941.html
Copyright © 2011-2022 走看看