显示驱动驱动和服务端共享内存(section内存机制)

微软XPDM驱动模型中,显示驱动分为两个部分:display driver和miniport driver。display driver主要负责渲染,miniport driver主要负责与硬件交互及资源管理(内存等)。桌面云显示协议中,需要通过服务端将显示指令remote到客户端,display driver(内核态)和服务端(用户态)需要通过共享内存的方式来传递信息,本文简要描述可能的共享内存方案。

大体上来说,可能的方案有:内存映射文件、MDL、section内存。RDP、Citrix thinwire都用到了section内存机制(RDP用的是未公开接口的函数engmapsection)。本文将简要描述section内存机制。

首先是miniport driver调用ZwCreateSection得到一大块内存,之后调用MmMapViewInSystemSpace(中间过程将调用ObReferenceObjectByHandle)将内存映射到内核空间,之后display driver通过调用EngDeviceIoControl得到该内存在内核空间的地址。对应的内存释放函数为(MmUnmapViewInSystemSpace、ObDereferenceObject、ZwClose)。

需要指出的是,需要在注册表中设置以下选项,才能申请到较大的section内存块,否则将可能导致蓝屏。[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]

"SystemViewSize"=dword:00000100(大小设置成256M)。

接着miniport driver调用ZwMapViewOfSection将内存映射到服务端进程所在的用户地址空间(中间过程有ObOpenObjectByPointer,对应析构过程为ZwClose、ZwUnmapViewOfSection)。

这样服务端和display driver就可以通过Section内存传递信息了。

实际上,内存映射文件机制更简单些,然而,本人找不出任何方法能够让其映射大块内存(如64M)。如果你知道方法,请务必说一声哦!

MDL还未研究过,以后熟悉了再说。


转载于:https://my.oschina.net/xtxb/blog/58012

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值