Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102470
  • 博文数量: 30
  • 博客积分: 536
  • 博客等级: 中士
  • 技术积分: 224
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-29 09:23
文章分类
文章存档

2012年(16)

2011年(14)

我的朋友

分类: LINUX

2012-01-01 23:53:26

宋劲杉

原文来源——

————————————————————————————————————————————

目录

        虚拟地址和物理地址的概念
    
虚拟内存管理
    
ARM920T的CP15协处理器
    
MMU
     Cache

    
操作MMU和Cache的内核启动代码

    
参考资料 索引

ARM920T的CP15协处理器

    ARM920T的MMU和Cache都集成在CP15协处理器中,MMU和Cache的联系非常密切,本节首先从总体上介绍MMU、Cache和CPU核 是如何协同工作的,后面两节分别讲解MMU和Cache的细节。三星公司的S3C2410是一种很常见的采用ARM920T的芯片,涉及到具体的芯片时我 们以S3C2410为例

   以 下是CP15协处理器的寄存器列表(摘自[S3C2410用户手册]),和CPU核的r0到r15寄存器一样,协处理器寄存器也是用0到15来编号,在指 令中用4个bit来表示寄存器编号,有些协处理器寄存器有影子寄存器,这种情况下对同一个编号的寄存器使用不同的选项读或者写实际上访问的是不同的寄存 器,后文用到某个寄存器时会详细说明它的功能。

表 1. CP15协处理器的寄存器列表

    对CP15协处理器的操作使用mcr和mrc两条协处理器指令,这两条指令的记法是从后往前看:mcr是把r(CPU核寄存器)中的数据传送到c(协处理 器寄存器)中,mrc则是把c(协处理器寄存器)中的数据传送到r(CPU核寄存器)中。对CP15协处理器的所有操作都是通过CPU核寄存器和CP15 寄存器之间交换数据来完成的。下图是协处理器的指令格式(摘自[S3C2410用户手册])。

图 8. 协处理器指令格式

    和其它ARM指令一样,Cond是条件码,bit 20是L位,表示该指令是读还是写,如果L=1就表示Load,从外面读到CPU核中,也就是mrc指令,如果L=0就表示Store,也就是mcr指 令。[11:8]这四个位是协处理器编号,CP15的编号是15,因此是4个1。CRn是CP15寄存器编号,Rd是CPU核寄存器编号,各占4个位。对 于CP15协处理器,规定opcode1应该为0,opcode2和CRm是指令的选项,具体含义取决于不同的寄存器。

    虽然这里介绍了协处理器的寄存器编号和相关指令,但读者只需了解对协处理器是这样进行操作的就可以了,我们的重点是讲解MMU和Cache的基本概念,具体各种操作的指令该怎么写可以参考[S3C2410用户手册]。

   MMU是如何把VA映射成PA的呢?从图 4 “进程地址空间是独立的”来看,好像是有一张VA转PA的表,给一个VA查表就可以查到PA,实际上并不是这么简单,通常要有一个多级的查表过程,对于 ARM体系结构是两级查表,对于一些64位体系结构则需要更多级。看下面的图示。

图 9. Translation Table Walk

    首先将32位的VA[3]分成三段,前两段[31:20]和[19:12]作为两次查表的索引,第三段[11:0]作为页内的偏移。查表的步骤如下:

    1 CP15协处理器的TTB寄存器(看看表 1 “CP15协处理器的寄存器列表”中这是第几个寄存器?)中保存着第一级页表(Translation Table)的基地址,这个基地址指的是PA,也就是说页表是直接按这个地址存在物理内存中的。

    2 以TTB中的内容为基地址,以VA[31:20]为索引在表中查出一项(想一下这个表中一共有多少项?),这个表项中保存着第二级页表(Coarse Page Table)的基地址,同样是物理地址,也就是说第二级页表也是直接按这个地址存在物理内存中的。

    3 以VA[19:12]为索引在第二级页表中查出一项(想一下这个表中一共有多少项?),这个表项中就保存着物理页面的基地址,先前我们说虚拟内存管理是以 页为单位的,一个虚拟内存的页映射到一个物理内存的页框,从这里就可以得到印证,因为查表是以页为单位来查的。

    4 有了物理页面的基地址之后,加上VA[11:0]这个偏移量就可以取出相应地址上的数据(想一下一个页是多少字节?)。

   这个过程称为Translation Table Walk,Walk这个词用得非常形象。从TTB走到一级页表,又走到二级页表,又走到物理页面,一次寻址其实是三次访问物理内存。注意这个“走”的过程 完全是硬件做的,每次CPU寻址时MMU就自动完成以上四步,不需要编写指令指示MMU去做,前提是操作系统要维护页表项的正确性,每次分配内存时填写相 应的页表项,每次释放内存时清除相应的页表项,在必要的时候分配或释放整个页表。

    有了以上基本概念,我们来看CPU访问内存时的硬件操作顺序(摘自[ARM参考手册])。

