吕氏春秋8266 发表于 2010-12-11 13:20:12

裸奔程序6(上)-虚拟地址映射功能分析及实现

第五章 虚拟内存及缓冲区管理
在刚开始接触TQ2440并测试TEST程序时,当时就产生了一个疑惑,把程序下载到NAND和SDRAM中,其中断均能正确执行,当时以为,程序有可能采用了动态添加中断向量技术,即在SDRAM中运行时在向量0x18处添加跳转指令的二进制编码。虽然能够实现,但在实际编程时会非常麻烦。
ARM采用了虚拟内存映射技术即MMU,负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查,通过使用CACHE及WRITE BUFFER技术缩小处理器和存储系统的差别,从而提高系统的整体性能。
在系统加电时,将ROM/FLASH映射为地址0,进行一些初始化工作并将程序加载到SDRAM中去,然后启用MMU,将虚拟地址0映射到SDRAM地址(0x30000000),这样当中断产生时读取0x18处的指令时实际读取的是0x30000018处的指令,这样中断就就可以正确执行。
S3c2440内存管理单元有如下特征:
4种映射长度,段1M、大页64k、小页4k,极小页1k
指令TLB(含64个条目)、数据TLB(含64个条目)
硬件访问页表地址映射、权限检查由硬件自动完成

第一节CP15寄存器的功能及读写

ARM的虚拟地址管理主要通过CP15相关寄存器来实现的,CP15包括了16个32位寄存器,编号为0~15,实际上对于某些编号的寄存器可能对应有多个物理寄存器,在指令编码时指定标志位来区分。
CP15寄存器功能
编号      MMU功能
C0      ID编码(只读)
C1      开启/禁止MMU/CACHE/WRITE等功能
C2      地址转换表基地址
C3      域访问控制
C4      保留
C5      内存失效状态
C6      内存失效状态
C7      CACHE及WRITE控制
C8      TLB控制
C9      CACHE锁定
C10      TLB锁定
C11      保留
C12      保留
C13      进程PID
C14      保留
C15      
CP15寄存器的读写
MCR ARM寄存器到协处理器寄存器数据传送
MRC 协处理器寄存器到ARM寄存器数据传送

格式:
MCR/MRC P15,0,<RD>,<CRN>,<CRM>,{,<OPCODE_2>}
其中RD为ARM寄存器
    CRN为协处理器寄存器
    CRM附加的目标寄存器或源操作数寄存器,用于区分一个编号的不同物理寄存器,当指令不需要提供附加信息时,将CRMC0指定为,OPCODE_2指定为0
MCR P15,0,R4,C1,C0,0R4->C1
MRC P15,0,R4,C1,C0,0R4<-C1

C1寄存器位相关功能
M:0禁止|1启用MMU
A:0禁止地址对齐检查|1使能地址对齐检查
C:0禁止数据CACHE|1使能数据CACHE
W:0禁止写缓冲|1使能写缓冲
I:0禁止代码CACHE|1使能代码CACHE


第二节 地址转换过程

MMU地址转换过程及描述符定义

虚拟地址空间到物理地址空间映射是以内存块为单位进行的,即虚拟存储空间中一块连续的存储空间被映射成物理存储空间中同样大小的一块连续存储空间,每一个描述符实际记录了一个虚拟地址与物理地址之间的对应关系,ARM支持多种地址变换。
通常,以段为单位的地址变换过程只需要一级页表,而以页为单位的地址变换过程还需要二级页表。
地址转换过程
1.      从CP15寄存器C2得到一级页表的基地址
2.      将虚拟地址作为页表的索引,得到页表中该虚拟地址的描述符。
3.      判断该描述符是否为段描述符,如为段描述符,将该描述符和虚拟地址作为偏移量组成一个32位的物理地址进行访问。
4.      如为粗页表描述符,则将该粗页表描述符作为二级页表的基地址,并将虚拟地址位作为索引得到在二级页表中该虚拟地址的描述符。
判断二级页表符的类型
①      为极大页描述符表将该描述符作为基地和虚拟地址作为偏移量得到该虚拟地址的32位物理地址进行访问。
②      为小页描述符表将描述符作为基地和虚拟地址作为偏移量得到该虚拟地址的32位物理地址进行访问。
5.      如为细页表描述符,将该组页表描述符作为二级页表的基地址,并将虚拟地址位作为索引得到在二级页表中该虚拟地址的描述符。
判断二级页表符的类型
①为大页描述符表将该描述符作为基地和虚拟地址作为偏移量得到该虚拟地址的32位物理地址进行访问。
    ②为小页描述符表将该描述符作为基地和虚拟地址作为偏移量得到该虚拟地址的32位物理地址进行访问。
