chapter 9.5: memory object和buffer allocation

创建mem obj和buffer的方法
    1.一个函数同时分配buffer和memory obj
    2.创建一个memory obj,然后把它和一个已存在的buffer关联
创建请求时,驱动可以同时创建mem obj,也可以关联一个已存的mem obj
mem obj默认的父亲是创建它的驱动,若需要,则手动设置父亲为I/O request/device obj

To

Set this object as parent

Delete the memory object when the I/O request is completed

I/O request object

Retain the memory object for later use in additional I/O requests

Device object

需要正确设置parent:
KMDF:object attr structure的ParentObject域
UMDF:IWDFObject接口


Buffer类型:
UMDF不需要nonpaged memory 
KMDF:分为paged or nonpaged pool。
    同步的request中,mem obj和buffer生命周期是一致的,所以驱动可以用PVOID或PMDL指向buffer
    非同步request中,驱动必须使用WDF memory obj,这样framework才可以保证buffer直到I/O请求完成前都一直存在。


同时创建Memory object和buffer
UMDF:IWDFDriver::CreateWdfMemory
KMDF:WdfMemoryCreate
此时buffer和mem obj的生命周期一致。


使用已有的buffer创建memory object
比如使用已有的device context area
UMDF: IWDFDriver::CreatePreallocatedWdfMemory ,使用IWDFMemory::SetBuffer来关联buffer
KMDF: WdfMemoryCreatePreallocated,使用WdfMemoryAssignBuffer来关联buffer
KMDF: WdfMemoryCreateFromLookaside,关联在lookaside list中的buffer
驱动必须保证直到请求完成buffer仍然存在。此时删除mem obj时不会释放buffer。
重用I/O和request对象:
    1.驱动可以对自己创建的mem obj重新分配空间
    2.当驱动必须分离I/O请求时,可以重分配请求的mem obj
    3.驱动可以把一个mem obj只读分给多个I/O请求
    4.UMDF不能重用I/O请求对象
    5.KMDF只能重用自己创建的I/O请求对象


mem obj和I/O请求对象的关联
驱动创建mem obj后,驱动必须调用framework来关联mem obj和I/O请求对象,为I/O target格式化请求。framework准备IRP,取出mem obj的reference,reference会在下列事件出现后删除:
    1.I/O 请求完成
    2.驱动重新格式化I/O请求
    3.请求被删除
    4.KMDF调用WdfRequestReuse来准备把请求发送给另一个I/O target


UMDF例子
#####


KMDF例子
Usbsamp的 Sys\Bulkrwr.c
创建mem obj和buffer
WDF_OBJECT_ATTRIBUTES   objectAttribs;
WDFREQUEST              Request;
WDFMEMORY               urbMemory;
PURB                    urb = NULL;
WDF_OBJECT_ATTRIBUTES_INIT(&objectAttribs);
objectAttribs.ParentObject = Request;
status = WdfMemoryCreate( &objectAttribs,
                          NonPagedPool,
                          POOL_TAG,
                          sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
                          &urbMemory,
                          (PVOID*) &urb);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值