初次写驱动,菜鸟请教PCIE问题
用memory map方式访问PCIE设备内存和io map的方式相比性能怎么样?如果要用memory map的方式,是否enable membar就行了?在PCIE驱动中如何得到memory map之后的地址呢? 用memory map方式访问PCIE设备内存和io map的方式相比性能怎么样?我觉得差不多。也许MEMORY MAP的会快点?
如果要用memory map的方式,是否enable membar就行了?
基本上是。还要看硬件是否支持。
在PCIE驱动中如何得到memory map之后的地址呢?
OS基本上帮你做好了。最后在你的驱动里调用pci_iomap( )就可以得到基地址了。
回复 #2 accessory 的帖子
我在驱动里面对ioremap_nocache返回的地址用ioread32和iowrite32分别进行了测试,发现读的速度是133万次/秒,而写的速度是400万次/秒。算一下写的速度才16MB/s,而我测试用的卡是PCIE*4的。理论带宽应该是1GB/s啊。用内存地址直接引用取代ioread32和iowrite32也是一样的结果。请问前辈如果性能差不多的话,那PCIE显卡的驱动是用什么方式访问显存的呢?回复 #4 snail_314 的帖子
读的速度是133万次/秒,写的速度是400万次/秒, 兄台觉得这正常吗?是不是太慢了 用IOREAD, IOWRITE这些命令去读写当然慢了。这些最后一般也就是IN, OUT 指令,也就是最慢的PROGRAM IO.要想快的话,用DMA.
PS: 你那个读写速度是怎么测试的?比较好奇
回复 #6 accessory 的帖子
是在module_init里面初始化的最后分别用1000万次的读和写测试出来的。 原帖由 accessory 于 2009-11-7 00:42 发表 http://linux.chinaunix.net/bbs/images/common/back.gif用IOREAD, IOWRITE这些命令去读写当然慢了。这些最后一般也就是IN, OUT 指令,也就是最慢的PROGRAM IO.
要想快的话,用DMA.
PS: 你那个读写速度是怎么测试的?比较好奇
顺便问一下,如果PCIE设备主动发起DMA到主机(x86或x86_64)的一段内存,而这段内存正在CPU的cache里,那需要手动刷新cache吗? intel或amd的CPU能自动刷cache吗? 在linux里面,当你需要DMA之前,你要先指定内存区域,在这个时候,系统已经设置好那段内存是不用cache的了。所以不会出现你说得情况。 原帖由 accessory 于 2009-11-7 11:24 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
在linux里面,当你需要DMA之前,你要先指定内存区域,在这个时候,系统已经设置好那段内存是不用cache的了。所以不会出现你说得情况。
不太理解,这段内存是用get_free_pages分配的,没有加GFP_DMA标志,linux本身并不知道PCI设备何时主动DMA数据到这块内存,那linux是如何做到的呢? 在你启动dma之前,一般要调用ioremap, or pci_iomap. 他们有时设置了cache.
还可以看看下面的连接:
http://jianggmulab.blogspot.com/2009/05/ioremap_26.html
页:
[1]