我记得有一次我去应聘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。

ARM9学习笔记之——MMU相关推荐

  1. [mmu/cache]-ARM MMU的学习笔记-一篇就够了

    ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 64位 . 相关文章 1.ARM cache的学习笔记-一 ...

  2. [mmu/cache]-ARM cache的学习笔记-一篇就够了

    ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 64位 . 相关文章 1.ARM MMU的学习笔记-一篇就 ...

  3. Nor Flash 学习笔记

    NorFlash 学习笔记 实验验平台:   TQ2440 CPU:      S3C2440A(ARM9) 开发环境:    ADS/MDK NorFlash型号 :AM29LV160DB   (1 ...

  4. ARM 学习笔记整理(一)

    ARM 学习笔记整理,主要用于将来的研究开发参考. 一.ARM体系结构的版本 处理器的体系结构就是其使用的指令集,而通常我们说的Soc结构的处理器可以理解为一个实现机器指令集的硬件内核,在这个内核周围 ...

  5. 嵌入式linux 添加中断,《嵌入式linux应用程序开发完全手册》中断控制器操作(外部中断)学习笔记...

    <嵌入式linux应用程序开发完全手册>中断控制器操作(外部中断)学习笔记 一.ARM中断体系 当一个"异常"发生时,或者说当收到一个中断触发信号时,ARM9将会自动完 ...

  6. Intel VT学习笔记(七)—— EPT物理地址转换

    Intel VT学习笔记(七)-- EPT物理地址转换 要点回顾 EPT 支持检测 9-9-9-9-12分页 实验:EPT物理地址转换 参考资料 要点回顾 在上一篇中,已经初步实现了最小VT框架,但实 ...

  7. ARMV8 datasheet学习笔记3:AArch64应用级体系结构

    1.前言 本文主要从应用的角度介绍ARMV8的编程模型和存储模型 2. AArch64应用级编程模型 从应用的角度看到的ARM处理器元素: 可见的元素(寄存器/指令) 说明 可见的寄存器 R0-R30 ...

  8. Cortex-M3学习笔记(一)

    Cortex-M3学习笔记(一) 首先,在学习Cortex-M3时,我们必须要知道必要的缩略语.整理如下:AMBA:先进单片机总线架构   ADK:AMBA设计套件 AHB:先进高性能总线    AH ...

  9. linux学习笔记 -- 系统编程

    系统编程 相关概念 概念 简易cpu结构 mmu内存管理单元 环境变量 PATH SHELL HOME LANG TERM getenv setenv unsetenv 进程控制 fork函数 get ...

最新文章

  1. Tensorflow实例3: 验证码图片的识别训练,每张图片有4个字母
  2. php 系统模版_原生 PHP 模板系统:Plates
  3. 列式存储ClickHouse(一)概述
  4. 算法之【大整数乘法】
  5. mysql不识别生僻字_MySQL生僻字插入失败怎么办
  6. 思考XSS攻击和跨站伪造请求CSRF
  7. 漫画:80 端口争夺战
  8. 跨境电商系统的一个架构演进
  9. Oracle 数据库迁移
  10. 共享文件问题 -- 无法访问 您可能没有权限使用网络资源
  11. educoder_python:6-1-对象第1关:TOM猫原型 类
  12. Android自定义View--Flyme6的Viewpager指示器
  13. 你住的房子安全吗?-房屋安全鉴定四项须知
  14. Saas系统架构的思考,多租户Saas架构设计分析
  15. MPLS:多协议标签交换
  16. 王者荣耀告诉你什么是节流
  17. String.matches()的用法
  18. 人像摄影长焦镜头拍摄攻略
  19. c#视频格式转换(.mov=>.mp4)
  20. python画矩阵图_Python可视化25_seaborn绘制矩阵图

热门文章

  1. 【错误记录】Android Studio 编译报错 ( SDK location not found )
  2. 【Android NDK 开发】NDK 交叉编译 ( Ubuntu 中交叉编译动态库 | Android Studio 中配置使用第三方动态库 )
  3. 【Android 应用开发】Paint 图形组合 Xfermod 简介 ( 图形组合集合描述 | Xfermod 简介 | PorterDuff 简介 )
  4. 吴裕雄 python 机器学习——数据预处理标准化StandardScaler模型
  5. mode: 'history', 去掉路由地址的#
  6. linux系统命令基础知识
  7. 链表是否带环、环入口、环长度、链表相交问题分析与总结
  8. HDU2222 Keywords Search(AC自动机模板)
  9. 【转】HTTP Response Header 的 Content-Disposition
  10. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点