|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 cuizehan 于 2010-8-20 12:12 编辑
有几个疑问如下,后面附上我自己的理解,请批评指正。
1. PCIe 设备怎么发起DMA?(不是由主机发起)
我的理解:只要PCIe设备启动时,主机在设备配置空间的Command的寄存器的
第2位,也就是bus master enable 写的内容为1,就表明设备可以发
起读写请求。
ldd3上讲,设备发起的DMA过程大致是这样的:设备发中断,驱动程
序分配缓冲区,并把地址告诉设备;设备往该地址写数据;写完发中断
,驱动通知用户程序来读取数据。
里面讲的只是软件层面上怎么实现,是不是只要软件上准备好了,只要
PCIe设备知道DMA要传送到的内存地址,并且bus master enable为
1,就可以构造Write Request的TLP。这样是不是就叫发起了DMA
呢?
DMA的本质就是设备不断的构造对连续地址的Write Request的TLP
,对吗?
2. PCIe 设备发出的Write Request最终到哪了?驱动还是直接到内存?
我的理解:Write Request的TLP里已经包含了要写到的地址和包长,root
port 在收到这个TLP后应该有能力解析这个包,知道是要往内存
写多少长度的数据,然后它就向内存控制器发出写指令,把数据
写到内存中去,而不通知cpu,也就是驱动程序并不知道。
还有一种可能就是,这个包送到驱动,由驱动把包头去掉,并向内
存控制器发出写命令,不过我觉得这个不太可能,这样的话DMA就
需要cpu的参与了。
3. 基于我的上述理解,现在设计了这样一个系统,大家提点批评意见。
我的设计:
目标:把FPGA收的大量连续数据,不断的写到内存中去,然后cpu
从这段内存把数据读出来放到磁盘里。
思路:因为是大量连续数据,所以PCIe设备一直处于DMA写内存状
态,同时在用户程序通过mmap可以直接读取DMA缓冲区。
这种方法舍弃了中断,而是通过读写指针来确定有没有满。
实现:在FPGA里实现一个DMA engine,作用就是不断的计算地址
并构造Write Request的TLP,并定期更新内存中的一个写指
针,避免用户程序读错数据。
问题:这样是不是驱动在数据传输方面什么都不用做啊?那驱动还有
什么用? |
|