在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 8233|回复: 13

PCI initiator DMA 地址设计

[复制链接]
发表于 2003-7-25 14:47:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
Jackzhang:
        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中断设计难不难?
以上的问题有我理解不对的地方,请指正和赐教
发表于 2003-7-25 15:06:11 | 显示全部楼层

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中断设计很简单,比较随便
 楼主| 发表于 2003-7-25 15:34:02 | 显示全部楼层

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 在长时间的传输数据过程中会不会发生?
发表于 2003-7-25 15:45:19 | 显示全部楼层

PCI initiator DMA 地址设计

没有必要申请特殊地址(也不允许),FPGA设计地址计数很简单
有可能会发生disconnect,但是无关紧要,initiator会继续req的
target about 和master about一般不会发生
发表于 2003-7-26 05:05:34 | 显示全部楼层

PCI initiator DMA 地址设计

[这个贴子最后由lstart在 2003/07/26 05:07am 第 1 次编辑]

对于第二个问题:应该崩溃,,除非你的运气太好太好了;
对于第三个问题:dma地址是由驱动程序调用系统内核API分配的,,,
               虽然win2000物理内存以4k分页,,,但,,,,
               驱动程序开发者无法控制分配的地址...
               就是说他不得不接受分配的地址为0x56783210;
               说白了就是任何人都无法决定分配的地址后面有多少0
对于第一个问题:
    我是因为这个问题和项目经理吵了一架,,然后愤愤离开公司的...
    1,malloc是应用层的调用,,,它只能基于操作系统分配虚拟内存...
      真正物理地址内存的分配是在内核级进行的,,,就是驱动.....
      只有物理地址才能DMA,malloc分配的显然不行....
    2,那么malloc后,,,由系统重新定位物理地址呢????
      这和驱动程序和win2000机制有关,,,,
      刚才打了很多,,讲的很详细,,,可是不小心点了"清除"键,,,,郁闷
      这里我也不多讲了......如果有兴趣,,mail给我都可以.....
 楼主| 发表于 2003-7-26 17:47:52 | 显示全部楼层

PCI initiator DMA 地址设计

非常感谢
发表于 2003-8-7 15:13:00 | 显示全部楼层

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 等都是合法地址。
   
发表于 2007-1-3 16:22:32 | 显示全部楼层
good, very good.
发表于 2007-1-3 16:48:32 | 显示全部楼层


原帖由 dragonyoo 于 2003-7-25 15:34 发表
   对于第3个问题,我的表述可能有错误,我所表达的是这个含义:
   申请的地址空间是由操作系统给的,能不能让操作系统尽量分配低位地址是0的基地址?譬如1M的地址空间,0x12300000~0x123fffff,或者0x12366666~ ...




我认为:北桥应该为系统内存在PCI地址空间中占据了很大一片MEMORY空间,这部分空间的首址肯定是“XXX00000”形式的。至于系统地址空间如何映射为PCI地址空间,这个就看MMU如何被初始化了。至于具体到每次DMA操作时的首地址选择,这个就应该很灵活了,细节应该是由设计DMA控制器的人来定义吧。

[ 本帖最后由 frankrick 于 2007-1-3 16:56 编辑 ]
发表于 2007-1-3 16:55:57 | 显示全部楼层


原帖由 dragonyoo 于 2003-7-25 14:47 发表
Jackzhang:
        PCI的initiator设计文档我研读过,现在有几个问题不太明白:
        1、DMA交易的地址,即进行master read/write操作时,往内存read/write的地址,我想此地址应该由软件写入,这部分地址空间 ...




系统内存在PCI地址空间的具体映射,应该是由操作系统的BSP或者BIOS在PCI总线初始化的时候来配置完成,以后每次DMA操作需要设置的首地址不过是这个内存空间的子集而已,或者说无论其数值如何选择,都应该落在这个空间中。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-20 00:19 , Processed in 0.031032 second(s), 9 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表