7.1.1 S3c2410 MMU特性介绍,
MMU:负责虚拟地址到物理地址映射,提供硬件机制的内存访问权限检查。
地址映射使各进程看起来拥有一致的独立地址空间
内存访问检查保护每个进程的内存不被其他进程损坏
2410特性:
与ARM v4兼容的映射长度,域,访问权限检查机制
4种映射长度:段1MB,大页64kB,小页4KB,极小页1kB
每段可以设置访问权限
大页、小页的子页(sub-page,被映射页的1/4)都可以单独设置访问权限
硬件实现的16个域
指令TLB(64个条目)、数据TLB(64个条目)
硬件访问页表(地址映射、权限检查由硬件自动运行)
TLB中条目的替换采用round-robin算法(cyclic算法)
可以使无效整个TLB
可单独invalidate某个TLB条目
可在TLB中锁定某个条目,指令TLB、数据TLB互相独立、
重点讲地址映射,页表的结构与建立、映射过程。对于TLB粗略讲。
7.1.2 S3C2410 MMU地址变化过程
1,地址分类
以前内存的问题:程序大小超过内存容量;需要多个程序同时执行,无法全部装入内存。
实际:程序只将当前运行需要的部分装入内存,其余用到时再从磁盘调入,内存耗光时将暂时不用的调出。称为虚拟存储器。
VA从逻辑上扩大了memory容量,32blt CPU的VA是0~0XFFFF FFFF,这个范围称为VA space,其中的某个地址称为VA。
VA需要转换为PA才可以实际的读写数据,方法是:VA,PA space划分成同样大小的段/页,再映射。
由于VAs远大于PAs,可能会多个VA对应同一个PA,或者有些VA没有对应的PA,
ARM CPU地址转换涉及3个概念:VA,MVA(modified),PA,
没启动MMU时,CPU、cache、MMU、外设等使用PA
启动MMU后,CPU核对外发出VA,VA转换为MVA供cache、MMU使用,这里MVA转换为PA,
最后使用PA读写实际设备(2410寄存器或者外设)
1,CPU核看到的都只是VA,VA如何转PA它不管
2,caches和MMU也看不见VA,他们利用MVA转换得到PA
3,实际设备不知道VA,他们使用PA
MVA是除CPU外其他部分看见的VA,
VA与MVA的转换利用了PID,以减少切换进程时的代价
MVA = VA | (PID << 25) //当VA<32M
若不使用MVA而直接用VA,那两个进程的VA有重叠时,就要把重叠VA映射到PA,要重建页表,invalidate cached/TLBs等,代价非常大。
这样MVA就不重叠了,以后说的VA,都指VA。
2,VA到PA的转换过程
2个方法:
用确定的数学公式转换,
用表格存储VA对应的PA
这类表格叫page table, page table页表由一个个entry条目组成,
每个entry存储了一段VA对应的PA和其访问权限,或下一级page table的addr。
ARM CPU使用第二种方法,2410最多用两级页表,
Section 1M的方式转换时用到一级页表,Page 转换时用到二级页表
page有3种大小:大页64KB,小页4KB,极小页1KB。
entry也称为Decriptor描述符,有:section descriptor,page descriptor,保存segment/page的PA,
粗页表/细页表 descriptor,他们保存二级页表的PA
过程:
根据VA找到一级page 的entry,
若这个entry是section descriptor,返回PA,结束
否则若entry是二级page descriptor,继续利用VA在此二级page找下一个entry,
若2nd entry是page descriptor,返回PA,结束
只有一级页表的地址变换流程:
----------------------------------------------------------------------------------------------------
一级页表索引 段内地址
VA p1 p2
| |
TTBBase ------------ + -> p1段基址 ------------ + -> p2(段基址+p2) 物理地址
页表基址寄存器 一级页表 物理段
----------------------------------------------------------------------------------------------------
具有两级页表的地址变换流程:
----------------------------------------------------------------------------------------------------
一级页表索引 二级页表索引 页内地址
VA p1 p2 p3
| | |
TTBBase -------- + ->p1二级页表基址 ----- + ->p2页基址 -------- + -> p3 (页基址+p3) 物理地址
一级页表 二级页表 物理页
----------------------------------------------------------------------------------------------------
TTB base是一级页表的地址,一级页表的地址必须是16K对齐的,低14位为0
----------------------------------------------------------------------------------------------------
31 14 13 0
Translation table base
----------------------------------------------------------------------------------------------------
2410地址转换图
----------------------------------------------------------------------------------------------------
一级转换 二级转换
页表 粗细页表(段/细) 小页(大/极小)
TTB基址------ 页基址--------- 小页基址----------
用MVA[21:20]索引 -> 用MVA[19:12]索引-> 用MVA[10:0]索引
共4096个entry 64kB/4kB/1kB
------------------------------------------------------------------------------------------------------------------
32bit的CPU的VA有4GB,0xFFFF FFFF
一级页表有4096(0xFFF)个entry ,来描述4GB的空间。
所以每个entry对应1MB的VA,存储了对应的1MB的PA地址,或者下一页页表的地址。
每个entry/descriptor占4字节,4Bx4096 = 0x4000,
7.1.4 TLB的作用
Translation lookaside buffers
VA转PA:使用两级页表时,每次r/w数据要访问3次内存,前两次访问一/二级页表获得PA,第三次才真正读写数据。
地址转换过程降低了CPU性能
程序执行时,用到的指令、数据通常集中在很小范围,称为程序访问的局部性。
所以,可以使用一个高速、容量小的存储器存储近期用到的entry(段/页描述符),以避免每次地址转换都要从主存查找。大幅提高性能。这个存储器称为TLB转义查找缓存,translation lookaside buffers,
当CPU发出一个VA,MMU先访问TLB。若TLB有能转换这个VA的description,则直接利用此description进行地址转换和权限检查。
否则MMU访问页表找到description后在进行地址转换和权限检查,并将它填入TLB,
若TLB满,则利用round-robin算法,覆盖一个entry。
使用TLB需要保证TLB内容与页表一致,
启动MMU前、或者页表的内容发生变化后,都要注意这点。
2410可以invalidate整个TLB,也可以通过某个VA去invalidate TLB的某个entry,
一般的做法:
启动MMU之前invalidate整个TLB,
改变页表时,invalidate相关的VA对应的TLB中的entry,
7.1.5 Cache
同样基于程序访问的局部性,主存和CPU通用寄存器之间设置一个高速的,容量相对小的存储器,
把正在执行的指令地址附近的部分指令或者数据从主存调入这个存储器,供CPU在一段时间用,这个存储器称为cache
启用Cache后,CPU读数据时,若Cache中有数据的复本则直接返回,
否则从主存读数据,并存入cache,下次再r/w这个数据时直接用cache的复本。
启动cache后,CPU写数据有两种方式:写穿式,回写式
1)写穿式,write throught
CPU发出的写信号送到cache同时,也写入主存,以保证主存的数据可以同步更新。
优点是操作简单,但主存慢,降低了系统写速度,占用了总线时间。
2)回写式,write back
为克服写穿式问题,要减少对主存访问次数,有了回写式
工作方式:数据只写到cache,可能出现cache的数据更新但主存的数据陈旧的情况,
可在cache设 地址和数据 陈旧的 标,
只有cache的数据被换出或者强行clean时,才会将更新的数据写入主存相应的单元。以保证cache和主存的数据一致。
cache的两个操作:
1) clean,清空,
把cache或者write buffer中dirty(修改过但未写入内存)的数据写入内存
2)invalidate
使之不能再使用,而且不会将脏的数据写入主存