rsil@sohu.com
驱动牛犊
驱动牛犊
  • 注册日期2007-03-05
  • 最后登录2010-04-13
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望65点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2679回复:2

关于AVStream minidiver DMA scatter-gather mapping物理内存块大小问题

楼主#
更多 发布于:2008-12-14 19:51
调试driver studio V3.1中的hwcap例子,发现AVStream把每帧图像缓冲区分成若干大小为4K Byte的mapping items,每个mapping item描述一块连续物理内存,每块内存大小只有4KB。所有这些内存块的虚拟地址是可以连续串联起来的,物理地址是分散的。

根据DDK文档说明,在调用KsDeviceRegisterAdapterObject()注册DMA Adapter的时候可以通过MaxMappingByteCount 参数来指定每个
mapping item包含的连续地址物理内存块大小。

但是实际测试中通过修改MaxMappingByteCount 并不能改变mapping item中的字节数量,mapping item中始终是4K。
请教如何修改可以使得AVStream将帧缓冲区划分为较大的连续物理地址内存块?
rsil@sohu.com
驱动牛犊
驱动牛犊
  • 注册日期2007-03-05
  • 最后登录2010-04-13
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望65点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-12-15 19:49
今天尝试了使用common buffer模式,做如下修改:
1,将PIN的sm_Flags改为KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING。
2,修改OnStart()中的DMA Adapter初始化,删除原来的m_DMA,改用IoGetDmaAdapter()来自己获取DMA Adapter,在输入的参数中:
   a) DMA Desctiptor的ScatterGather改为FALSE。
   b) MapRegisters初始值设为BYTES_TO_PAGES(0x100000),也就是说我想申请最大1MB内存。
3,DMA Adapter成功获得之后调用其提供的方法AllocateCommonBuffer()来申请大小为MapRegisters * PAGE_SIZE的内存。

但是实际测试结果不如我所期待。在第2步完成后,返回的MapRegisters是8,也就是说系统告诉我只能给我8个PAGE的内存。

我再另外创建一个非AVStream的WDM驱动,在其Device类的OnStartDevice()中做与上面完全一样的事情,结果是可以成功获取1MB内存的。事实上,我尝试分配更大的内存,一直到32MB都可以成功。

有没有人能告诉我,在AVStream中如何才能实现分配大尺寸的common buffer?
或者说,不一定能保证解决问题,但是有任何建议敬请指出。
rsil@sohu.com
驱动牛犊
驱动牛犊
  • 注册日期2007-03-05
  • 最后登录2010-04-13
  • 粉丝0
  • 关注0
  • 积分12分
  • 威望65点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-12-17 17:26
已经解决
游客

返回顶部