superfisha 发表于 2009-11-05 22:13

初次写驱动,菜鸟请教PCIE问题

用memory map方式访问PCIE设备内存和io map的方式相比性能怎么样?如果要用memory map的方式,是否enable membar就行了?在PCIE驱动中如何得到memory map之后的地址呢?

accessory 发表于 2009-11-06 01:21

用memory map方式访问PCIE设备内存和io map的方式相比性能怎么样?
我觉得差不多。也许MEMORY MAP的会快点?

如果要用memory map的方式,是否enable membar就行了?
基本上是。还要看硬件是否支持。

在PCIE驱动中如何得到memory map之后的地址呢?
OS基本上帮你做好了。最后在你的驱动里调用pci_iomap( )就可以得到基地址了。

superfisha 发表于 2009-11-06 07:54

回复 #2 accessory 的帖子

我在驱动里面对ioremap_nocache返回的地址用ioread32和iowrite32分别进行了测试,发现读的速度是133万次/秒,而写的速度是400万次/秒。算一下写的速度才16MB/s,而我测试用的卡是PCIE*4的。理论带宽应该是1GB/s啊。用内存地址直接引用取代ioread32和iowrite32也是一样的结果。请问前辈如果性能差不多的话,那PCIE显卡的驱动是用什么方式访问显存的呢?

superfisha 发表于 2009-11-06 09:53

回复 #4 snail_314 的帖子

读的速度是133万次/秒,写的速度是400万次/秒, 兄台觉得这正常吗?是不是太慢了

accessory 发表于 2009-11-07 00:42

用IOREAD, IOWRITE这些命令去读写当然慢了。这些最后一般也就是IN, OUT 指令,也就是最慢的PROGRAM IO.

要想快的话,用DMA.

PS: 你那个读写速度是怎么测试的?比较好奇

superfisha 发表于 2009-11-07 06:36

回复 #6 accessory 的帖子

是在module_init里面初始化的最后分别用1000万次的读和写测试出来的。

superfisha 发表于 2009-11-07 10:55

原帖由 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吗?

accessory 发表于 2009-11-07 11:24

在linux里面,当你需要DMA之前,你要先指定内存区域,在这个时候,系统已经设置好那段内存是不用cache的了。所以不会出现你说得情况。

superfisha 发表于 2009-11-07 11:27

原帖由 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是如何做到的呢?

accessory 发表于 2009-11-07 11:53

在你启动dma之前,一般要调用ioremap, or pci_iomap. 他们有时设置了cache.

还可以看看下面的连接:
http://jianggmulab.blogspot.com/2009/05/ioremap_26.html
页: [1]
查看完整版本: 初次写驱动,菜鸟请教PCIE问题