archim
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2279回复:18

使用什么函数来分配内存比较好??

楼主#
更多 发布于:2002-04-03 16:50
在一个kernel mode的driver里面想分配一块内存,对内存没有什么特殊的要求。使用哪个函数比较容易成功??

最新喜欢:

flyfoxflyfox
archim
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-04-03 17:03
用户被禁言,该主题自动屏蔽!
skysky
驱动小牛
驱动小牛
  • 注册日期2001-07-18
  • 最后登录2003-06-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-03 17:23
如果没什么特殊要求的话,用ExAllocatePool分配内存,PoolType设为PagePool, 如果要在优先级高的线程访问这块内存,如中断处理程序,还是将PoolType设置为NonePagedPool为好. 这是对NT系统而言,98下就没内核优先级要求了.
以德服人,以德服人
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2002-04-03 18:23
分配NoPagedPool类型内存很好玩,我曾经做过实验,让程序一直分配,直到系统没有响应为止,由于它不会被交换到内存,所以在这过程中硬盘灯一闪都没闪,用完内存后千万记得要释放。
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-04-03 21:04
用户被禁言,该主题自动屏蔽!
hanpeng
驱动牛犊
驱动牛犊
  • 注册日期2001-04-28
  • 最后登录2002-08-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-04 16:31
用new和delete也可以吧??!
tiddy
驱动牛犊
驱动牛犊
  • 注册日期2002-02-16
  • 最后登录2003-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-04 17:48
Off course can\'t!
为人进出的门,关着 为狗进出的洞,也关着 一个声音在高喊:都关着!
LIUTANG
驱动大牛
驱动大牛
  • 注册日期2001-03-30
  • 最后登录2020-12-27
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望58点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-04-04 18:32
    new 和delete是C++的操作符,如果你用C++写驱动,那你可以通过重载操作符来完成这一操作,DS就是这样做的.
    不过我建议你还是直接用DDK的函数,这样一来因为大多数我们看到的例子都是用C写的,二来用DDK函数看起来比较有技术含量(开玩笑了)
Owen.Guo
驱动中牛
驱动中牛
  • 注册日期2001-03-30
  • 最后登录2012-03-29
  • 粉丝0
  • 关注1
  • 积分402分
  • 威望260点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-04 19:57
分配用PVOID ExAllocatePool( IN POOL_TYPE PoolType,IN SIZE_T NumberOfBytes );
释放用VOID ExFreePool( IN PVOID P );
详细说明MSDN里面有
Owen.Guo 祝你成功!
icesoft
驱动牛犊
驱动牛犊
  • 注册日期2002-01-12
  • 最后登录2002-06-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-04 21:08
在一个kernel mode的driver里面想分配一块内存,对内存没有什么特殊的要求。使用哪个函数比较容易成功??

如果您使用windows系统操作系统的话,可以试一试:
LPVOID VirtualAlloc(
  LPVOID lpAddress, // address of region to reserve or commit
  DWORD dwSize,     // size of region
  DWORD flAllocationType,
                    // type of allocation
  DWORD flProtect   // type of access protection
);
 

icesoft
驱动牛犊
驱动牛犊
  • 注册日期2002-01-12
  • 最后登录2002-06-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-04 21:09
如果您使用windows系统操作系统,可以试一试:
LPVOID VirtualAlloc(
  LPVOID lpAddress, // address of region to reserve or commit
  DWORD dwSize,     // size of region
  DWORD flAllocationType,
                    // type of allocation
  DWORD flProtect   // type of access protection
);
及其相关函数。Windows CE底层的内存分配大多采用它。

[编辑 -  4/4/02 作者: icesoft]
archim
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-05 09:25
多谢各位指点。

如果我还想进一步得到虚地址和物理地址的对应关系,应该怎么办才好??
出了NdisAllocateSharedMemory之外还有没有其它的方法??

因为NdisAllocateSharedMemory在2000下总是不容易成功
archim
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-06 13:13
不知道你的硬件是否为PCI,如果是的可以读出PCI的配置寄存器,另外driver中会有相应的内核函数将此地址映射到系统的空间!
rich
jansen
驱动小牛
驱动小牛
  • 注册日期2001-10-21
  • 最后登录2007-10-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-06 13:16
比如ZwIoMapMemory(是这个函数吧,记得不太请,你自己到ddk中查找吧),将IO映射到系统中
rich
tiddy
驱动牛犊
驱动牛犊
  • 注册日期2002-02-16
  • 最后登录2003-12-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-06 16:16
DDK的文档中明确地说了不能用new及delete!
为人进出的门,关着 为狗进出的洞,也关着 一个声音在高喊:都关着!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2002-04-07 01:06
比较好的习惯是用 ExAllocatePoolWithTag(NonPagedPool,...);
一般来讲系统资源绝对够用,用NonPagedPool就可以了,不必用PagedPool,记得释放就好。

宝贵的资源是内核堆栈,使用数组之类的局部变量要小心。

[编辑 -  4/7/02 作者: TonyHuyan]
写驱动不如买足彩!!
h_love
驱动牛犊
驱动牛犊
  • 注册日期2001-08-20
  • 最后登录2003-03-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-04-09 18:39
IoGetDmaAdapter
分配的内存比NDIS分配的大.

而NDIS下用NdisAllocateMemoryWithTag.

分配shared内存不容易成功.因为,需要占用稀缺资源. :D
clpcl
驱动牛犊
驱动牛犊
  • 注册日期2002-02-02
  • 最后登录2002-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-04-11 19:46
如何把申请到的内存的指针传给Win32程序,使Win32程序也能访问
这块内存?
archim
驱动牛犊
驱动牛犊
  • 注册日期2001-08-18
  • 最后登录2006-03-17
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-04-12 09:58
user mode的应用程序不能访问kernel mode的内存
archim
游客

返回顶部