随笔 - 8  文章 - 4  trackbacks - 0
      在驱动中分配内存,通常你的驱动会向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 阅读(841) 评论(0)  编辑 收藏 引用 所属分类: Windbg

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理