③为小极页描述符表将描述符作为基地和虚拟地址作为偏移量得到该虚拟地址的32位物理地址进行访问。
其转换过程如下图如示:


当采用段描述符时,虚地址共20位作为偏移量可寻址空间为1M
当采用二级描述符时:
第一级为粗页时,虚地址共8位作为第二级的索引量,可寻址256个第二级页表。
1.当第二级为小页描述符时,虚地址作为偏移量,可寻址空间2^12=4k,一个粗页表总可寻址4k*256=1M。
   2.当第二级为大页描述符时,虚地址作为偏移量,可寻址空间2^16=64k   但是,虚地址是作为第二级大页描述符的索引,虚地址作为偏移量,也就是说虚地址被重复使用。我们考虑一下从0x0~0xffff(64K)空间地址的转换问题,显然虚地址将从0~f,也就是说二级页表开始的16个描述符都将被访问,如果每个描述符定义的页物理基地址不一致,如第二级第一个页表定义物理基地址为0x300000000;第2个页表为0x30001000,第16个页表定义的物理基地址为0x300f000时,0~ffff(64K)空间将被映射到0~fffff(1M)地址空间,显然这是不正确的。为了得到正确的结果,我们可以将这粗页表中16个连续的大页描述符定义为同一大页描述符,其物理基地址一致。
    结论:当采用二级页表时,索引第二级页表虚地址和作为偏移量的虚地址有重复时,其重复为n位,则第二级页表中连续的2^n个页表描述符必须定义为一致。如上所示位重复,n=4,则连续16个描述符必须相同。
第一级为细页表时,其情况类似,不再分析。

地址映射具体实例:

我们将以下图所示的过程对虚拟地址0x00000018和0x30605600的转换过程进行详细的说明:
TLB寄存器值0x33ffc000是整个页表的基地址
0x00000018地址转换:将虚地址位0x0作为索引*4(每个描述符占4个字节)再与页表基地址相加得0x33ffc000,即页表中第一个描述符,因为该描述符为段描述符,将其位0x300左移20位充0为0x30000000作为该段物理基地址,并将虚地址位0x18作为偏移地址与该段物理基地相加得0x30000018。该地址就为虚地址0x18对应的物理地址。
0x30605600地址转换:将虚地址位0x306作为索引*4(每个描述符占4个字节)再与页表基地址相加得0x33ffcc18,即页表中第775个描述符,因为该描述符为粗页描述符,将其位0xcffc0左移10位为0x33ff0000作为第二级页表的基地址。再将虚地址位0x05作为索引*4(每个描述符占4个字节)与0x33ff0000相加得到该虚拟地址的第二级页描述符地址0x33ff0014。因为该描述符为第二级小页描述符,将其位0x30605左移12位得0x30605000作为该粗页的物理基地址,并与虚地址位0x600作为偏移量相加得0x30605600作为该虚地址转换后的物理地址。


描述符表的计算及添加
设定:
      因为段描述符可以映射1M的空间,需要映射多少M就需要多少个连续的段描述符
1.      将虚拟结束地址和起始地址右移20位(除1M)相减,得段描述符数量用来控制需要循环的次数
2.      根据TLB和虚拟起始地址得到在页表描述符的起始地址
3.      将需要映射的物理地址右移20位(除1M)
4.      将移位后的物理地址填入起始位置页表描述符的位,并将描述符属性加入描述符相应位置AP、Domain、CB、10(段描述符标志)
5.      将描述符起始地址加4(描述符为4个字节)指向下一个描述符
6.      将移位后的物理地址加1(实际上在基地址的位加1)指向下一M物理空间。
7.      循环至第4步,至到所有描述符被赋值。

fans_run 发表于 2010-12-12 19:49:34

对于这一点我也有很大的疑问,现在还看不懂,先收藏起来,慢慢再研究研究,多谢了

machoe 发表于 2010-12-12 19:59:30

好东西,一定要顶的。

para 发表于 2010-12-22 20:53:05

看不懂啊   。

zhaifangchao 发表于 2011-1-1 01:38:40

新手,就要多顶
页: [1]
查看完整版本: 裸奔程序6(上)-虚拟地址映射功能分析及实现