关于内核与用户模式间的内存共享……(高手请进)

yx_mmcall 2004-01-16 10:44:25
小弟我需要在内核层和用户层之间共享内存,要求是:

1、用户与内核层都可以对共享的地址进行访问、偏移并且“长期有效”。
2、效率要求高。

有如下问题:

1、如果通过irp传递地址,当irp结束后该地址在内核模式下已不能使用。
2、使用METHOD_IN_DIRECT方式,在内核模式下对输出的Irp->MdlAddress地址不能偏移?

请各位不吝赐教(最好能给出清晰的过程),谢谢!
...全文
154 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
BLUETUNE 2004-01-18
  • 打赏
  • 举报
回复
Mark !
Leo 2004-01-17
  • 打赏
  • 举报
回复
关注
junhli 2004-01-16
  • 打赏
  • 举报
回复
据我所了解的,共享内存是由内核创建以供应用层共同使用的。一旦创建为共享内存,内核将不能访问。
liotion 2004-01-16
  • 打赏
  • 举报
回复
赞同 dzmsoft(天狼) 的方法。
火焰射手 2004-01-16
  • 打赏
  • 举报
回复
http://www.osronline.com/article.cfm?id=39
ilovedrv 2004-01-16
  • 打赏
  • 举报
回复
可以参考NTDDK下有一个mapmem的例子,实现了驱动程序内存到用户空间的映射,不过比较繁琐。
下面这个方法比较简单:
一般的ring0的virtualaddress不能直接使用.如果需要ring0和ring3共享这部分缓冲,可以通过以下的操作完成.
SystemVirtualAddress = MmAllocateContiguousMemory(NumberOfBytes,
HighestAcceptableAddress);
或者:
SystemVirtualAddress = ExAllocatePool(PoolType, NumberOfBytes);
然后
Mdl = IoAllocateMdl(SystemVirtualAddress, NumberOfBytes, FALSE,
FALSE, NULL);
然后:
如果缓冲区是非分页内存
MmBuildMdlForNonPagedPool(Mdl);
如果十分页内存:
MmProbeAndLockPages(Mdl, KernelMode, IoWriteAccess);

ring3可以使用的virtual Address:
UserVirtualAddress = MmMapLockedPages(Mdl, UserMode);

然后应用程序就可以使用这部分的缓冲区了.
xxcat1220 2004-01-16
  • 打赏
  • 举报
回复
创建METHOD_BUFFERED方式的IO控制,这种方式就是直接引用应用程序传递的内寸而不进行复制,IoGetCurrentIrpStackLocation(Irp)->Parameters.DeviceIoControl.Type3InputBuffer所指向的就是你在应用程序中分配的内寸
dzmsoft 2004-01-16
  • 打赏
  • 举报
回复
你可以通过命名的 Section 对象来实现内存的共享,
在用户模式通过 CreateFileMapping 创建 Section 对象,
在内核心模式用 ZwOpenSection 方法来打开此对象.

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