diesnak
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1372回复:5

有关驱动程序的存储分配

楼主#
更多 发布于:2002-11-25 11:16
小弟看到Art Baker的《Windows 2000 设备驱动程序设计指南》上面写的,在x86平台下,内核堆栈只有12kB大小,然后介绍了使用内存池的办法。我想请教各位的是,在我的驱动程序里面有很多例程,比如DriverEntry,MPSend之类的函数,我想在函数之间共享数据,于是使用了全局变量,这个全局变量的存储空间是否就是在内核堆栈上面分配的?如果是的话,我要换成使用内存池,该怎么办呢?(也就是既是全局变量,又是在内存池里面分配的)多谢~~~~~~~~
I believv i can fly I believe i can touch sky
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-11-25 12:24
全局变量使用的非分页的内存池空间,不是堆栈。请放心使用。
Tom_lyd
diesnak
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-11-25 13:04
阿?真的吗?那可太好了阿!感谢版主!
对了,那么全局变量不用使用ExAllocatePool和ExFreePool来进行操作吗?
I believv i can fly I believe i can touch sky
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-11-25 13:35
你全局变量声明的是什么?
如果全局变量声明的是一个缓冲区的指针,指向一块将分配的非分页内存,那么肯定地需要在后续的地方用ExAllocatePool来分配内存。
例如:
全局声明:
LPVOID lpGlobalBuffer=NULL;
假设在DriverEntry例程中分配这块内存,并将这块非分内存的指存存在全局指针变量中,以方便其它例程存取。
NTSTATUS DriverEntry(...)
{
    lpGlobalBuffer = ExAllocatePool( NonPagedPool,MY_SIZE );
}

表态分配的全局内存不需要调用ExFreePool释放,例如:
ULONG data[1024];
但是如果作为全局变量的只是一个指针,而且在随后的操作中将动态分配的内存指针赋给了它,就需要释放。
Tom_lyd
diesnak
驱动牛犊
驱动牛犊
  • 注册日期2002-03-04
  • 最后登录2002-12-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-11-25 13:42
这下我彻底明白了!谢谢版主!再次感谢!
I believv i can fly I believe i can touch sky
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-11-25 13:56
不客气:)
Tom_lyd
游客

返回顶部