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


进行DMA时如何保证Cache和内存内容的一致性?
首页 » CU论坛 » Linux » 汇总贴列表 » 内核源码 »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
jiangqiangq
新手




UID:698291
注册:2008-4-28
最后登录: 2008-09-19
帖子:3
精华:0

可用积分:3 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

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


11楼 发表于 2008-5-12 08:54 


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




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

DMA之前使 ...

DMA内存也是普通的物理内存,这块内存会被设备和CPU存取,例如,CPU需要首先向DMA内存中写入数据,然后通知设备进行DMA读操作。如果1)CPU没有采用合适的Cache属性,2)cpu没有在通知设备进行DMA操作之前进行flush cache 3)设备进行DMA操作的时候没有进行cache snoop,那么确实会导致出错。

另,zx_wing,我想LZ说的是显卡,显卡可以通过GART实现IOMMU的功能。



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-10-10
帖子:2015
精华:4

可用积分:1794 (家境小康)
信誉积分:100
专家积分:21 (本版:1)
空间积分:0
推广积分:0

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

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


12楼 发表于 2008-5-12 12:30 


QUOTE:
原帖由 jiangqiangq 于 2008-5-12 08:54 发表


DMA内存也是普通的物理内存,这块内存会被设备和CPU存取,例如,CPU需要首先向DMA内存中写入数据,然后通知设备进行DMA读操作。如果1)CPU没有采用合适的Cache属性,2)cpu没有在通知设备进行DMA操作之前进 ...

是yunhong老大吗?要真是你的话以后有空多泡CU哈,有你在我估计内核版就没什么问题了
LZ用的应该是x86平台,他提到wbinvd了,cache的flush和snoop硬件都做了,所以我觉得只要用get_free_pages分配一片他要的内存就好了。
显卡就完全不懂了。我听说已经有带IOTLB的设备出来了,所以好奇LZ用的是不是



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

__________________________________


C调 ---- C语言
都是最喜欢的
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
crspo
精灵




UID:167638
注册:2004-6-28
最后登录: 2008-10-09
帖子:194
精华:1

可用积分:227 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

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


13楼 发表于 2008-5-12 22:27 


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 ...

change_page_attr()应该使用了PCD,另外如果是显存的话,应该映射至WC类型的区域而不是被缓存起来,通过这种方式提高性能



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
folklore   帅哥
精灵




UID:139873
注册:2004-3-5
最后登录: 2008-05-15
帖子:157
精华:0

可用积分:369 (白手起家)
信誉积分:100
专家积分:11 (本版:11)
空间积分:0
推广积分:0

状态:...离线...

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


14楼 发表于 2008-5-13 09:12 
Cache 击落(使相应或全部CACHE无效就行了)



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
jiangqiangq
新手




UID:698291
注册:2008-4-28
最后登录: 2008-09-19
帖子:3
精华:0

可用积分:3 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

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


15楼 发表于 2008-5-13 09:39 


QUOTE:
原帖由 crspo 于 2008-5-12 22:27 发表

change_page_attr()应该使用了PCD,另外如果是显存的话,应该映射至WC类型的区域而不是被缓存起来,通过这种方式提高性能

LZ没有提供太多信息,但是我想他所指的应该不是framebuffer,而可能是其他的内存,例如texture surface, command buffer等。



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

__________________________________

我爱胖胖的小锵锵!
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
longda
侠客




UID:374554
注册:2006-2-20
最后登录: 2008-07-30
帖子:13
精华:0

可用积分:13 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

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


16楼 发表于 2008-5-14 14:48 
这个问题,我曾写过一段代码可以解决,但是,他不够general,在有的os上编译不过,而且似乎在AMD cpu上失败了

void set_nocached(unsigned long addr)
{
    pgd_t *dir;
    pmd_t *pmdp;
    pte_t *ptep;
    pgprot_t newprot;

    dir = pgd_offset_k(addr);
    pmdp = pmd_offset(dir, addr);
    ptep = pte_offset_kernel(pmdp, addr);
    memset( &newprot, 0, sizeof(newprot) );
    pgprot_noncached(newprot);
    pte_modify(*ptep, newprot);
}


可以到kernel里面搜索 pgprot_noncached, 凡是调用pgprot_noncached 这个的地方研究一下,就会有所收获

另外如果找到该段内存的vm_area   (struct vm_area_struct  )的话,也会比较容易解决

      vma->vm_flags |= VM_IO;            /* I/O memory */
        vma->vm_flags |= VM_RESERVED;    /* avoid to swap out this VMA */

        /* Set correct page protection bits to avoid memory caching */
        pgprot_val(vma->vm_page_prot) |= _PAGE_PCD;
        pgprot_val(vma->vm_page_prot) &= ~_PAGE_PWT;

去内核中,搜索_PAGE_PWT和_PAGE_PCD 会有所收获的



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
zhiwood
圣骑士




UID:153723
注册:2004-4-22
最后登录: 2008-10-01
帖子:99
精华:0

可用积分:87 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

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


17楼 发表于 2008-5-15 13:10 
回复 #11 jiangqiangq 的帖子

AGP的显卡用non-cached内存和sse2指令时,性能有提升,
dma就没必要改内存属性了。通常数据都是在dma之前送到buffer的,没做改动,所以没必要考虑cache.
而且,如果有改动,系统应该有一些函数来flush memory,可以在dma之前flush一下就行了,也没必要
改成non-cached.



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
evil_hunter
侠客



UID:599530
注册:2007-8-8
最后登录: 2008-10-10
帖子:31
精华:0

可用积分:30 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

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


18楼 发表于 2008-5-15 17:30 
disable cache 会影响DMA的性能,可以通过invalidate_dcache, 调用这个函数后,不论要读问的内存是否在cache中,都会强制性的读取内存中的实际内容。

以前的帖子
http://linux.chinaunix.net/bbs/viewthread.php?tid=907505



您对本贴的看法:鲜花[0] 臭蛋[0]
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?
zx_wing   帅哥 (骑着猪的青蛙)
大天使
学徒



UID:499746
注册:2006-12-4
最后登录: 2008-10-10
帖子:2015
精华:4

可用积分:1794 (家境小康)
信誉积分:100
专家积分:21 (本版:1)
空间积分:0
推广积分:0

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

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


19楼 发表于 2008-5-15 17:36 
我不知道各位说的DMA disable cache是在什么情况下用的。
反正x86平台是不需要的。通常只有RISC平台才需要显式的调用刷新函数,也不需要disable cache。



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

__________________________________


C调 ---- C语言
都是最喜欢的
积分兑换专区 | IT节能和TPC-E活动获奖名单 | 致电800-858-2903,了解DELL如何为你量身订制笔记本 | 送2G U盘 | 站长如何获得资金?

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

 


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

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

京ICP证041476号


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

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