rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1479回复:12

在APP中可以分配NonPagedPool内存吗?

楼主#
更多 发布于:2002-08-14 23:14
发现我的驱动大概是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\";
}

高手帮看看

分数 你想要吗?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-08-15 09:26
在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-15 09:46
在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。


MDL应该是管理分页内存的吧?
lock以后是不是就不会被换出到缓存文件啦呢?
分数 你想要吗?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于: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.

rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-15 10:36
在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。


会自动的Lock是什么意思呢?
^^^^^^^

不需要用户在driver中调用什么函数吗?例如:MmProbeAndLockPages()???
分数 你想要吗?
Nouk
驱动中牛
驱动中牛
  • 注册日期2001-08-22
  • 最后登录2006-10-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-15 10:40
GlobalAlloc?
Taiwan's Driver Developer
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-15 10:44
GlobalAlloc?

什么意思?
分数 你想要吗?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2002-08-15 11:56
[quote]在DDK,如果用direct_io方式,会自动的lock你的app的内存,然后通过mdl来访问app的内存的。不知道ds怎么封装了。


会自动的Lock是什么意思呢?
^^^^^^^

不需要用户在driver中调用什么函数吗?例如:MmProbeAndLockPages()??? [/quote]
反正ddk的不要,只要你说明了是direct_io方式。
ds就不知道了。
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
8楼#
发布于: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的功能全部封装进来
分数 你想要吗?
yjhleaf
驱动小牛
驱动小牛
  • 注册日期2001-11-04
  • 最后登录2005-11-23
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-15 17:39
  当创建设备选择direct_io方式的时候,在ds中也是一样的lock你的app内存。这个时候传进来的用户缓冲区就是一个非分页的,你在操作这个缓冲区时,是不允许被置换出去的。在app层,如果是分配很大空间当然是分配堆空间了,用完就释放。从app传递到驱动程序的缓冲区,系统lock后,都看成非分页处理,你不用担心。
忽如一夜春风来,千树万树梨花开。
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-15 17:49
 当创建设备选择direct_io方式的时候,在ds中也是一样的lock你的app内存。这个时候传进来的用户缓冲区就是一个非分页的,你在操作这个缓冲区时,是不允许被置换出去的。在app层,如果是分配很大空间当然是分配堆空间了,用完就释放。从app传递到驱动程序的缓冲区,系统lock后,都看成非分页处理,你不用担心。


如果APP尝试在Driver unlock以前就释放该空间会出现什么问题呢?
yjhleaf是不是对ds比较熟啊,帮我看看其他几片帖子吧

谢谢
分数 你想要吗?
zdhe
驱动太牛
驱动太牛
  • 注册日期2001-12-26
  • 最后登录2018-06-02
  • 粉丝0
  • 关注0
  • 积分72362分
  • 威望362260点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2002-08-16 11:43
App can allocate none pagable memory.

VirtualAllocEx. in AWE version.
rifter
论坛版主
论坛版主
  • 注册日期2002-03-20
  • 最后登录2006-02-28
  • 粉丝1
  • 关注0
  • 积分65分
  • 威望8点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-08-16 12:30
App can allocate none pagable memory.

VirtualAllocEx. in AWE version.


谢谢,又学了一手
但按照他们的说法,我的驱动的问题好像不是出在这了。
分数 你想要吗?
游客

返回顶部