在讨论SH4的MMU之前,如果之前对操作系统,内存管理,虚拟地址,分页机制等不太清楚,可以查阅本人转发的《MMU简介》。
MMU是现代操作系统(Windows,Linux,Mac等)的基础,CPU离开了MMU的支持,就不能运行现代意义上的操作系统。
在了解MMU的原理之前,需要先明白一下概念。
1. TLB(translation lookaside buffer) 转换遍历缓存。
TLB是MMU的核心部件,它存储少量的虚拟地址与物理地址的转换关系,它其实是物理内存区的一小段内存。
2. 地址转换表。
当TLB中没有缓冲对应的地址转换关系时,需要查找这个地址转换表,找到虚拟地址与物理地址的对应关系。在大多数处理器中,这个转换表为多级页表,比如386里面的页目录表和页表。
下图很形象的说明了MMU在计算机中的作用。
CPU访问存储器时,首先查找TLB,如果TLB中没有虚拟地址的入口,则查找转换表,同时将找到的地址对应关系存入TLB。之后,在TLB中控制信息的控制下,当访问权限允许时,再去查找cache,如果cache中没有对应的物理地址,则去内存中查找。
流程如下:
下面我们以SH4系列的SH7750为例。
SH7750属于哈佛结构RISC,它有2种处理器模式:特权模式和用户模式。
它的cache分为指令缓存和数据缓存。同样,它的TLB也分为ITLB(指令TLB)和UTLB(数据TLB)。
一,SH7750的MMU寄存器。
SH7750的MMU有6个寄存器:
PTEH (page table entry high register)
PTEL (page table entry low register)
PTEA (page table entry assistance register)
TTB (translation table base register)
TEA (TLB exception address register)
MMUCR (MMU control register)
其中,PTEH和PTEL,PTEA为页表入口高和低寄存器,页表入口助手寄存器,当MMU异常或地址错误时,这2个寄存器的某些位被置位。
TTB存储的是地址转换表(页表)的入口地址。MMU查找页表时,就是通过这个寄存器到内存中去查找相关信息。
TEA存储的是引起MMU异常的虚拟地址,例如产生一个TLB缺页异常中断后,引起这个异常的虚拟地址被保存到TEA中。在这个异常中断程序中,程序会根据TEA的内容,在页表里查找相关的信息,然后更新TLB。执行中断返回指令时,跳转到这个地址继续执行原来被中断了的代码,这个时候就不会再发生TLB缺页异常了。
MMUCR实现开启/关闭MMU等功能。
二,SH7750的物理地址空间(关闭MMU时的内存分布)
SH7750支持32位物理地址空间,能访问4G的地址空间。当MMUCR.AT位为0的时候,MMU禁止,此时地址空间就是物理地址空间。物理地址空间被分成几个区域,如图所示。
物理地址空间被映射到由29位地址线组成的外部地址空间里。在特权模式,从P0到P4的4G地址空间都能被访问,而在用户模式下,只能访问U0的2G空间。如果在用户模式下要访问P1到P4(除了store queue area之外),则会发生地址错误。
外部地址空间(CS0 ~ CS7)的地址范围为0~0x1fffffff,总共为512MB。如图所示。
当P1(0x80000000~0xa0000000)映射到外部地址空间时,访问P1实际上就是访问(CS0 ~ CS7)空间。以此类推,P2也被映射到(CS0 ~ CS7),因为P2属于cache禁止的区域,如果你的某个函数不想被Cache命中,可以将此函数重定位到P2里。
由于SH7750的寄存器位于P4里(0xe0000000~0xffffffff),而在用户模式下是无法访问P4的,这时我们只能使CPU进入异常状态(例如执行陷阱指令),才能进入特权模式去访问CPU的相关寄存器。
三,SH7750的虚拟地址空间(开启MMU时的内存分布)
当MMUCR.AT = 1时,MMU功能开启,此时CPU发出的都是虚拟地址,需要经过MMU转换,才能找到实际的物理地址。
MMU使能后,P0,P3和U0能被映射到任何一个外部地址空间(CS0 ~ CS7),其中页的大小可以为1,4,64KB或者1MB。通过使用一个8位的地址空间标号,P0,P3,U0和store queue areas能被扩展到最大256倍,这称为虚拟内存空间。如图所示。
从虚拟地址空间到(CS0 ~ CS7)空间的映射是通过TLB完成的。
四,SH7750的地址转换
当MMU被使用时,虚拟地址空间被分成很多页,地址转换是以这些页为单位进行的。地址转换表里包含了物理地址和虚拟地址的映射关系,以及其他的信息例如保护代码等。快速地址转换是通过TLB实现的。
在SH7750里,基本上,ITLB用于指令访问,UTLB用于数据访问。如果虚拟地址位于P1和P2区域,则不需要访问TLB而唯一地确定物理地址;如果虚拟地址在P0,U0或者P3区域,则要查找TLB,如果TLB里没有,一个TLB miss异常产生,在TLB miss异常中断程序里去查找地址转换表,找到之后将信息刷回TLB。从TLB miss异常中断返回后,引起TLB异常中断的指令被重新执行,就好像没有发生异常一样。
后记:
SH7750的MMU还有其他功能,这里就不说了。
我们看到,当开启MMU后,实际上只有特权模式下的P0,P3区域或者用户模式下的U0区域才具备地址转换功能。
在特权模式能够映射的空间大小为P0(0~0x8000000)+P3(0xc0000000~0xe0000000) = 2.5GB
在用户模式能够映射的空间大小为U0(0~0x8000000) = 2GB
---------------------------
---------------------------
以下内容由快乐水牛追加:
更正一下,本文有些错误的地方,我之前看datasheet没有看清楚,后来仔细看了下,也参考了linux下的源码,发现开启MMU后,不仅仅是P0,P3具备地址转换功能,P1和P2也一样需要地址转换。
这2个区域的地址转换机制有点不同,
P0,P3的地址转换时需要查找TLB,如果在TLB里找不到,就产生异常,然后查找页表,找到对应的物理地址,同时写回到TLB里。
P1,P2的地址转换不需要查找TLB,直接去掉虚拟地址的最高3位就得到物理地址,算法如下:
phy_addr = vir_addr & 0x1fffffff;
顺便说下TLB与Cache的区别:
TLB是针对虚拟地址的,存储的是物理地址与虚拟地址的映射关系
cache是针对物理地址的,存储的是物理地址对应的内容
文章评论(0条评论)
登录后参与讨论