See Mips Run 之 MMU
来源:互联网 发布:交换机端口重启命令 编辑:程序博客网 时间:2024/05/17 17:59
MIPS使用TLB实现MMU功能,TLB的作用是将程序地址(虚拟地址)转换为物理地址。转换的好处主要在于:
- 虚拟内存,实现虚拟内存连续,物理内存不连续。虚拟内存可以大于可用物理内存。
- 内存保护,对指定的内存设置只读标志。这样就能保护程序中的.text段等,提高安全性。
TLB结构
TLB实际是一个内容索引存储器,速度和Cache相当。可以将TLB想象为一个结构体数组,数组大小一般为16/32/64。每行容纳一对相邻的虚拟页面对应的两个单独的物理地址。每行的结构如下:
VPN2:虚拟页号,虚拟地址的bit31-bit13,bit12-bit0属于页内地址。
ASID:地址空间标示符,页表中保存的是操作系统当前地址空间的标识。
PageMask:页掩码,可以用来映射更大的页。
G:全局标志位,设置时不需要理会ASID。
PFN:物理页号
Flags V D C:物理页标志,是否有效?是否脏?是否被缓存
读写TLB中数据需要用到的寄存器:
Index:用于读写时定位一行具体的TLB表项,语义和数组的索引一致。
Random:保存一个TLB表项时,随机将新TLB进行替换
Wired:使用它可以将TLB表中一些行永久存在表中不被替换。
EntryHi:用于读写VPN2/ASID
EntryLo0/EntryLo1:用于读写PFn/V/D/C
TLB操作命令:
tlbr:读取index指定的TLB行 EntryHi/EntryLo0/EntryLo1 <---- TLB[index]
tlbwi:写index指定的TLB行 EntryHi/EntryLo0/EntryLo1 ----->TLB[index]
tlbwr: 写Random指定的TLB行 EntryHi/EntryLo0/EntryL1/PageMask -> TLB[random]
tlbp: 查找TLB行 根据EntryHi得到index (这条命令只是更新index,若要得到数据还需要使用tlbr)
页表
TLB一般只有16-64行,因此最多只能查询到64*4K大小的虚拟地址/物理地址转换。而对于32位MIPS来说,虚拟地址空间远远超过这个范围。因此操作系统会在内存中为每个地址空间构建一个页表。
页表可以看作是用VPN做索引的线性数组,每行的格式和EntryLo寄存器匹配。每行大小为2X64位(兼容64位)
为了节省内存和方便切换上下文,页表被映射到kseg2地址空间。这个地址空间也是mapped。所以对于页表中间未用的空隙,实际上不需要分配物理地址。
页表和TLB的关系就像内存和Cache一样,当CPU遇到一个虚拟地址,会将虚拟地址所在的虚拟页号和当前地址空间ID组合,并在TLB中进行查询。查询的结果可能是:
命中:输出EntryLo0/EntryLo1得到物理页地址,并根据虚拟页内地址定位物理页内地址。
不命中:系统为未命中提供了一个异常处理入口,注意硬件会自动复制EntryHi。处理程序会访问页表,并将页表中对应行的数据替换到TLB中。这中间涉及到异常嵌套的问题,因为分配的页表也是在映射空间中,因此,读取页表也会触发TLB填充异常。对于TLB嵌套异常需要特殊处理。为了加快页表访问和定位速度,MIPS提供了Context寄存器。
Context寄存器和BadVaddr寄存器
在TLB未命中情况下,硬件会自动对Context寄存器和BadVAddr寄存器进行赋值。
其中BadVAddr存储的是发生TLB异常的虚拟地址
Context(BadVPN2)存储的是BadVAddr的高位。
结合Context(PTEBase),Context能够很快定位到页表中的一行,从而快速重填TLB。
- See Mips Run 之 MMU
- See MIPS Run 之 Cache
- See Mips run 之 浮点支持
- 《See MIPS Run》读书笔记
- See MIPS Run, Second Edition
- 《See MIPS Run Linux》 读书笔记
- see mips run 读书笔记(待写)
- SEE MIPS RUN-第四章 Cache for MIPS SC
- MIPS CPU地址空间——摘自SEE MIPS RUN
- SEE MIPS RUN 第六章 内存管理与TLB
- MIPS架构培训之MMU原理
- MIPS mmu 设置
- MIPS MMU和 Memory Management
- MIPS TLB / MMU 硬件及其作用
- mips结构的tlb(MMU)分析
- mips代码段机制保护实现--运用MMU
- mini2440裸机之MMU(二)(mmu…
- mini2440裸机之MMU(一)(mmu.…
- Linux信号详解
- Server Error in '/' Application. erro:40
- IIS上部署项目浏览项目时出现cs0016 未能写入输出文件 拒绝访问 的解决办法
- Leetcode214-Shortest Palindrome
- GUI
- See Mips Run 之 MMU
- GOF23之桥接模式Demo
- Android 进程与线程
- Spark Task未序列化(Task not serializable)问题分析及解决
- USB端口的打印机映射成LPT并口
- 打开服务器上的 IncludeExceptionDetailInFaults (从 ServiceBehaviorAttribute 或从 <serviceDebug> 配置行为)以便将异常信息发送回
- archlinux下emacs中文乱码问题的解决及中文输入模块的添加
- Struts2学习笔记(十六)异步传输机制Json插件
- android(9) ListView + ScrollView + ViewPager布局