brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3210回复:12

dma缓冲区应用

楼主#
更多 发布于:2002-07-02 12:14
要从一个文件中把数据通过dma传送至设备。不可避免的要用到缓冲区。主要有以下几方面:
读文件fread中用到缓冲区;
向设备写数据writefile中用到缓冲区;
设备驱动程序中初始化dma对象用到缓冲区。

那么,这些缓冲区之间有什么关系,总共要创建几个缓冲区?
我要在驱动和应用程序间共用同一个缓冲区进行dma,这样的思路对不对:
1。在驱动中创建非分页内存的缓冲区。
2。通过deviceioctl将句柄传送到应用程序。
3。应用程序在fread函数中使用这个缓冲区。
4。应用程序在writefile中也使用这个缓冲区。
5。驱动在onwrite 中使用它作为通用缓冲区初始化dma

最新喜欢:

wujiajunwujiaj...
打一枪……换个地方……再打一枪……
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2002-07-02 13:30
缓冲区怎么用看你自己的的办法了。
给DMA一个缓冲区来接受数据就好。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-02 13:49
 
1。在驱动中创建非分页内存的缓冲区。
2。通过deviceioctl将句柄传送到应用程序。


这样好像不行,至少我没见过
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-02 15:32
一般来说,应该需要两个缓冲区,

一个在应用程序中创建,作为用户缓冲区

另一个在驱动中创建,作为dma的缓冲区

然后数据在两者间交换
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
brucezh
驱动老牛
驱动老牛
  • 注册日期2002-01-30
  • 最后登录2007-02-01
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-02 17:00
在内核态创建缓冲区,然后把句柄传给应用程序。
这种做法应该是可行的,因为我试过可以,只要映射内存就行了。

但我不知道在内核态创建缓冲区有什么优势。是不是这样可以创建物理连续的内存区?
打一枪……换个地方……再打一枪……
James.Ji
驱动老牛
驱动老牛
  • 注册日期2001-09-17
  • 最后登录2006-05-16
  • 粉丝0
  • 关注0
  • 积分-9分
  • 威望-8点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-02 17:33
来了。
 :D :D :D
车到山前必有路。 虽然有些土,却是我最有感触的一句话。
shyeagle
驱动老牛
驱动老牛
  • 注册日期2002-04-30
  • 最后登录2007-07-31
  • 粉丝1
  • 关注1
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-02 18:15
缓冲区不过就是段内存,怎么用全在于你的应用程序的需要,如果几个应用操作之间不打架,用同一个缓冲区就可以了,如果有冲突,则须另外申请缓冲区或对缓冲区的访问上锁。
[url=http://www.01study.com]01空间网[/url] [url=http://www.01study.com/forum/dispbbs.asp?boardID=73&ID=193&skin=0]版主招募[/url] [img]http://shy2003.vip.sina.com/map/yjs.gif[/img]
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-02 20:16
在内核态创建缓冲区,然后把句柄传给应用程序。
这种做法应该是可行的,因为我试过可以,只要映射内存就行了。

但我不知道在内核态创建缓冲区有什么优势。是不是这样可以创建物理连续的内存区?


缺页???

 :D
[color=red]大头鬼! :P[/color]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2002-07-03 08:38
在内核态创建缓冲区,然后把句柄传给应用程序。
这种做法应该是可行的,因为我试过可以,只要映射内存就行了。

但我不知道在内核态创建缓冲区有什么优势。是不是这样可以创建物理连续的内存区?


在内核你可以建连续的或(和)NonPage的内存。这就是优势。
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-10 17:13
没有必要这样考虑,缓冲区只有3种类型,一种时缓冲IO,一种是直接IO,一种是非上述IO方式,通常只会用到前面两种IO,对于dma显然需要直接IO。你没必要在内核级随便分配缓冲区,dma用到的缓冲区直接是通过readfile或writefile或DeviceIoControl传递过来的,对于DeviceIoControl,其直接io缓冲区是outbuffer。在进行dma传输时,系统会在进行映射寄存器分配时自动为你分配物理地址连续的逻辑空间,用于复制用户缓冲区的碎片。你要做的只是考虑驱程的逻辑
mengzi
驱动牛犊
驱动牛犊
  • 注册日期2001-08-02
  • 最后登录2004-05-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-10 17:16
没有必要这样考虑,缓冲区只有3种类型,一种时缓冲IO,一种是直接IO,一种是非上述IO方式,通常只会用到前面两种IO,对于dma显然需要直接IO。你没必要在内核级随便分配缓冲区,dma用到的缓冲区直接是通过readfile或writefile或DeviceIoControl传递过来的,对于DeviceIoControl,其直接io缓冲区是outbuffer。在进行dma传输时,DS已经在Initialize里进行了MDL的信息获取工作(具体看source中的Kdamxfer.cpp代码),系统会在进行映射寄存器分配时自动为你分配物理地址连续的逻辑空间,用于复制用户缓冲区的碎片。你要做的只是考虑驱程的逻辑而已
bangh
驱动牛犊
驱动牛犊
  • 注册日期2003-03-26
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望75点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2012-12-04 16:16
回 mengzi 的帖子
mengzi:没有必要这样考虑,缓冲区只有3种类型,一种时缓冲IO,一种是直接IO,一种是非上述IO方式,通常只会用到前面两种IO,对于dma显然需要直接IO。你没必要在内核级随便分配缓冲区,dma用到的缓冲区直接是通过readfile或writefile或DeviceIoControl传递过来的,对于DeviceIoControl,其直接io .. (2002-07-10 17:16)

mengzi 的问题都回答的好贴切呀。 高手。
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
12楼#
发布于:2013-07-30 17:16
用户被禁言,该主题自动屏蔽!
游客

返回顶部