Ring0 - Lookaside结构

Posted 生如逆旅 一苇以航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ring0 - Lookaside结构相关的知识,希望对你有一定的参考价值。

由于频繁的申请,回收内存会导致在内存上产生大量的内存"空洞".
这时使用Lookaside.
1.每次申请固定大小的内存.
2.申请和回收的操作十分频繁.
实现原理:
他先向windows申请了一块比较大的内存.而后以后申请内存都从Lookaside对象申请.这样就会避免内存"空洞",Lookaside对象内部的内存不够用时,他会向操作系统申请更多内存.当Lookaside内部有大量的未使用的内存时,他会自动让windows回收一部分内存.总之Lookaside是一个自动的内存分配容器。通过对Lookaside对象申请内存,效率要高于直接向windows申请内存。


初始化Lookaside

//分页
VOID
ExInitializePagedLookasideList (
_Out_ PPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
_In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
_In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
_In_ ULONG Flags, //必须为0
_In_ SIZE_T Size,
_In_ ULONG Tag, //随便写
_In_ USHORT Depth //保留.必须是零.

);

 

//不分页
VOID
ExInitializeNPagedLookasideList (
_Out_ PNPAGED_LOOKASIDE_LIST Lookaside, //注意64位中必须16字节对齐
_In_opt_ PALLOCATE_FUNCTION Allocate, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
_In_opt_ PFREE_FUNCTION Free, //后续调用ExFreeToPagedLookasideList自动释放给定的条目
_In_ ULONG Flags, //必须为0
_In_ SIZE_T Size, //每个非分页条目的大小,即字节的大小
_In_ ULONG Tag,
_In_ USHORT Depth //保留.必须是零
);

  1 #include <ntifs.h>
  2 
  3 
  4 
  5 
  6 typedef struct _ITEM_
  7 {
  8     ULONG ItemData;
  9 }ITEM, *PITEM;
 10 
 11 
 12 void LookasideTest();
 13 
 14 
 15 VOID DriverUnload(PDRIVER_OBJECT DriverObject);
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 #include "Lookaside.h"
 28 
 29 //bp Lookaside!DriverEntry
 30 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
 31 {
 32     NTSTATUS Status = STATUS_SUCCESS;
 33     PDEVICE_OBJECT  DeviceObject = NULL;
 34     
 35     DriverObject->DriverUnload = DriverUnload;
 36     
 37 
 38     LookasideTest();
 39 
 40 
 41     
 42     return Status;
 43 }
 44 
 45 
 46 void LookasideTest()
 47 {
 48     //初始化Lookaside对象
 49     int i = 0;
 50     PAGED_LOOKASIDE_LIST PagedLookasideList;
 51     
 52     ExInitializePagedLookasideList(
 53         &PagedLookasideList, 
 54         NULL, //NULL时,后续调用函数(ExAllocateFromPagedLookasideList)自动分配条目
 55         NULL, 
 56         0, 
 57         sizeof(ITEM), 
 58         8888,//ulong 4位数字
 59         0//保留.必须是零.
 60     );//分页
 61 
 62 #define ARRAY_NUMBER 50
 63     PITEM Item[ARRAY_NUMBER];
 64     //模拟频繁申请内存
 65     for (i = 0; i < ARRAY_NUMBER; i++)
 66     {
 67         Item[i] = (PITEM)ExAllocateFromPagedLookasideList(
 68             &PagedLookasideList);
 69     }
 70 
 71     for (i = 0; i < ARRAY_NUMBER; i++)
 72     {
 73         Item[i]->ItemData = i;
 74     }
 75 
 76     for (i = 0; i < ARRAY_NUMBER; i++)
 77     {
 78         DbgPrint("%d\r\n", Item[i]->ItemData);
 79     }
 80     //模拟频繁回收内存
 81     for (i = 0; i < ARRAY_NUMBER; i++)
 82     {
 83         ExFreeToPagedLookasideList(
 84             &PagedLookasideList, 
 85             Item[i]
 86         );
 87 
 88         Item[i] = NULL;
 89     }
 90 
 91     ExDeletePagedLookasideList(&PagedLookasideList);
 92     //删除LookasidePagedLookasideList
 93 
 94 
 95 
 96 
 97 }
 98 
 99 VOID DriverUnload(PDRIVER_OBJECT DriverObject)
100 {
101     DbgPrint("DriverUnload()\r\n");
102 }

 

以上是关于Ring0 - Lookaside结构的主要内容,如果未能解决你的问题,请参考以下文章

Translation Lookaside Buffer

Ring0级的探索

Linux 内核编译步骤及配置详解

Ring3创建事件Ring0设置事件

linux内核编译与开发

Linux 内核编译步骤及配置详解