Read MIPS Run2nd MIPS cache(转)
2008.9.28
Read MIPS Run2nd MIPS cache 激烈一些,没有cache的MIPS就不是RISC..... MIPS reset 后cache的大部分状态都是未定义的, 这也是bootstrap需要初始化cache的原因. Cache 和cache 管理 L1 cache的重要作用就是在固定的时间内完成操作以使CPU的pipeline无间歇的运转. MIPS采用哈佛结构的cache即I,D分开. X86的做法是隐藏cache, 隐藏绝大多数细节. 而MIPS认为, cache是让CPU更快,而不是帮助系统程序员. 无论什么CPU, cache对于应用都是透明的. 下面, see MIPS run的作者给出图示来讲cache的原理. 这几乎每个CPU都相同. 这里把我从其他CPU里(ARM讲的最好)搞到的解释放到这里. 也可以参考拙作:http://docs.google.com/Doc?id=dcbsxfpf_282csrs2pfn 下面的两个例子和图形分析下啥是index,啥是tag: K8 4k 2-way cache, cache line 64B 0. 共4k, cache line 长度是64B, 共64个cache line 这种实现, cache line 的index (way 选择), 和date的'index ' 分别具有不同的bit数目. n-way的cache意味着命中cache的时候需要同时和n个 cache index 进行比较. (肯定是同时,如果比两次还不如用1:1的cache呢). 如果n比较大, 用类似CAM的实现方式显然比较靠普, 就下面要说的ARM920T的I-cache. ARM920T (SAM SUNG 2410a) I-cache :16k 64-way cache, 32B cache line 0. 共16k, cache line 长度是32B, 共512个cache line n-way的cache意味着命中cache的时候需要同时和n个 cache index 进行比较. 这次是用CAM. MIPS cache 的几句话: ---1992年前的MIPS多是采用Direct Map的cache ---2 Way, 4-way 较为常见. 因为比较简单,易于实现. ---大于4way的cache,在替换策略上就要折衷实现, LRU是比较难(慢), 或许采用LRF(least recently filled). ---多way的cache 需要的线就比较多,难以集成到CPU内部,对频率提生同样产生负面影响. --- 早期MIPS 采用direct map的write-through的cache, 用一个write buffer 来加速CPU写操作. --- 到了R4000, CPU已经快到有必要让内存系统吸收每个write操作的地步.(一般认为10个指令中会有一个写操作, write through 只要内存操作在5-7倍指令cycle之内,就能满足要求,当时DRAM cycle大约180ns, CPU在30-40Mhz之内还行). ----所以引入了cache write back 模式. 这中模式有一种叫做write alloc,即写入内存的时候同时分配一个cache条目给数据. SMP系统的的cache设计在后面. Cache 设计的一些其他决定(选择) --- Physical address 和 virtually address 对于cache的index和cache的有关选择,再次自我推荐: 随着技术进步, TLB查找速度提高了, 在cache 用index查找cache的过程中TLB可以完成虚拟地址到物理地址的转换工作, 在cache比较tag的时候物理地址已经可以使用了, 就是说采用physical tag可以和cache并行工作, virtual tag已经不怎么使用了, 特别是在容量比较大的cache中(比如l2 cache). 只有小,并且延迟很小的cache 还或许采用virtual tag. alias就是同一个物理地址被映射到两个或多个相同或者不同的虚拟地址的时候,cache 中存在多于一个的cache line 包含这个物理地址的数据, 具体来讲, alias 是这样产生的: 一个PA 被映射到不同的虚拟地址, 如linux下, 内核和用户访问页面的虚拟地址可能不同. 这些虚拟地址有个特点,因为映射到同pa , 其低几位bit 必然相同. Cache Ambiguity Process 1: |31 VA 20| phy address low bit| => PA1 | phy address low bit| MIPS CPU Cache kseg0 是物理内存低512M的cache "映射", kseg1用于非cache 访问. 64bit CPU有另外的窗口可以访问高于512M的cache, 在32bit CPU上, 只能通过TLB了. TLB可以指定是否可以cache. X86类似的CPU使用硬件的种种手段是cache对系统软件保持透明, 这样的cache也称为"coherent"(snoopy). 除了初始化cache, 正常运行的系统需要关注cache的地方不是太多: --- DMA --- 动态产生指令 2006年的时候大家趋向于采用硬件手段来消除cache带来的复杂度, 从而减少犯错误的几会. MP下cache更为复杂, 还好,1980s中期的时候一个叫做Futurebus 的标准的产生让我们放心多了. 2006年以来,出了桌面和极为高端的嵌入式设备, 很少见到L3cache, 一般只到L2而已. 近代CPU的发展也触及到了MIPS的基本原则, CPU变得飞快, 不得不延长pipeline,容许2个cycle的 cache access. 有L2cache的CPU, L1 cache 一般较小, 16kx2是一个常见配置. cache的配置接口在MIPS早期有两个版本一个是R3000类型的32bitCPU, 另一个是R4000类型的64bitCPU, 好在MIPS32采纳了R4000的接口,现在统一到了一起. Programming MIPS32/64 Caches --- Invalidate range of locations --- Write-back range of locations ---- Invalidate entire cache ---- Initialize caches cache 指令的格式 另外还有高2个bit需要选择要操作的cache: cache 指令选择cache line的方式有三种: 如果提供了synci(D-cache write back + I cache invalid), 要优先使用synci(而不是分开的两个cache 操作) Cache 初始化和TagLo/TagHi TagLo, taghi用于CPU和cache交换cache的tag数据. 除非大于36bit的地址空间, tagHi一般用不着. Taghi,taglow的定义是CPU特定的,只有一个是通用的: 全0代表了合法,正确的一个没有有效数据的cache. cache IndexStoreTag 就是copy taghi/lo到cache 中, 这样用全0值,即可初始化CPU 的cache. 具体使用需要参考CPU手册. memory/cache CacheErr, ERR, and ErrorEPC Registers 作为构建可信赖的计算系统,数据一致性检查非常有必要,因此,用于构建高可靠性系统的MIPS CPU常选择在cache这个级别来提供数据一致性检测, 比如简单的Parity或者ECC. 现在的内存系统倾向于提供多个8bit的数据传输,常见的是64bit的数据和8bit的校验bit, 各种校验的实现大多基于此. Parity比较简单,为每个byte提供一个校验bit,他之可以告诉你数据是不可信的.但是Parity的准确度大约是50%.(全垃圾数据的校验位也可能是正确的). ECC使用全部的8个bit来校验64bit的数据, 可以校正1个bit的错误,并且2个bit的错误检测的准确率是100%.但是ECC不能支持 half-word的写操作,必须写完64bit后重新计算ECC,MIPS对于不可cache的系统要求内存系统提供这个操作. 所以简单的系统多提供parity或者没有校验. 不必要在装入cache的时候就进行校验,在数据被使用的时候去校验反而能准确的定位使用这个数据的指令.对一个uncache的数据读取,也是报告的cache parity error,这点或许有点误导人,需要注意. 处理校验错误的中断向量位于uncache区域,这个好理解. 对于ECC的错误,有的CPU自己能够校正错误,有的则交给软件处理. CacheErr 寄存器是特定于CPU的实现的,需要参考CPU手册来确定. 初始化cache 1. 设置一些可以fill cache的内存: 比较有用的技术是预留最低端的32k专门用于初始化cache, 目的是可以保证我们拥有正确的校验位()(至少保留到cache 初始化完成之后). (RFC) 4.先初始化I-cache, 然后初始化D-cache.(RFC) 5.D-cache 初始化因为没有fill指令,需要依赖于cache miss. Invalidating or Writing Back a Region of Memory in the Cache invalid cache用hit style的寻址模式比较高效,如果是大面积的invalid,不如就全部flush cache算了. 如果传递的buf是程序地址,用hit style就没有任何问题,如果是基于物理地址, 对于头512M的物理地址,需要把地址调整到kseg0 Cache的效率问题 自从1990s on chip cache开始流行以来,cache的有效使用就成为发挥cpu效能的一个关键. 特别对于嵌入式系统. 统计来讲,CPU常常花费%50-60的时间来等待cache refill,导致CPU效率翻倍只能提高应用25的性能. 以下两个指标可以作为描述cache效能的参数: cache miss rate—the number of misses per CPU memory access: 受到多方面影响不是一个好的参数. 比如x86,比较缺少寄存器,故而编译器用堆栈作为一个替代品,这样产生非常密集的数据访问:只访问堆栈那一小段内存,从而cach的效果较好.而 mips的同样代码访存指令就没有那么多,这个参数上就吃亏了. 相比而下,cache misses per thousand instructions受此影响就较少. 提高使用效率的方法: --- Decrease the cache refill penalty --- Restart the CPU earlier --- Don’t stop the CPU until it must have the data ---Multithread the CPU Cache的软件优化 比较适合于嵌入式系统,为一个特定应用优化cache访问. 从cache miss的原因入手: 优化方法: 一般要现排除软件问题, 最后去看硬件问题,硬件问题需要硬件自己搞定(比如超级慢的refill). cache Aliases 一个物理地址的内容可以出现在多个cache line内.对于VIPT的MIPS这个比较常见.原理看看上面俺的"大作"即可. MIPS L2(其他CPU也大多是)PIPT,不用担心. 硬件人员应该铭记:这个东西确实是15年前(2006-15)一个硬件bug,而不是什么特色. |
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(1581) | 评论(0) | 转发(0) |
上一篇:(转)大小端和存储器对齐
下一篇:74Kc mini_boot
- SHTML是什么_SSI有什么用...
- 卡尔曼滤波的原理说明...
- shell中字符串操作
- 关于java中的“错误:找不到或...
- linux设备驱动归纳总结...
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
Read MIPS Run2nd MIPS cache(转)相关推荐
- Mips TLB miss异常
最近分析龙芯KVM的实现,顺便又粗看了遍MIPS的手册,跟KVM相关的主要模块包括: CPU虚拟化 内存虚拟化 IO虚拟化 目前龙芯上CPU虚拟化跟标准内核差异不大,需要软硬件配合支持,目前龙芯整体能 ...
- MIPS Linux内核编译构建环境的搭建
AI的端侧应用离不开各种算力平台,目前形成了CPU+NPU,CPU+FPGA以及CPU+GPU的几类算力搭配,他们各有优势,也各有弱点.先看它们的共同点,从组合名字可以看出,那就是他们都依赖CPU,这 ...
- mips指令与寄存器详解
MIPS通用寄存器 MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中使用约定如下: 下表描述32个通用寄存器的别名和用途 REGISTER NAME USAGE $0 $zero ...
- Android开发中libs包下面的mips、armeabi、armeabi-v7a和x86
简介 在Android日常的开发过程中有的项目需要引入第三方的库,有时候大家可能会在libs文件夹下看到 mips.armeabi.armeabi-v7a和x86这四个文件夹.那么这三个文件夹下面的包 ...
- 几种芯片架构:X86、ARM、RISC-V和MIPS
首先,是cpu的两大架构:ARM和X86. 第一个区别就是所谓的"复杂指令集"与"精简指令集"系统,也就是经常看到的"CISC"与" ...
- MIPS介绍与MIPS汇编的常用指令
描述 CTF做题时会遇见MIPS汇编的题目,而我们接触的是8086汇编,IDA是不能反汇编的需要自己了解一些MIPS方面的知识; 1. List 1 在不同的设备中,汇编语言对应着不同的机器语言指令集 ...
- mips j指令_MIPS处理器 MIPS指令集(上)
目录 引言 MIPS指令集有固定的MIPS指令格式和MIPS指令类型,还有固定的MIPS寄存器,它们是了解MIPS指令必不可少的前提. 其中,寄存器是MIPS处理器高效的临时存储工具,其存取速度极快, ...
- 【原创】MIPS中断系统的板级验证及实例测试
"五一"假期前后这约五天时间,终于将MIPS中断系统进行了板级验证及实例测试.因为老师给的交叉编译工具不会用,所以测试代码完全用MIPS汇编编写.使用MARS而没有用QtSpim, ...
- 四大主流芯片架构(X86、ARM、RISC-V和MIPS)
目前市场上主流的芯片架构有 X86.ARM.RISC-V和MIPS四种: 序号 架构 特点 代表性的厂商 运营机构 发明时间 1 X86 性能高,速度快,兼容性好 英特尔,AMD 英特尔 1978年 ...
最新文章
- python潜力开源项目_比较了1000多个Python开源项目,精选出这34个
- kafka与zookeeper关系
- 百万并发中间件系统的内核设计看Java并发性能优化
- 8、collection
- Win10: tensorflow 学习笔记(3)
- access无法与wincc链接_wincc和Access连接写如变量
- mysql中in的使用
- 下载配置Gradle
- linux 查看ftp连接用户
- 常见的web前端编程软件
- 数值计算(四)——插值法(3)Hermite插值法(补充)
- 多目标跟踪(Multi-Object-Tracking)入门
- 电商API接口如何使用(教你获取数据)
- matlab求复数的模
- TeamCity Angent 配置(Ubuntu)
- asp.net 面试题目
- 【Python基础知识整理】
- 【读书】2020年阅读记录
- Android HAL层到驱动代码搜索---基于背光亮度的调试
- js OO写的一个键盘字母游戏
热门文章
- wondows 与sql
- python处理矢量数据格式转换,shp转为geojson,geojson转为pbf,pbf转为geojson
- mysql不自动提交更改语句_MySQL设置事务自动提交(开启和关闭)
- Android硬件扩展接口有哪些,一种安卓智能设备USB接口拓展的方法及装置与流程...
- 关于Logcat日志输出说明
- 深圳PCT国际专利申请量全国十一连冠
- 什么是云防火墙?云防火墙是如何保护网站安全呢?
- 系统改造升级步骤及注意事项(一)
- 庖丁解牛Linux内核分析 0x00:《庖丁解牛》
- Unusual Sequences (隔板法+dp)