1-byte:1 字节的操作数和操作码共同以 1 字节表示;操作数是内部寄存器,并被编码到指令中;指令需要一个存储位置来将单个寄存器存储在存储位置中 。没有操作数的指令也是 1-byte 指令 。
例如:MOV B,C 、LDAX B、NOP、HLT(这块不明白的读者可以自行查阅)
2-byte: 2 字节包括:第一个字节指定的操作码;第二个字节指定操作数;指令需要两个存储器位置才能存储在存储器中 。
例如 MVI B, 26 H、IN 56 H
3-byte: 在 3 字节指令中,第一个字节指定操作码;后面两个字节指定 16 位的地址;第二个字节保存低位地址;第三个字节保存 高位地址 。指令需要三个存储器位置才能将单个字节存储在存储器中 。
例如 LDA 2050 H、JMP 2085 H
大多数程序总是对少量页面进行多次访问,而不是对大量页面进行少量访问 。因此,只有很少的页面能够被再次访问,而其他的页表项很少被访问 。
页表项一般也被称为 Page Table Entry(PTE) 。基于这种设想,提出了一种方案,即从硬件方面来解决这个问题,为计算机设置一个小型的硬件设备,能够将虚拟地址直接映射到物理地址,而不必再访问页表 。这种设备被称为转换检测缓冲区(Translation Lookaside Buffer, TLB),有时又被称为 相联存储器(associate memory)。

文章插图
? TLB 加速分页
TLB 通常位于 MMU 中,包含少量的表项,每个表项都记录了页面的相关信息,除了虚拟页号外,其他表项都和页表是一一对应的

文章插图
是不是你到现在还是有点不理解什么是 TLB,TLB 其实就是一种内存缓存,用于减少访问内存所需要的时间,它就是 MMU 的一部分,TLB 会将虚拟地址到物理地址的转换存储起来,通常可以称为地址翻译缓存(address-translation cache) 。TLB 通常位于 CPU 和 CPU 缓存之间,它与 CPU 缓存是不同的缓存级别 。下面我们来看一下 TLB 是如何工作的 。
当一个 MMU 中的虚拟地址需要进行转换时,硬件首先检查虚拟页号与 TLB 中所有表项进行并行匹配,判断虚拟页是否在 TLB 中 。如果找到了有效匹配项,并且要进行的访问操作没有违反保护位的话,则将页框号直接从 TLB 中取出而不用再直接访问页表 。如果虚拟页在 TLB 中但是违反了保护位的权限的话(比如只允许读但是是一个写指令),则会生成一个保护错误(protection fault) 返回 。
上面探讨的是虚拟地址在 TLB 中的情况,那么如果虚拟地址不再 TLB 中该怎么办?如果 MMU 检测到没有有效的匹配项,就会进行正常的页表查找,然后从 TLB 中逐出一个表项然后把从页表中找到的项放在 TLB 中 。当一个表项被从 TLB 中清除出,将修改位复制到内存中页表项,除了访问位之外,其他位保持不变 。当页表项从页表装入 TLB 中时,所有的值都来自于内存 。

文章插图
软件 TLB 管理直到现在,我们假设每台电脑都有可以被硬件识别的页表,外加一个 TLB 。在这个设计中,TLB 管理和处理 TLB 错误完全由硬件来完成 。仅仅当页面不在内存中时,才会发生操作系统的陷入(trap) 。
在以前,我们上面的假设通常是正确的 。但是,许多现代的 RISC 机器,包括 SPARC、MIPS 和 HP PA,几乎所有的页面管理都是在软件中完成的 。
精简指令集计算机或 RISC 是一种计算机指令集,它使计算机的微处理器的每条指令(CPI)周期比复杂指令集计算机(CISC)少在这些计算机上,TLB 条目由操作系统显示加载 。当发生 TLB 访问丢失时,不再是由 MMU 到页表中查找并取出需要的页表项,而是生成一个 TLB 失效并将问题交给操作系统解决 。操作系统必须找到该页,把它从 TLB 中移除(移除页表中的一项),然后把新找到的页放在 TLB 中,最后再执行先前出错的指令 。然而,所有这些操作都必须通过少量指令完成,因为 TLB 丢失的发生率要比出错率高很多 。

文章插图
无论是用硬件还是用软件来处理 TLB 失效,常见的方式都是找到页表并执行索引操作以定位到将要访问的页面,在软件中进行搜索的问题是保存页表的页可能不在 TLB 中,这将在处理过程中导致其他 TLB 错误 。改善方法是可以在内存中的固定位置维护一个大的 TLB 表项的高速缓存来减少 TLB 失效 。通过首先检查软件的高速缓存,操作系统 能够有效的减少 TLB 失效问题 。
推荐阅读
- 图解Java内存区域
- 分享几款Linux 下C/C++程序内存泄漏检查工具
- 建议收藏 全网最全的SQL语句
- 安卓平板|vivo发布OriginOS HD大屏操作系统:手机、平板、PC无缝协同
- 白茶萎凋,白茶萎凋适度特征
- centos操作系统上实现网卡端口绑定
- 微信太“吃”内存了!教你怎样快速清理微信垃圾,释放手机内存?
- 在常用Linux操作系统中安装VMware Tools
- 聊聊 Linux 的内存统计
- 一加|12GB内存!一加首款天玑8100新机现身GeekBench:或为一加Ace
