ARM9学习笔记之——MMU

原创 2012年03月27日 22:38:09

        我记得有一次我去应聘ARM-Linux软件工程师。结果被问到ARM中的虚拟内存是怎么管理的。由于我只对X86平台下的MMU了解,所以我被问倒了。原来我所学的只是皮毛。还有很多东西值得我去深入。要做ARM-Linux下的驱动,熟悉虚拟内存应该是必须的。

        ARM9中的虚拟内存是怎么实现的呢?以下是我的学习总结。

 

        ARM920T核是通过CP15来实现MMU机制的。

 

1. 关于地址

        要知道虚拟内存机制必须了解ARM9中的3种地址:VA(虚地址),MVA(修正后虚地址),PA(物理地址)

        1)VA,是程序中的逻辑地址,0x00000000~0xFFFFFFFF。

        2)MVA,由于多个进程执行,逻辑地址会重合。所以,跟据进程号将逻辑地址分布到整个内存中。MVA = (PID << 25)  | VA

        3)PA,MVA通过MMU转换后的地址。

        由2可知,地址位共32位,PID占7位,所以最多只能有 128 个进程。而每个进程可访问的地址位为25位,故只能分到 32MB 的地址空间。(注:不是物理内存空间)

        PID是存放在CP15协处理器的C13寄存器的高7位。

 

2. 关于虚拟内存转换

        CP15从C2中获得页基址(TTB)。将 MVA 的高12位作为页表索引值。获得页表项:TTB [ MVA >> 20 ]。注意:页表项是32位的。

        从上可知,一个页表最多有4096个页表项,也就是4K。那么,每个页表项可以表示1MB的地址空间。

        得来的项表项分三种:

        1)段页描述符,直接指向1MB的内存空间。

        2)粗页描述符,有256个二级页表项,每个二级页表项指向4KB的内存空间。

        3)细页描述符,有1024个二级页表项,每个二级页表项指向1KB的内存空间。

 

  ## 粗页描述符中存放的是粗页表二级表的基址。 将MVA的[19~12]位用来进行二级页表查寻。粗页表二级表分两种:

        1)大页描述符,一个描述符可以对应64KB的内存地址,但16个二级描述符对应同一块内存。

        2)小页描述符,一个描述符只对应4KB的内存地址,每个二级描述符只对应一块内存。

  ## 细页描述符中存放的是细页表二级表的基址。将MVA的[19~10],共计10位用于进行二级页表索引。二级页表共1024个描述符。剩下的10位作为基址,可访问空间为1024B。

     

    如下是内存转换图:

 

思考:

        通过上面的学习,了解到ARM将4GB的地址访问空间分成128个32MB,每份供一个进程使用。如此以来,一个进程的地址访问空间只有32MB。如进程1的地址空间为[0x02000000~0x03FFFFFF]。如果超出这个范围,地址访问就是非法的。

        那ARM9在设计CP15时为什么不为每一个进程指定一个单独的页表。这样以来,每个进程就可以独地拥有4GB的地址空间。

        如此以来,进程数就不再受限于128个,可以多达1024个进程。而每一个进程的虚拟地址的空间可以扩展到4GB。

ARM存储管理系统MMU

一、虚拟地址和物理地址的区别         CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分。如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有...

linux arm mmu基础

先上一张linux arm mmu的页表结构的框图:

ARM MMU工作原理解析(转载)

最近在学习bootloader制作,学到内存管理单元(MMU)时,对其原理不甚了解,遂在网上搜索了部分相关文章,读到该篇时,发现其对MMU中虚拟地址与物理地址之间的映射讲解比较清晰,易于理解,但在访问...

ARM MMU 创建页表

启用MMU,映射SDRAM的地址空间,操作虚拟地址实现“点灯大法”,借此掌握MMU的使用。 实验环境及说明:恒颐S3C2410开发板H2410。H2410核心板扩展有64MB的K4S561632...

ARM体系之MMU

1  什么是MMU,MMU的作用 MMU是MemoryManagementUnit的缩写. 针对各种CPU, MMU是个可选的配件. MMU负责的是虚拟地址与物理地址的转换. 提供硬件机制的内存访问...

s3c2440之IO口--流水灯

1:S3C2440A的多功能引脚概叙 S3C2440A有130个多功能输入/输出管脚,8个端口组,如下所示:      Port A(GPA):25个输出端口      Port B...

嵌入式学习笔记2—S3C2440的内存初始化

本文基于国嵌的视频教程,总结一下ARM内存体系架构。 由S3C2440的datasheet可以看出,该芯片具有27根地址总线,则2^27=134217728bits=131072Kb=128Mb。总...

ARM9学习笔记之——MMU

我记得有一次我去应聘ARM-Linux软件工程师。结果被问到ARM中的虚拟内存是怎么管理的。由于我只对X86平台下的MMU了解,所以我被问倒了。原来我所学的只是皮毛。还有很多东西值得我去深入。要做AR...
  • judyge
  • judyge
  • 2015年11月14日 20:21
  • 190

ARM 学习笔记 (三) S3C2440 MMU 配置

接上回说;          在中断配置时 有一个函数  MMU_Init()  这个是MMU的初始化函数,用来初始化存储器管理单元的 (Memory Manage Unit  )。那这个单元是来...

ARM 学习笔记 (三) S3C2440 MMU 配置

接上回说;          在中断配置时 有一个函数  MMU_Init()  这个是MMU的初始化函数,用来初始化存储器管理单元的 (Memory Manage Unit  )。那这个单元是来...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARM9学习笔记之——MMU
举报原因:
原因补充:

(最多只允许输入30个字)