图 10. CPU访问内存时的硬件操作顺序

    我们以CPU读内存为例解释一下图中的步骤,各步骤在图中有对应的标号。

    1 CPU核(图中的“ARM”框)发出VA请求读数据,TLB(Translation Lookaside Buffer)接收到该地址。TLB是MMU中的一块高速缓存(也是一种Cache),它缓存最近查找过的VA对应的页表项,如果TLB里缓存了当前VA 的页表项就不必做Translation Table Walk了,否则去物理内存中读出页表项保存在TLB中,TLB缓存可以减少访问物理内存的次数。

   2 页表项中不仅保存着物理页面的基地址,还保存着权限位和是否允许Cache的标志。MMU首先检查权限位,如果没有访问权限,就引发一个异常给CPU核。 然后检查是否允许Cache,如果允许Cache就启用Cache和CPU核互操作,图中的“C, B bits”可以理解为选通线,后面再详细解释这两个位的作用。

   3 如果不允许Cache,则直接发出PA从物理内存中读取数据到CPU核。

    4 如果允许Cache,则以VA为索引到Cache中查找是否缓存了要读取的数据,如果Cache中已经缓存了该数据(称为Cache Hit)则直接返回给CPU核,如果Cache中没有缓存该数据(称为Cache Miss),则发出PA从物理内存中读取数据并缓存到Cache中,同时返回给CPU核。然而Cache并不是只取CPU核所要的数据,而是把相邻的数据 都取上来缓存,这称为一个Cache Line。ARM920T的Cache Line是32字节,例如CPU核要读取地址0x134-0x137的4字节数据,Cache会把地址0x120-0x13f(对齐到32字节地址边界) 的32字节都取上来缓存。

    MMU

    我们已经简单了解了一下查页表的过程,实际上ARM920T支持多种尺寸规格的页表,图 9 “Translation Table Walk”所示的只是其中一种情况。下图示意了所有可能的情况(本节的图表均摘自[S3C2410用户手册])。

图 11. 查页表的过程

    回顾一下查表的过程,首先从CP15的TTB寄存器找到一级页表的基地址,再把VA[31:20]作为索引从表中找出一项,这个表项称为一级页描述符(Level 1 Descriptor),一个这样的表项占4个字节,可以是以下四种格式之一:

图 12. 一级页描述符

   如果描述符的最低两位是00,属于Fault格式,表示该范围的VA没有映射到PA。如果描述符的最低两位是10,属于Section格式,这种格式没有 二级页表而是直接映射到物理页面,一个Section是1M的大页面,描述符中[31:20]位就是这个页面的基地址,基地址的[19:0]低位全为0, 对齐到1M地址边界,描述符中的Domain和AP位控制访问权限,C、B两位控制缓存,后面再详细解释每个位的含义。如果描述符的最低两位是01或 11,则分别对应两种不同规格的二级页表。根据地址对齐的规律想一下,这两种页表分别是多大?从一级描述符中取出二级页表的基地址,再把VA的一部分作为 索引去查二级描述符(Level 2 Descriptor)(如果是Coarse Page Table则VA[19:12]是索引,如果是Fine Page Table则VA[19:10]是索引),二级描述符可以是以下四种格式之一:

