- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
处理硬件高速缓存和TLB白皮书 P79-83红皮书 P228-230 徐波Why?RAM和CPU速度不一样,减少CPU的等待时间RAM相对于硬盘来说,已经相当的快了。但和CPU相比,性能还是不够。当今的CPU时钟频率接近几个GHz,而动态RAM芯片的存取时间是时钟周期的数百倍,这就意味着从RAM中取操作数或向RAM存放结果这样的指令执行时,CPU可能需要等待过长的时间。为了缩小CPU和RAM之间的速度不匹配,引入了硬件高速缓存(hardware cache memory)。硬件高速缓存基于局部性原理(locality principle)。该原理既适用程序结构也适用数据结构。因此,引入小而快的内存来存放最近最常用的代码和数据变得很有意义。What?硬件高速缓存(hardware cache memory) 内核将高速缓存视为通过虚拟地址快速访问数据的一种机制,TLB-转换后援缓冲器(translation?lookaside?buffer) TLB的语义抽象是将虚拟地址转换为物理地址的一种机制。(红) TLB是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存。(网)处理硬件高速缓存硬件高速缓存是通过高速缓存行(cache line)寻址的。L1_CACHE_BYTES宏产生以字节为单位的高速缓存的大小。 在早于Pentium 4 的intel模型中,这个宏产生的值为32;在Pentium 4以上则为128.处理硬件高速缓存为了使高速缓存命中率达到最优化,内核一般考虑以下的几点: 1. 常用字段对齐:一个数据结构中最常使用的字段尽可能的对齐的放在一起,从而使它们能够缓冲到同一个cache line中。 2. 连续分配内存:为一大组数据结构分配空间时,内核试图把这些数据结构尽可能的存放在地址连续内存里,使得它们能够尽可能的被同一个cache line缓冲。 3. 使用高速缓存友好性的代码。审慎地混合使用普通函数、内联定义、宏。(红皮书)处理硬件高速缓存80X86微处理器自动高速缓存的同步刷新,所以用于这种处理器的linux内核并不处理任何硬件高速缓存的刷新但是内核却为不能同步高速缓存的处理器提供了高速缓存刷新接口对于X86微处理器体系结构而言,Intel已经为装入高速缓存的数据提供了一种自动与内存保持一致性的机制(窥探 cache snooping),因此内核对此就无需关心,所以对于Cache刷新的一些内核接口的实现基本上都是空的,比如以下的几个函数:空操作 do{}while(0) –内核代码include/asm-x86/cacheflush.h处理TLB处理器不能自动同步它们自己的TLB,因为决定线性地址和物理地址之间映射何时不再有效的是内核,而不是硬件。比如,从当前进程切换到另外的一个进程,每个进程都有自己的页目录页表结构,都有着不同的从线性地址到物理地址的映射方案,所以,当进程切换的时候,原来TLB中的内容就应该失效。处理TLB对于X86结构,Intel微处理器只提供了两种使TLB无效的技术,也就是说Linux内核提供的那么多的函数最后无非就是通过利用以下两种机制来实现: 1. 在向CR3寄存器写入值时CPU自动刷新相对于非全局 页的TLB表项。 2. Pentium Pro及其以后的CPU中,invlpg汇编语言指 令使映射制定线性地址的单个TLB表项无效。如果想要刷新全局页对应的TLB表项,则需要通过把CR4的PGE标志位清0,然后再将CR4的PGE标志位置1,既:开启—〉关闭—〉再开启。内核中刷新TLB的函数最终是调用这3个宏来实现的:处理TLB__flush_tlb( ) 的实现__flush_tlb_global( ) 的实现__flush_tlb_single( ) 的实现代码:include/asm-x86/Tlbflush_64.h include/asm-x86/Tlbflush_32.h懒惰TLB模式一般来说,任何进程的切换都会暗示着更换活动页表集,不过内核在下列情况将避免TLB被刷新: 1. 当两个使用相同页表集的普通进程之间执行进程切换时。 2. 当在一个普通进程和一个内核线程间执行进程切换时。内核线程并不拥有自己的页表集,它们使用刚在CPU上执行过的普通进程的页表集。一般来说,它只对内核空间的内容进行访问,所以如果用户空间部分的页目录/页表发生了变化,没有必要更新TLB,因为内核线程用不到这些内容。在多处理机系统(SMP)上,为了避免多处理器系统上无用的TLB刷新所造成的时间和空间资源的浪费,内核使用一种叫做懒惰TLB(Lazy TLB)模式的技术。基本思想:如果几个CPU正在使用相同的页表,而且必须对这些CPU上的一个TLB表项刷新,那么,在某些情况下,正在运行内核线程
文档评论(0)