Linux.ChinaUnix.net
ChinaUnix
|
Linux首页
|
新闻
|
博客
|
文章
|
专栏
|
新手
|
方案
|
图书
|
下载
|
人才
|
手册
|
wiki
|
搜索
会员:
密码:
免费注册
|
忘记密码
|
会员登录
|
搜索
|
帮助
进行DMA时如何保证Cache和内存内容的一致性?
1
2
››
首页
»
CU论坛
»
Linux
»
汇总贴列表
»
内核源码
»
请选择您要去的论坛 ←
>新手园地
>系统管理
>网络问题
>硬件支持
>内核问题
>系统互操作专区
>中文支持
>桌面与办公
>影音娱乐
>网络工具
>编程问题
>内核源码
>CPU与编译器
>嵌入式开发
>驱动开发
>数据库应用
>服务器应用
>安全防护
>集群和虚拟机
>开源业界与评论
>贴图娱乐
>红茶馆
>文档专区
>下载共享
>Linux书友会
>Linux站务交流
===============
→ 操作系统技术交流区 ←
>BSD
>Solaris
>SCO UNIX
>HP-UX
>AIX
>IBM AS400应用论坛
>Tru64 UNIX
>IRIX
>Mac OS X
→ 行业解决方案交流区 ←
> 金融行业
> 电信行业
> 互联网行业
> 医卫行业
> 制造行业
> 信息安全
> 教育行业
> 媒体娱乐行业
> 电子政务
> 交通行业
→ 程序设计交流区 ←
>C/C++
>Shell
>Java
>Php
>Perl
>Python
>Web开发
>软件工程
>中间件技术
>GUI编程
>软件配置管理
>VOIP开发技术
→ 网管技术交流区 ←
>网络安全
>网络技术
>Cisco技术
>存储备份之家
>服务器及硬件技术
→ 数据库技术交流区 ←
>MySQL
>PostgreSQL
>Oracle
>Informix
>Sybase
>DB2
→ 应用技术专题交流区 ←
>Web服务器
>Mail服务器
>FTP服务器
>DNS服务器
>Proxy服务器
>LDAP
>VPN
>Lotus
>Samba
→ IT综合交流区 ←
>IT业界新闻与评论
>IT职业生涯
>IT培训与认证
>IT二手大厅
>IT图书与评论
→ IT人的休闲生活交流区 ←
>清茶斋
>运动地带
>快乐数码摄影
>影音文字
>English Forum
>游戏玩家
>旅游天下
>贴图娱乐
>红茶馆
>IT爱车族
→ 站务及频道交流区 ←
>站务交流
>版主会议室
>Linux站务交流
>Linux版主会议室
>博客站务交流区
>下载频道交流区
>CU活动专区
最近访问的论坛 ...
时代域名主机托管全面特惠
|
CU积分兑换详情
|
参加调查赠100积分+《Ubuntu官方指南》
|
100积分:谈谈您对校园网建设的体会
|
‹‹ 上一主题
|
下一主题 ››
[
打印
] [
订阅
] [
收藏
] [
推荐给朋友
] [
本帖文本页
]
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
»
汇总贴列表
»
内核源码
»
1
2
››
请选择您要去的论坛 ←
>新手园地
>系统管理
>网络问题
>硬件支持
>内核问题
>系统互操作专区
>中文支持
>桌面与办公
>影音娱乐
>网络工具
>编程问题
>内核源码
>CPU与编译器
>嵌入式开发
>驱动开发
>数据库应用
>服务器应用
>安全防护
>集群和虚拟机
>开源业界与评论
>贴图娱乐
>红茶馆
>文档专区
>下载共享
>Linux书友会
>Linux站务交流
===============
→ 操作系统技术交流区 ←
>BSD
>Solaris
>SCO UNIX
>HP-UX
>AIX
>IBM AS400应用论坛
>Tru64 UNIX
>IRIX
>Mac OS X
→ 行业解决方案交流区 ←
> 金融行业
> 电信行业
> 互联网行业
> 医卫行业
> 制造行业
> 信息安全
> 教育行业
> 媒体娱乐行业
> 电子政务
> 交通行业
→ 程序设计交流区 ←
>C/C++
>Shell
>Java
>Php
>Perl
>Python
>Web开发
>软件工程
>中间件技术
>GUI编程
>软件配置管理
>VOIP开发技术
→ 网管技术交流区 ←
>网络安全
>网络技术
>Cisco技术
>存储备份之家
>服务器及硬件技术
→ 数据库技术交流区 ←
>MySQL
>PostgreSQL
>Oracle
>Informix
>Sybase
>DB2
→ 应用技术专题交流区 ←
>Web服务器
>Mail服务器
>FTP服务器
>DNS服务器
>Proxy服务器
>LDAP
>VPN
>Lotus
>Samba
→ IT综合交流区 ←
>IT业界新闻与评论
>IT职业生涯
>IT培训与认证
>IT二手大厅
>IT图书与评论
→ IT人的休闲生活交流区 ←
>清茶斋
>运动地带
>快乐数码摄影
>影音文字
>English Forum
>游戏玩家
>旅游天下
>贴图娱乐
>红茶馆
>IT爱车族
→ 站务及频道交流区 ←
>站务交流
>版主会议室
>Linux站务交流
>Linux版主会议室
>博客站务交流区
>下载频道交流区
>CU活动专区
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