Linux.ChinaUnix.net
ChinaUnix | Linux首页 | 新闻 | 博客 | 文章 | 专栏 | 新手 | 方案 | 图书 | 下载 | 人才 | 手册 | wiki | 搜索     
Linux论坛
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索 | 帮助 


进行DMA时如何保证Cache和内存内容的一致性?
首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »  
[打印] [订阅] [收藏] [推荐给朋友] [本帖文本页]
soararing   帅哥
骑士




UID:235103
注册:2005-3-8
最后登录: 2008-07-01
帖子:69
精华:0

可用积分:50
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
1楼 发表于 2008-5-10 17:56 
在DMA时将系统内存数据写到设备内存时,由于cache的原因,在分配系统内存的时候,必须设置这些内存页uncached,否则DMA失败,或者使用wbinvd命令强行flush所有的系统内存cache,但是这样会伤害DMA性能,不知各位如何设置系统内存页的uncache属性?

kernel中ioremap_nocache的实现同ioremap一样,好像不能实现。



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:1687
精华:3

可用积分:2338
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
2楼 发表于 2008-5-10 18:56 


QUOTE:
原帖由 soararing 于 2008-5-10 17:56 发表
在DMA时将系统内存数据写到设备内存时,由于cache的原因,在分配系统内存的时候,必须设置这些内存页uncached,否则DMA失败,或者使用wbinvd命令强行flush所有的系统内存cache,但是这样会伤害DMA性能,不知各位 ...

ioremap的对象是设备的寄存器或存储器,DMA的对象是物理内存。前者不能cache,但后者可以,LZ把两者搞混淆了



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
soararing   帅哥
骑士




UID:235103
注册:2005-3-8
最后登录: 2008-07-01
帖子:69
精华:0

可用积分:50
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
3楼 发表于 2008-5-10 21:25 
回复 #2 zx_wing 的帖子

DMA之前要将物理内存写到设备内存,现在的现象就是没有写到设备内存,DMA不能成功,所以希望用ioremap_uncache来设置设备内存不被cache,你说设备内存不能cache,那为什么有以下三个函数:
ioremap
ioremap_nocache
ioremap_writethrough



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:1687
精华:3

可用积分:2338
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
4楼 发表于 2008-5-10 21:57 


QUOTE:
原帖由 soararing 于 2008-5-10 21:25 发表
DMA之前要将物理内存写到设备内存,现在的现象就是没有写到设备内存,DMA不能成功,所以希望用ioremap_uncache来设置设备内存不被cache,你说设备内存不能cache,那为什么有以下三个函数:
ioremap
ioremap_no ...

不知道LZ是什么设备。
ioremap对应是设备的寄存器、扩展ROM,这些都不是DMA的目标,它们通常是不能被cache,至于原因,本版有很多帖子反复讲过了,LZ可以查阅。但特例是有的,例如VGA的显存是可以被cache的。LZ可以看看ioremap()和ioremap_nocache(),它们实际上是一样的(可能有的平台不一样,大多数平台应该是一样的)。至于ioremap_writethrough,确实没见过,也没找到。

但这些和DMA没什么关系。DMA从物理内存把数据拷贝到设备上,通常是拷贝到设备的FIFO管道,这对软件是透明的、不能被操作的。所以不会有ioremap去设置这些FIFO管道。当然,如果LZ自己做了个设备,和常规不一样,那我就不知道了。

LZ会不会是设备的DMA寄存器没有被正确ioremap,操作不正确,导致DMA不成功。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
soararing   帅哥
骑士




UID:235103
注册:2005-3-8
最后登录: 2008-07-01
帖子:69
精华:0

可用积分:50
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
5楼 发表于 2008-5-11 11:31 


QUOTE:
原帖由 zx_wing 于 2008-5-10 21:57 发表

不知道LZ是什么设备。
ioremap对应是设备的寄存器、扩展ROM,这些都不是DMA的目标,它们通常是不能被cache,至于原因,本版有很多帖子反复讲过了,LZ可以查阅。但特例是有的,例如VGA的显存是可以被cache的。 ...

嗯,回去再看了看,设备内存确实不是DMA的目标,DMA的目标也是一块kernel mode的物理内存,但是由于这块内存有cache的原因,倒是DMA失败,我要问的是如何分配一块不被cache的物理内存呢?

