Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830589
  • 博文数量: 85
  • 博客积分: 10016
  • 博客等级: 上将
  • 技术积分: 952
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-19 22:52
文章分类

全部博文(85)

文章存档

2011年(1)

2008年(1)

2007年(60)

2006年(23)

我的朋友

分类:

2007-10-20 16:40:02

[旧blog文章搬移]
    为方便以后查阅和学习以及留有备案,特翻译了《ARM Architecture Reference ManualSencond Edition》中的Memory Management Unit部分,供参考和交流。
    [译者]黄振华
    [声明]本翻译仅供参考和交流,不得用于任何商业用途。由于本人水平有限,其中的理解和表达错误在所难免,欢迎指正。如需转载请注明作者和出处。

 

3.3 翻译过程

       MMU支持基于段(section)或页(page)的内存访问方式:

       段(Section                    由大小为1MB的内存块组成。

       支持三种不同大小的页面:

       微页(Tiny pages           由大小为1KB的内存块组成。

       小页(Small pages         由大小为4KB的内存块组成。

       大页(Large pages         由大小为64KB的内存块组成。

       对段(Sections)和大页(large pages)的支持使得在TLB中仅使用单一的一个条目(entry)时可以映射一大块内存区域。额外的访问控制机制是通过在小页(small pages)中划分1KB的子页(subpages)以及在大页中划分16KB的子页来扩展实现的。对于微页(tiny pages)则没有类似的子页,因此对微页的访问控制则应用到整个页面。

 

       主存中的翻译表有两个级别:

       第一级表      存放段翻译表和指向第二级表的指针。

       第二级表      存放大页和小页的翻译表。还有一种二级表可以存放微页翻译表。

      

       MMUCPU发出的虚拟地址翻译为物理地址以访问外部存储器,并获取和检查访问权限。地址翻译(还有权限检查)有四条路径。翻译的路径取决于请求的地址是标记为段映射访问方式还是页面映射访问方式。页面映射访问又可分为大页、小页和微页访问。

       不过,如下描述,翻译过程总以相同的方式从第一级表的获取开始。段映射访问仅需要第一级获取,而页面映射的访问还需要第二级表的获取。

 

3.3.1 翻译表基址

       当片上TLBon-chip TLB)不包含所请求的虚拟地址的入口(entry)时,就启动翻译过程。翻译表基址寄存器(Translation Table Base RegisterCP15的寄存器2)保存了第一级表的基址的物理地址。只有翻译表基址寄存器中的bits[31:14]是有意义的,而bits[13:0]应为0。因此,第一级页面表必须驻留在16KB边界上。

 

3.3.2 取第一级表

       翻译表基址寄存器的bits[31:14]与虚拟地址的bits[31:20]连接起来再加上20码以产生一个32位的物理地址,如图3-2所示。这个地址选择了一个4字节的翻译表入口(entry)作为第一级的描述符,用于描述某个段或者一个指向第二级页面表的指针。

3-2 访问翻译表的一级描述符(得到其地址)

 

 

3.3.3 第一级描述符

       第一级表的各个entry是关于与其相关的1MB的虚拟地址范围是如何映射的一个描述符。有如下一些可能的情况,可根据描述符的bits[1:0]来选择,如表3-1所示:

l         如果bits[1:0]==0b00,则相关的虚拟地址没有被映射到物理地址,并且若试图对它们进行访问时会产生翻译错误(见AbortsB3-18)。在这样的描述符中,软件可将bits[31:2]用于其自身的目的,因为这些位是被硬件忽略的。在正式场合,还是建议bits[31:2]为描述符继续保存有效的访问权限。

l         如果bits[1:0]==0b10,此时entry是对其相关虚拟地址的一个段描述符。详细说明见Section descriptor and translating section referencesB3-8

l         如果bit[0]==1,此时entry给出一个粗糙的二级表(bit[1]==0时)或一个精细的二级表(bit[1]==1时)的物理地址。各类表都指定了相关的1MB的虚拟地址范围的映射方式。粗糙表(coarse table)以较小的每张表1KB的规格指定(相对于精细表每张表4KB而言)。不过,粗糙表只能映射大页(large pages)和小页(small pages),而精细表(fine table)可以映射大页、小页和微页。两类表的描述见Coarse page table descriptorB3-9Fine page table descriptorB3-10

 

 

3.3.4 段描述符和段翻译参考

       如果第一级描述符是一个段描述符,则各位区的含义如下:

       Bits[1:0]        确定描述符类型(0b10标记为一个段描述符)。

       Bits[3:2]        高速缓存和缓冲位(见Cachability and bufferabilityB5-8)。

       Bit[4]            该位代表不同的ARM实现的定义(IMPLEMENTATION DEFINED)。

       Bits[8:5]        域指示区,指定描述符控制的段中的16个可能的域中的一个。

       Bit[9]            该位目前不使用,应该为0

       Bits[11:10]     访问权限。这两位控制对段的访问。见B3-16的表3-3对其的描述。

       Bits[19:12]    这些位目前不使用,应该为0

       Bits[31:20]    段基地址(Section Base Address),构成物理地址的高12位。

       3-3说明了完整的段翻译的顺序。

 

       ——Note——

       在形成物理地址之前必须对第一级描述符中的访问权限进行检查。检查访问权限的次序可见Access permissionsB3-16

       ——————

 

 

3.3.5 粗糙页表描述符

       如果第一级描述符是一个粗糙页表描述符,则各位区的含义如下:

       Bits[1:0]        确定描述符类型(0b01标记为一个粗糙页表描述符)。

    Bits[4:2]        这两位依据ARM的具体实现而定义(IMPLEMENTATION DEFINED)。

Bits[8:5]        域指示区,指定描述符控制的所有页所指存储空间的16个可能的域中的一个。

Bit[9]            该位目前不使用,应该为0

Bits[31:10]    页表基地址,是一个指向粗糙二级页表的指针,为二级获取提供了待处理的基地址。粗糙二级页表必须在1KB的边界对齐。

 

如果从第一级获取返回了一个粗糙页表描述符,则启动第二级获取,以得到一个二级描述符,如图3-4所示。

 

 

3.3.6 精细页表描述符

       如果第一级描述符是一个精细页表描述符,则各位区的含义如下:

       Bits[1:0]        确定描述符类型(0b11标记为一个精细页表描述符)。

       Bits[4:2]        这两位依据ARM的具体实现而定义(IMPLEMENTATION DEFINED)。

       Bits[8:5]        域指示区,指定描述符控制的所有页中的16个可能的域中的一个。

       Bits[11:9]      这些位目前不使用,应该为0

       Bits[31:12]    页表基地址,是一个指向精细二级页表的指针,为二级获取提供了待处理的基地址。精细二级页表必须在4KB的边界对齐。

      

       如果从第一级获取返回了一个精细页表指针,则启动第二级获取,以得到一个二级描述符,如图3-5所示。

 

 

3.3.7 二级描述符

       在一个粗糙二级表中每个entry都对应于一个4KB的虚拟地址范围的映射方式,而在一个精细二级表中的每个entry都对应于一个1KB的虚拟地址范围的映射关系。这些入口(entries)就是页描述符,它对大于4KB1KB的页面分别进行描述。这时,不管被访问的是页内的哪一个虚拟地址,该描述符必须在二级表中重复足够多次,以保证同一描述符总是用于同一页面。

       对于一个二级描述符,有四种可能性,由该描述符的bits[1:0]来选择,如表3-2

l         如果bits[1:0]==0b00,则相关的虚拟地址不作映射,并且若试图对它们进行访问时会产生翻译错误(见AbortsB3-18)。在这样的描述符中,软件可将bits[31:2]用于其自身的目的,因为这些位是被硬件忽略的。在正式场合,还是建议bits[31:2]为描述符继续保存有效的访问权限。

l         如果bits[1:0]==0b01,则该entry是一个大页(large page)描述符,描述64KB的虚拟地址。详见Translating large page referencesB3-13

一个大页描述符必须在一个精细二级表中重复64次或者在一个粗糙二级表中重复16次以保证其对与其相关的所有的虚拟地址都描述到。

l         如果bits[1:0]==0b10,则该entry是一个小页(small page)描述符,描述4KB的虚拟地址。详见Translating small page referencesB3-14

一个小页描述符必须在一个精细二级表中重复4次以保证其对与其相关的所有的虚拟地址都描述到。在粗糙二级表中,只有一种情况需要各个小页描述符。

l         如果bits[1:0]=0b11,则表中的entry是一个微页描述符,描述1KB的虚拟地址。详见Translating tiny page referencesB3-15

在精细二级表中只有一种情况需要各微页描述符。微页描述符不可出现在粗糙二级表中。如果出现了,则结果是不可预料的(UNPREDICTABLE)。

 

3-2 二级描述符的可能的格式

31                               16 15    12 11 10 9  8  7  6 5  4  3  2  1 0

无效

 

0 0

大页

大页页表基地址

0

AP3

AP2

AP1

AP0

C

B

0 1

小页

小页页表基地址

AP3

AP2

AP1

AP0

C

B

1 0

微页

微页页表基地址

0

AP0

C

B

1 1

 

各种描述符格式的各位域的含义如下:

①大页描述符位域

Bits[1:0]        确定描述符类型。

Bits[3:2]        高速缓存和缓冲位(见Cachability and bufferability,B5-8)。

Bits[11:4]      访问权限位,控制对页面的访问权。详细说明见表3-3B3-16。大页分为四个子页:

                      AP0        第一子页的访问权限码;

 AP1        第二子页的访问权限码;

                     AP2        第三子页的访问权限码;

                     AP3        第四(最后)子页的访问权限码。

Bits[15:12]    目前不使用,必须为0

Bits[31:16]    用于构成物理地址的相关位。

 

②小页描述符位域

Bits[1:0]        确定描述符类型。

Bits[3:2]        高速缓存和缓冲位(见Cachability and bufferability,B5-8)。

Bits[11:4]      访问权限位,控制对页面的访问权。详细说明见表3-3B3-16。小页分为四个子页:

                      AP0        第一子页的访问权限码;

 AP1        第二子页的访问权限码;

                     AP2        第三子页的访问权限码;

                     AP3        第四(最后)子页的访问权限码。

Bits[31:12]    用于构成物理地址的相关位。

 

③微页描述符位域

Bits[1:0]        确定描述符类型。

Bits[3:2]        高速缓存和缓冲位(见Cachability and bufferability,B5-8)。

Bits[5:4]        访问权限位,控制对整个页面的访问权。详细说明见表3-3B3-16

Bits[9:6]        目前不使用,必须为0

Bits[31:10]    用于构成物理地址的相关位。

 

 [您的文章太长,超过了系统限制,如果文章太长,请使用专辑连载的方式!]


[参考资料]

[1]ARM Architecture Reference ManualSencond Editionby David Seal and Addison Wesley. Download this manual

[2]

[3]

[4]ARM体系结构与编程,杜春雷,清华大学出版社,20032

 

 

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