阅读:1480回复:12
在APP中可以分配NonPagedPool内存吗?
发现我的驱动大概是APP给的空间是分页内存导致的,
因为驱动中创建设备时,指定DO_DIRECT_IO啦,而serialRead中如此: void Isoc1394Device::SerialRead(KIrp I) { t << \"Entering Isoc1394Device::SerialRead, \" << I << EOL; NTSTATUS status = STATUS_SUCCESS; // Declare a memory object KMemory Mem(I.Mdl()); // Use the memory object to create a pointer to the caller\'s buffer PUCHAR pBuffer = (PUCHAR) Mem.MapToSystemSpace(); ULONG dwTotalSize = I.ReadSize(CURRENT); I.Information() = 0; //Allocate a completion context PBUFFER_DESCRIPTOR pContext = new (NonPagedPool) BUFFER_DESCRIPTOR; if(!pContext) status = STATUS_INSUFFICIENT_RESOURCES; if(NT_SUCCESS(status)) { //Set up our context pContext->BytesProcessed = 0; pContext->pIrp = I; pContext->AllocatedMdl = FALSE; pContext->pEvent = &m_ReadOKEvent; status = StartSegment(pContext); } if(!m_ReadTransfer.IsStarted() && NT_SUCCESS(status)) status = m_ReadTransfer.StartListen(); //Complete the IRP immediately if we are failing the request if(!NT_SUCCESS(status)) { I.Status() = status; PnpNextIrp(I); if(pContext) delete pContext; } else { PnpNextIrp(KIrp(0)); } t << \"Serial read exit!\\n\"; } 高手帮看看 |
|
|
沙发#
发布于:2002-08-16 12:30
App can allocate none pagable memory. 谢谢,又学了一手 但按照他们的说法,我的驱动的问题好像不是出在这了。 |
|
|
板凳#
发布于:2002-08-16 11:43
App can allocate none pagable memory.
VirtualAllocEx. in AWE version. |
|
地板#
发布于:2002-08-15 17:49
当创建设备选择direct_io方式的时候,在ds中也是一样的lock你的app内存。这个时候传进来的用户缓冲区就是一个非分页的,你在操作这个缓冲区时,是不允许被置换出去的。在app层,如果是分配很大空间当然是分配堆空间了,用完就释放。从app传递到驱动程序的缓冲区,系统lock后,都看成非分页处理,你不用担心。 如果APP尝试在Driver unlock以前就释放该空间会出现什么问题呢? yjhleaf是不是对ds比较熟啊,帮我看看其他几片帖子吧 谢谢 |
|
|
地下室#
发布于:2002-08-15 17:39
当创建设备选择direct_io方式的时候,在ds中也是一样的lock你的app内存。这个时候传进来的用户缓冲区就是一个非分页的,你在操作这个缓冲区时,是不允许被置换出去的。在app层,如果是分配很大空间当然是分配堆空间了,用完就释放。从app传递到驱动程序的缓冲区,系统lock后,都看成非分页处理,你不用担心。
|
|
|
5楼#
发布于:2002-08-15 12:47
[quote][quote]在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。 会自动的Lock是什么意思呢? ^^^^^^^ 不需要用户在driver中调用什么函数吗?例如:MmProbeAndLockPages()??? [/quote] 反正ddk的不要,只要你说明了是direct_io方式。 ds就不知道了。 [/quote] ds就是在DDK的基础上,定义了很多的类,然后把DDK的功能全部封装进来 |
|
|
6楼#
发布于:2002-08-15 11:56
[quote]在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。 会自动的Lock是什么意思呢? ^^^^^^^ 不需要用户在driver中调用什么函数吗?例如:MmProbeAndLockPages()??? [/quote] 反正ddk的不要,只要你说明了是direct_io方式。 ds就不知道了。 |
|
7楼#
发布于:2002-08-15 10:44
GlobalAlloc? 什么意思? |
|
|
8楼#
发布于:2002-08-15 10:40
GlobalAlloc?
|
|
|
9楼#
发布于:2002-08-15 10:36
在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。 会自动的Lock是什么意思呢? ^^^^^^^ 不需要用户在driver中调用什么函数吗?例如:MmProbeAndLockPages()??? |
|
|
10楼#
发布于:2002-08-15 09:51
是的。
MDL Memory descriptor list An opaque structure, defined by the Memory Manager, that uses an array of physical page frame numbers (PFNs) to describe the pages that back a virtual memory range. |
|
11楼#
发布于:2002-08-15 09:46
在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。 MDL应该是管理分页内存的吧? lock以后是不是就不会被换出到缓存文件啦呢? |
|
|
12楼#
发布于:2002-08-15 09:26
在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。
|
|