阅读:3279回复:12
dma缓冲区应用
要从一个文件中把数据通过dma传送至设备。不可避免的要用到缓冲区。主要有以下几方面:
读文件fread中用到缓冲区; 向设备写数据writefile中用到缓冲区; 设备驱动程序中初始化dma对象用到缓冲区。 那么,这些缓冲区之间有什么关系,总共要创建几个缓冲区? 我要在驱动和应用程序间共用同一个缓冲区进行dma,这样的思路对不对: 1。在驱动中创建非分页内存的缓冲区。 2。通过deviceioctl将句柄传送到应用程序。 3。应用程序在fread函数中使用这个缓冲区。 4。应用程序在writefile中也使用这个缓冲区。 5。驱动在onwrite 中使用它作为通用缓冲区初始化dma |
|
最新喜欢:wujiaj...
|
沙发#
发布于:2002-07-02 13:30
缓冲区怎么用看你自己的的办法了。
给DMA一个缓冲区来接受数据就好。 |
|
板凳#
发布于:2002-07-02 13:49
1。在驱动中创建非分页内存的缓冲区。 这样好像不行,至少我没见过 |
|
|
地板#
发布于:2002-07-02 15:32
一般来说,应该需要两个缓冲区,
一个在应用程序中创建,作为用户缓冲区 另一个在驱动中创建,作为dma的缓冲区 然后数据在两者间交换 |
|
|
地下室#
发布于:2002-07-02 17:00
在内核态创建缓冲区,然后把句柄传给应用程序。
这种做法应该是可行的,因为我试过可以,只要映射内存就行了。 但我不知道在内核态创建缓冲区有什么优势。是不是这样可以创建物理连续的内存区? |
|
|
5楼#
发布于:2002-07-02 17:33
来了。
:D :D :D |
|
|
6楼#
发布于:2002-07-02 18:15
缓冲区不过就是段内存,怎么用全在于你的应用程序的需要,如果几个应用操作之间不打架,用同一个缓冲区就可以了,如果有冲突,则须另外申请缓冲区或对缓冲区的访问上锁。
|
|
|
7楼#
发布于:2002-07-02 20:16
在内核态创建缓冲区,然后把句柄传给应用程序。 缺页??? :D |
|
|
8楼#
发布于:2002-07-03 08:38
在内核态创建缓冲区,然后把句柄传给应用程序。 在内核你可以建连续的或(和)NonPage的内存。这就是优势。 |
|
9楼#
发布于:2002-07-10 17:13
没有必要这样考虑,缓冲区只有3种类型,一种时缓冲IO,一种是直接IO,一种是非上述IO方式,通常只会用到前面两种IO,对于dma显然需要直接IO。你没必要在内核级随便分配缓冲区,dma用到的缓冲区直接是通过readfile或writefile或DeviceIoControl传递过来的,对于DeviceIoControl,其直接io缓冲区是outbuffer。在进行dma传输时,系统会在进行映射寄存器分配时自动为你分配物理地址连续的逻辑空间,用于复制用户缓冲区的碎片。你要做的只是考虑驱程的逻辑
|
|
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代码),系统会在进行映射寄存器分配时自动为你分配物理地址连续的逻辑空间,用于复制用户缓冲区的碎片。你要做的只是考虑驱程的逻辑而已
|
|
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 的问题都回答的好贴切呀。 高手。 |
|
12楼#
发布于:2013-07-30 17:16
用户被禁言,该主题自动屏蔽! |
|