在驱动中分配内存,通常你的驱动会向NT VMM请求内存,这是你必须决定你的内存是可分页的或者非可分页的。
分配原则:尽量使用可分页内存,但是必须注意高等级IRQL执行不允许page fault。所以不允许采用可分页内存。可以使用PAGED_CODE();宏来检查。
非分页内存在系统中是一个有限的资源,取决于操作系统和物理内存大小. (NT VMM使用一个私有算法来计算非分页大小,这个算法使用物理内存总是作为计算因子来计算。)
NT提供如下例程来分配内存:
ExAllocatePool();
ExAllocatePoolWithQuota();
ExAllocatePoolWithTag();
ExAllocatePoolWithQuotaTag
调用以上例程分配内存是必须制定内存的类型:
NonPagedPool
PagedPool
NonPagedPoolMustSuccessed.
......................
关于非分页内存碎片问题:
本来初始化的时候地址都是相邻的非分页池会变成碎片。而且VMM在托大的时候也不保证地址相邻。
如果请求的分配或者释放小块内存(小于一个PAGE_SIZE),可能导致物理内存碎片化。这回给系统带来各种各样的问题,包括降低系统性能和分配内存失败的情况。
解决办法使用旁视列表,旁视列表是一个NT4.0开始提供的一个内存分配方式;具体请参考WDK docment.
顺便提一下内核栈:
每个在NT平台的线程有一个用户栈在用户模式执行的时候使用,一个内核栈在内核模式执行的时候使用。当线程请求系统服务而切换到内核模式的时候,陷阱机制会切换栈。用分配和线程的内核空间栈来覆盖用户空间栈。
在NT3.51之前,内核栈限制在两页的内存中。NT4.0开始增加到12KB.必须要谨慎的在栈上使用变量以节省占空间,防止超过限制而是系统停止。
posted on 2009-11-15 23:57
Only Soft 阅读(863)
评论(0) 编辑 收藏 引用 所属分类:
Windbg