PCI initiator DMA 地址设计
PCI的initiator设计文档我研读过,现在有几个问题不太明白:
1、DMA交易的地址,即进行master read/write操作时,往内存read/write的地址,我想此地址应该由软件写入,这部分地址空间怎样申请?难道软件通过malloc函数申请一部分地址空间,然后将基地址写DAM的地址寄存器,或者开发驱动程序软件如windriver有专门的库函数来申请,然后写入?
2、如果PCI 板卡往不合适的内存(可能不是自己分配的内存地址空间),会造成什么后果?系统崩溃?
3、申请的地址空间基地址的最低几位可不可能是零?譬如申请1M的地址空间,低20位为0,空间物理地址范围从 XXX00000~XXXFFFFF?这样便于FPGA内部地址计数器的位数较少。
4、上次您提到的pinpang结构可不可以这样理解:FPGA内部设置多个DMA通道,每个通道同样的最大交易字节数,当一个通道交易字节数达到最大值时,启动下一通道,重新载入不同的基地址,如此循环往复。
5、以master write 为例,当某一通道写完数据后,软件从内存条中读数据,此时下一个通道写入内存数据,虽然这两次的地址不同,但内存条一次只允许一个操作,
即这两次的操作是互斥的,软件从内存条中读数据会影响PCI卡数据写的传输,那么软件从内存条中读数据会有多快?
6、PCI中断设计难不难?
以上的问题有我理解不对的地方,请指正和赐教
PCI initiator DMA 地址设计
[这个贴子最后由jackzhang在 2003/08/07 03:20pm 第 1 次编辑]
回答如下:
1. 一般是由应用程序申请(可以用malloc),但一定要转换为物理地址,通过驱动程序写入
2.有可能系统崩溃
3.可以为0,至少最低两位一定为0(二进制),因为pci操作是32bit.
4.你理解的很正确
5.绝大多数情况不会,因为软件访问内存条速度非常快,另外pci写内存条是先写道北桥(有可能是南桥)的fifo里,当软件操作完内存条时,这个FIFO可能还没有满。还有对sdram的操作也有一个仲裁器,不会让host独占的
6.pci中断设计很简单,比较随便
PCI initiator DMA 地址设计
对于第3个问题,我的表述可能有错误,我所表达的是这个含义:
申请的地址空间是由操作系统给的,能不能让操作系统尽量分配低位地址是0的基地址?譬如1M的地址空间,0x12300000~0x123fffff,或者0x12366666~0x12466665,尽量是前一种地址空间,便于计数器操作!
另外master read/write交易终止(设想initiator不会终止)时,PCI 桥一般会发何类型的交易终止(disconnect with data or disconnect without data or others)?target abort 和 master abort 在长时间的传输数据过程中会不会发生?
PCI initiator DMA 地址设计
没有必要申请特殊地址(也不允许),FPGA设计地址计数很简单
有可能会发生disconnect,但是无关紧要,initiator会继续req的
target about 和master about一般不会发生
PCI initiator DMA 地址设计
[这个贴子最后由lstart在 2003/07/26 05:07am 第 1 次编辑]
对于第二个问题:应该崩溃,,除非你的运气太好太好了;
对于第三个问题:dma地址是由驱动程序调用系统内核API分配的,,,
虽然win2000物理内存以4k分页,,,但,,,,
驱动程序开发者无法控制分配的地址...
就是说他不得不接受分配的地址为0x56783210;
说白了就是任何人都无法决定分配的地址后面有多少0
对于第一个问题:
我是因为这个问题和项目经理吵了一架,,然后愤愤离开公司的...
1,malloc是应用层的调用,,,它只能基于操作系统分配虚拟内存...
真正物理地址内存的分配是在内核级进行的,,,就是驱动.....
只有物理地址才能DMA,malloc分配的显然不行....
2,那么malloc后,,,由系统重新定位物理地址呢?
这和驱动程序和win2000机制有关,,,,
刚才打了很多,,讲的很详细,,,可是不小心点了"清除"键,,,,郁闷
这里我也不多讲了......如果有兴趣,,mail给我都可以.....
PCI initiator DMA 地址设计
非常感谢
PCI initiator DMA 地址设计
a:对于驱动程序来说,内存地只有三种概念:虚拟地址,逻辑地址和物理地址。对于x86结构来说 逻辑地址和物理地址是相同的。但对于其他类型的CPU逻辑地址和物理地址则是不同的。
所有程序包括驱动程序和应用程序使用虚拟地址来访问缓冲区,而设备则使用逻辑地址来访问缓冲区。
b: dma传输策略 (主要说明smart DMA) 一般使用 Direct缓冲方式和公用缓冲区方式。
Direct缓冲方式 直接在应用程序分配的内存上进行dma,在dma传输过程中,用户不能修改其内存,否则将会产生数据错误。优点 减少内存copy次数。缺点 每次传输都要进行内存映射。一般不能作为高速连续数据传输。
公用缓冲区方式 由驱动程序分配的非分页的,物理上连续的内存。每次传输时将用户数据copy到此缓冲区。高速时实连续数据传输一般使用此方式来保证数据的连续性。(此时需两个公用缓冲区,应用程序使用异步方式写数据。smart dma设备使用乒乓方式)。
对于第一个问题: 不管使用那种方式,对于通一块内存都可得到虚拟地址和逻辑地址, 虚拟地址用于驱动程序,逻辑地址用于dma设备。
对于第三个问题:只能保证对于32为pci总线,所分配的地址形式为
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxx00 (二进制地址)
也就是说,以十六进制形式看,所分配的地址可能联一个0都没有。
如: 32 bit pci 0x12345674 0x12345678 0x1234567c 等都是合法地址。
good, very good.
我认为:北桥应该为系统内存在PCI地址空间中占据了很大一片MEMORY空间,这部分空间的首址肯定是“XXX00000”形式的。至于系统地址空间如何映射为PCI地址空间,这个就看MMU如何被初始化了。至于具体到每次DMA操作时的首地址选择,这个就应该很灵活了,细节应该是由设计DMA控制器的人来定义吧。
系统内存在PCI地址空间的具体映射,应该是由操作系统的BSP或者BIOS在PCI总线初始化的时候来配置完成,以后每次DMA操作需要设置的首地址不过是这个内存空间的子集而已,或者说无论其数值如何选择,都应该落在这个空间中。
这个东西是由硬件完成了。PCI协议手册中有。
地址空间分配是软件的工作
你好;我看了很长时间但我对这DMA操作时pcie地址转换方便一直不清楚:
1.比如我们进行DMA写的时候,发出一个包。包肯定肯定有目的对应的地址和要写的数据。但这个地址是PCIE(和PCI地址这块应该一样的)总线域的地址。但我们最后数据肯定会写到储存器域对应的地址空间中。这中间有个类似于TLB的地址转换。我想知道这个是提前定义好的吗?
我可不可以这样理解,PCIE总线连接到什么地方,就默认连接到那一款储存器,我们只要访问这个PCIE EP对应的地址,就相当于访问了对应的储存器空间。谢谢 请直接。有例子说明最好。
你好,你的意思我可不可以这样理解。就是在进行dma操作时候,写地址就是对应pci总线的地址。pci对应配置空间baro里面是对应的储存器的基地址?是吗 这些关系一直搞不明白 谢谢