DMA之前使用wbinvd命令,DMA是成功的,谢谢楼上的回复。



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:1687
精华:3

可用积分:2338
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
6楼 发表于 2008-5-11 11:51 


QUOTE:
原帖由 soararing 于 2008-5-11 11:31 发表




嗯,回去再看了看,设备内存确实不是DMA的目标,DMA的目标也是一块kernel mode的物理内存,但是由于这块内存有cache的原因,倒是DMA失败,我要问的是如何分配一块不被cache的物理内存呢?

DMA之前使 ...

我估计LZ没有用内核的DMA接口分配内存。可以参见LDD3相关章节或dma-mapping.txt内核文档。内核会保证这种一致性的。
un-cache的内存不是必须时最好是不使用的,用intel手册的话说,性能是难以忍受的。
我比较奇怪的是你是什么设备?DMA流程是如何的?DMA通常是硬件自动的行为,你如何在一次DMA前用wbinvd指令,你的设备是自己配置一次做一次DMA吗?
基于x86平台特点,很少有地方要使用wbinvd指令,DMA更不需要。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
soararing   帅哥
骑士




UID:235103
注册:2005-3-8
最后登录: 2008-07-01
帖子:69
精华:0

可用积分:50
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
7楼 发表于 2008-5-11 15:50 
static inline void nv_set_page_attrib_uncached(nv_pte_t *page_ptr)
{
#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
    if (nv_use_cpa)
    {
        struct page *page = virt_to_page(__va(page_ptr->phys_addr));
        pgprot_t prot = PAGE_KERNEL_NOCACHE;
#if defined(NVCPU_X86) || defined(NVCPU_X86_64)
        pgprot_val(prot) &= __nv_supported_pte_mask;
#endif
        change_page_attr(page, 1, prot);
    }
#endif
}

嗯,是的,我没有用内核的DMA接口分配内存pci_alloc_consistent,因为这个接口分配的内存大小有限,我需要更大的内存,所以需要用vmalloc分配。

上面的代码是我刚从网上搜上的Nvidia的显卡驱动里面的一段代码,change_page_attr接口正好可以解决我的问题,呵呵,谢谢楼上的。

[ 本帖最后由 soararing 于 2008-5-11 16:01 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:1687
精华:3

可用积分:2338
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
8楼 发表于 2008-5-11 16:04 


QUOTE:
原帖由 soararing 于 2008-5-11 15:50 发表
static inline void nv_set_page_attrib_uncached(nv_pte_t *page_ptr)
{
#if defined(NV_CHANGE_PAGE_ATTR_PRESENT)
    if (nv_use_cpa)
    {
        struct page *page = virt_to_page(__va(page_ptr ...

如果你的设备不是做一次DMA就重新设置一次,而是设备自动DMA的话。那你不能用vmalloc分配内存,DMA要求内存是连续的,vmalloc不能保证。
如果需要页面比较多,超过了kmalloc的限制,你可以采用get_free_pages()函数分配。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
soararing   帅哥
骑士




UID:235103
注册:2005-3-8
最后登录: 2008-07-01
帖子:69
精华:0

可用积分:50
信誉积分:100
专家积分:0 (本版)

状态:...离线...

[资料] [站内短信] [Blog]


顶部
9楼 发表于 2008-5-11 16:15 
是的,我们会把vmalloc分配的内存重新建立页表,并把页表的基地址设到硬件寄存器中,这样硬件就能访问到DMA buffer,从而进行DMA.



您对本贴的看法:鲜花[0] 臭蛋[0]
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-07-04
帖子:1687
精华:3

可用积分:2338
信誉积分:100
专家积分:1 (本版)

来自:成都
状态:...保密...

[资料] [站内短信] [Blog]


顶部
10楼 发表于 2008-5-11 16:22 


QUOTE:
原帖由 soararing 于 2008-5-11 16:15 发表
是的,我们会把vmalloc分配的内存重新建立页表,并把页表的基地址设到硬件寄存器中,这样硬件就能访问到DMA buffer,从而进行DMA.

你的设备带IOTLB?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________


C调 ---- C语言
都是最喜欢的
CU可用积分兑换Linux/Unix精品图书 |《Ubuntu标准教程》书评获奖名单公布

首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »

 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - Linux时代 - Archiver - WAP - TOP

Processed in 0.043090 second(s), 5 queries , Gzip enabled