图 13. 二级页描述符

    描述符最低两位是00属于Fault格式,其它三种情况分别对应三种不同规格的物理页面。Large Page和Small Page有四组AP权限位,每组两个bit,这样可以为每1/4个物理页面分别设置不同的权限,也就是说,Large Page可以为每16K设置不同的权限,Small Page可以为每1K设置不同的权限。

    ARM920T提供了多种页表和页面规格,但操作系统只采用其中一种,Linux采用的就是图 9 “Translation Table Walk”所示的规格,一级描述符是Coarse Page Table格式,二级描述符是Small Page格式,每个物理页面4K。我们以此为例,结合前面的的解释和页描述符的格式,再看一下Translation Table Walk的详细过程:

图 14. Translation Table Walk的详细过程

    从上到下依次解释如下:

    1 VA被划分为三段用于地址映射过程,各段的长度取决于页描述符的格式。

    2 TTB寄存器中只有[31:14]位有效,低14位全为0,因此一级页表的基地址对齐到16K地址边界,而一级页表的大小也是16K。

    3 一级页表的基地址加上VA[31:20]左移两位组装成一个物理地址。想一想为什么VA[31:20]要左移两位占据[13:2]的位置,而空出[1:0]两位呢?

   4 用这个组装的物理地址从物理内存中读取一级页描述符,这是一个Coarse Page Table格式的描述符。

   5 通过Domain权限检查后,Coarse Page Table的基地址再加上VA[19:12]左移两位组装成一个物理地址。

   6 用这个组装的物理地址从物理内存中读取二级页描述符,这是一个Small Page格式的描述符。

   7 通过AP权限检查后,Small Page的基地址再加上VA[11:0]就是最终的物理地址。想一想为什么这次不左移两位了呢?

   下面解释一下Domain和AP位。CP15的Domain访问控制寄存器(见表 1 “CP15协处理器的寄存器列表”寄存器3)表示了16个Domain,每两位表示一个Domain的访问权限,以下是该寄存器的格式:

   图 15. Domain Access Control Register

   每个Domain的两个位可以取值为00、01、10或11,如果取值为00或10则表示该Domain不可访问,如果取值为01则表示访问该 Domain需要进一步检查AP位,如果取值为11则表示可以直接访问该Domain而无需检查AP位。回想一下,一级页描述符中的Domain字段由4 个位组成,可以有16个不同的取值,就表示该描述符所描述的二级页表或Section属于这16个Domain中的哪一个。快速上下文切换、Domain 和多种规格的页表是ARM特有的机制,是针对嵌入式系统软件的特点而设计的,其它处理器不一定有类似的机制,例如也许没有Domain和快速上下文切换的 概念,也许只有一种规格的页表。为了能够在多种不同的平台上移植,Linux内核代码不会利用ARM特有的这些机制。除了这些特例之外,我们在这里介绍的 其它机制都具有普遍性,读者应重点把握具有普遍意义的基本原理和基本概念。

   CP15的控制寄存器(见表 1 “CP15协处理器的寄存器列表”寄存器1)中的S和R位与页描述符的AP位合在一起决定访问权限,如下所示:

图 16. AP权限检查

    可见,同样的AP、S、R位对用户模式和特权模式来说具有不同的意义,特权模式的权限都不低于用户模式的权限。最后将各种由内存访问产生的异常总结如下:

    Alignment Fault——以Word为单位的数据访问指令地址未对齐到4字节边界,或者以Half Word为单位的数据访问指令地址未对齐到2字节边界。

    Translation Fault——页描述符的[1:0]为00,属于Fault格式,无效表项。

    Domain Fault——一级页描述符或Section所属Domain的权限位为00或10。

   Permission Fault——根据AP位和CP15寄存器1的S、R位检查访问权限,若所属Domain的权限位为11则跳过这一步检查。

    External Abort——总线异常,例如此物理地址上没有挂RAM芯片,或者其它硬件故障。

阅读(1010) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~