免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: scutan
打印 上一主题 下一主题

请教关于CPU直接读写内存的问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-07-17 00:19 |只看该作者
原帖由 zx_wing 于 2008-7-17 00:05 发表

顺便说一下scutan同学这里的正题。
这是不可能的,因为读必须经过cache,也就是说没有直接从内存读到寄存器的说法,都是先读到cache,再到寄存器。
是否绕开cache,是针对写的情况。还没有听说过绕开CPU ca ...


那这样的话,感觉这个指令没有什么用处。

如果仅仅是在写的时候直接写到内存中去的话,那么读的时候呢?不也是会从内存中读到cache中来吗,也会使得之前的cache失效。
这样就使得这条指令的初衷有了矛盾。因为它就是不想污染cache,但是在读的时候却污染了。

论坛徽章:
0
22 [报告]
发表于 2008-07-17 00:29 |只看该作者
原帖由 scutan 于 2008-7-17 00:19 发表


那这样的话,感觉这个指令没有什么用处。

如果仅仅是在写的时候直接写到内存中去的话,那么读的时候呢?不也是会从内存中读到cache中来吗,也会使得之前的cache失效。
这样就使得这条指令的初衷有了矛盾 ...


这种指令不是数据又写又读的情况下用的.
任何东西都是避其短用其长.

论坛徽章:
0
23 [报告]
发表于 2008-07-17 00:31 |只看该作者
原帖由 system888net 于 2008-7-17 00:29 发表


这种指令不是数据又写又读的情况下用的.
任何东西都是避其短用其长.


嗯,明白了。之前我想错了 ,谢谢!

论坛徽章:
0
24 [报告]
发表于 2008-07-17 09:35 |只看该作者
原帖由 scutan 于 2008-7-17 00:19 发表


那这样的话,感觉这个指令没有什么用处。

如果仅仅是在写的时候直接写到内存中去的话,那么读的时候呢?不也是会从内存中读到cache中来吗,也会使得之前的cache失效。
这样就使得这条指令的初衷有了矛盾 ...

哈哈,我说一点自己的看法吧,不要怪我扯远了。
我认为这些指令的初衷不是为了不污染cache。x86上有一个规则,即读写的顺序性由硬件保证。这方便了程序员,但对硬件的执行效率有影响。我所知道的所有RISC平台都是将顺序性的问题交给程序员(准确的说是编译器)保证。
这些指令使用的WC正好就具有这个特征,所谓的弱顺序性。
所以应该理解成这些指令使用一个具有RISC架构特性的buffer,让CPU可以抛开硬件保证顺序性的规则全速执行,带来一定的性能特征。
当然,这些指令在执行时只和WC打交道,而不用其它进程共用的L1~L3,也会避免别人污染自己的cache,使局部性效应更强。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
25 [报告]
发表于 2008-07-17 10:19 |只看该作者
受教了。。。这方面了解不够深入,帮LZ顶一下。

论坛徽章:
0
26 [报告]
发表于 2008-07-17 11:21 |只看该作者
原帖由 zx_wing 于 2008-7-17 09:35 发表

哈哈,我说一点自己的看法吧,不要怪我扯远了。
我认为这些指令的初衷不是为了不污染cache。x86上有一个规则,即读写的顺序性由硬件保证。这方便了程序员,但对硬件的执行效率有影响。我所知道的所有RISC平台 ...

非常感谢!受益匪浅!
今天也找了一下关于Write Combine方面的资料学习了一下。我想正如你说的那样movnti这类指令就是为了用自己的一套Cache而不用L1,L2 Cache。避免相互污染!

论坛徽章:
0
27 [报告]
发表于 2008-07-17 12:51 |只看该作者
对于X86来说,绕过缓存是有一点困难,因为X86在最初设计的时候是没有缓存概念的。加上缓存之后,为了保证兼容性,缓存对于程序员是透明的。
但是后来设计的CPU中,缓存不是一个可以忽视的组件,必须要手工做初始化之类工作。
象MIPS的设计,绕过缓存非常容易:只要访问不同虚拟地址就行了。访问0x80000000~0xa0000000之间地址需要通过缓存,访问0xa0000000~0b0000000不通过缓存,它们都映射到物理地址:0~02000000。

论坛徽章:
0
28 [报告]
发表于 2008-07-17 13:25 |只看该作者
原帖由 SuperZ 于 2008-7-17 12:51 发表
对于X86来说,绕过缓存是有一点困难,因为X86在最初设计的时候是没有缓存概念的。加上缓存之后,为了保证兼容性,缓存对于程序员是透明的。
但是后来设计的CPU中,缓存不是一个可以忽视的组件,必须要手工做初 ...

x86一样的特性。
个人认为MIPS的内存管理很僵化。

论坛徽章:
0
29 [报告]
发表于 2008-07-17 20:43 |只看该作者
原帖由 zx_wing 于 2008/7/17 13:25 发表

x86一样的特性。
个人认为MIPS的内存管理很僵化。


我可不认为MIPS的MMU很僵化,反而很灵活:需要虚拟内存支持的真正OS可以充分利用MMU,不要虚拟内存支持嵌入式软件完全可以直接使用Kseg0和Kseg1两个区域。
即使是Intel最新的Itanium也是这样设计的:包括两个直接映射段,一个通过缓存,一个不通过。

论坛徽章:
0
30 [报告]
发表于 2008-07-17 22:19 |只看该作者
原帖由 SuperZ 于 2008-7-17 20:43 发表


我可不认为MIPS的MMU很僵化,反而很灵活:需要虚拟内存支持的真正OS可以充分利用MMU,不要虚拟内存支持嵌入式软件完全可以直接使用Kseg0和Kseg1两个区域。
即使是Intel最新的Itanium也是这样设计的:包括两 ...

虽然我不在MIPS上做开发,但从各种渠道还是有点了解,说错勿怪。
只有DOS时代的软件,和简单软件才不需要页表,而用类似8086实模式的方式访问内存。也就是你这里说的Kseg0和Kseg1。我说它僵化正是因为这种硬件对虚拟地址空间的强制分区。
它把虚拟地址空间分成5个区域,每个区域的地址起始和结束是硬件规定死的,这意味着程序在链接时要强制使用一些固定的虚拟地址。并且对于是否使用cache,居然有两个区域是硬件规定uncache的,而不能被动态配置。最后,kesg0、kesg1以及upper-kesg2是静态identify mapping,这表示这3个区域的虚拟地址对应的物理地址是硬件规定死的,非常僵化。
一个灵活的的内存机制,应该让虚拟地址到物理地址的映射关系是可由软件动态配置的,内存属性也应该是可以配置的,最后是不应该对虚拟地址空间进行硬件分区,而是应该让软件分区自己决定该用哪些,不用哪些。

我没说MIPS的MMU是僵化的,相反它是灵活的,可以用软件操作的MMU都是灵活的。
最后兄弟你对IA64架构的认识太片面了

[ 本帖最后由 zx_wing 于 2008-7-17 22:44 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP