阅读:2279回复:18
使用什么函数来分配内存比较好??
在一个kernel mode的driver里面想分配一块内存,对内存没有什么特殊的要求。使用哪个函数比较容易成功??
|
|
最新喜欢:![]()
|
沙发#
发布于:2002-04-03 17:03
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2002-04-03 17:23
如果没什么特殊要求的话,用ExAllocatePool分配内存,PoolType设为PagePool, 如果要在优先级高的线程访问这块内存,如中断处理程序,还是将PoolType设置为NonePagedPool为好. 这是对NT系统而言,98下就没内核优先级要求了.
|
|
|
地板#
发布于:2002-04-03 18:23
分配NoPagedPool类型内存很好玩,我曾经做过实验,让程序一直分配,直到系统没有响应为止,由于它不会被交换到内存,所以在这过程中硬盘灯一闪都没闪,用完内存后千万记得要释放。
|
|
地下室#
发布于:2002-04-03 21:04
用户被禁言,该主题自动屏蔽! |
|
5楼#
发布于:2002-04-04 16:31
用new和delete也可以吧??!
|
|
6楼#
发布于:2002-04-04 17:48
Off course can\'t!
|
|
|
7楼#
发布于:2002-04-04 18:32
new 和delete是C++的操作符,如果你用C++写驱动,那你可以通过重载操作符来完成这一操作,DS就是这样做的.
不过我建议你还是直接用DDK的函数,这样一来因为大多数我们看到的例子都是用C写的,二来用DDK函数看起来比较有技术含量(开玩笑了) |
|
8楼#
发布于:2002-04-04 19:57
分配用PVOID ExAllocatePool( IN POOL_TYPE PoolType,IN SIZE_T NumberOfBytes );
释放用VOID ExFreePool( IN PVOID P ); 详细说明MSDN里面有 |
|
|
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 ); |
|
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] |
|
11楼#
发布于:2002-04-05 09:25
多谢各位指点。
如果我还想进一步得到虚地址和物理地址的对应关系,应该怎么办才好?? 出了NdisAllocateSharedMemory之外还有没有其它的方法?? 因为NdisAllocateSharedMemory在2000下总是不容易成功 |
|
|
12楼#
发布于:2002-04-06 13:13
不知道你的硬件是否为PCI,如果是的可以读出PCI的配置寄存器,另外driver中会有相应的内核函数将此地址映射到系统的空间!
|
|
|
13楼#
发布于:2002-04-06 13:16
比如ZwIoMapMemory(是这个函数吧,记得不太请,你自己到ddk中查找吧),将IO映射到系统中
|
|
|
14楼#
发布于:2002-04-06 16:16
DDK的文档中明确地说了不能用new及delete!
|
|
|
15楼#
发布于:2002-04-07 01:06
比较好的习惯是用 ExAllocatePoolWithTag(NonPagedPool,...);
一般来讲系统资源绝对够用,用NonPagedPool就可以了,不必用PagedPool,记得释放就好。 宝贵的资源是内核堆栈,使用数组之类的局部变量要小心。 [编辑 - 4/7/02 作者: TonyHuyan] |
|
|
16楼#
发布于:2002-04-09 18:39
IoGetDmaAdapter
分配的内存比NDIS分配的大. 而NDIS下用NdisAllocateMemoryWithTag. 分配shared内存不容易成功.因为,需要占用稀缺资源. :D |
|
17楼#
发布于:2002-04-11 19:46
如何把申请到的内存的指针传给Win32程序,使Win32程序也能访问
这块内存? |
|
18楼#
发布于:2002-04-12 09:58
user mode的应用程序不能访问kernel mode的内存
|
|
|