转自:http://blog.chinaunix.net/uid-23193900-id-3187782.html

1.MMU简介

   MMU(Memory Management Unit),内存管理单元,主要职责:将虚拟地址映射为物理地址,提供硬件机制的内存访问权限检查。
 

2.基本概念

  虚拟地址(Virtual Address,VA),修改后的虚拟地址(Modified VA),物理地址(Phisical Address)
 VA是CPU使用的地址,MVA是MMU、Caches使用的,PA是内存设备使用,他们的映射关系:
  
 
(1)cpu看到的是VA
(2)caches和MMU使用的是MVA,
(3)实际物理设设备使用的是PA。
 

3.地址转换中的基本概念

地址的转换就像是数学中映射,利用函数公式,多对1,就是多个虚拟地址对应同一个物理地址。
这里地址转换用的是页表的方式:
  • 页表
   页表是由一个个表项(Entry,又称作描述符)组成的物理表,每个页表项或是一个物理页(一块物理内存,大小为1k,4k不等)的起始地址,或是一个二级页表的地址(当是一个二级页表的地址时,又可以称该页表为页描述符)。所有的页表都用物理地址访问。
  • 表项(描述符)的分类
  依据描述符保存的内容,可以分为两类。
  一类保存的是直接的物理页或段的起始地址,如段描述符、大页、小页、极小页描述符。
  另一类保存的是二级页表的物理地址,如粗页表描述符,细页表描述符。
  • 一级映射与二级映射
   一级映射,是指以段(Section,大小1MB)的方式进行转换。
   二级映射,是以页的方式进行转换。ARM页大小由三种:1k,4k,64k。
 

4.地址转换的过程

  • VA->MVA:CPU发出一个VA,是怎么转换为MVA的
   这在上图可以看到,是通过一个硬件电路转换的。
 在ARM9里面,如果VA<32M,利用进程标识号PID转换得到MVA
过程如下:
if(VA < 32M)
     MVA = VA | ( PID<<25 )
else
     MVA = VA
只是上面的过程是由硬件实现的。
  这样为VA进行了一级映射,为什么呢?在linux系统里,每个进程的地址空间0-4G,0-3G是进程独有的,称为用户空间,3G-4G是系统的,称为内核空间,所有进程共享。如果两个进程所用的VA有重叠,在切换进程时,为了把重叠的VA映射到不同的PA上,需要重建页表、使无效caches和TLBS。使用了MVA,使进程在VA相同的情况下,使用不同的MVA,进而PA也不同。这就是在VA与PA之间加上一次到MVA的映射的意义。
 
  • MVA->PA:MVA到PA的转换
上面说了,虚拟地址到物理地址的转换有两种方式:公式映射+页表转换。
概念上面也介绍过了。
这里就进行实际的转换说明。
首先,给定一个MVA,要进行转换,先要找到一级页表,怎么找?
有一个寄存器,TTB寄存器,页表基地址寄存器,负责保存一级页表的基地址,当然是物理地址。
 
TTB寄存器是集成在CP15协处理器中的,
 
TTB的格式:
因此,一级页表的地址是16k对齐的,因为[14:0]要求为0.
 
一级页表的描述符格式:
 
 
一级页表的表项,可以是个段描述符,粗页表描述符或细页表描述符。
共同点是,每个描述符都代表1MB的物理地址空间。
不同点:段描述符直接指向一个1MB地址空间,可以直接访问;而页表描述符,顾名思义,就是指向一个二级页表,还需要另一次映射。
 
二级页表的描述符格式:
 
 
二级页表有两种:粗页表(Coarse Page Table )+细页表( Fine Page Table)
粗页表与细页表的异同:粗页表有最多256个表项,每个表项可表示4kb空间,如果表项是个大页页表描述符,则连续16个表项都表示同一个大页描述符。
细页表中每个表项代表1kb,指向一个极小页;也可扩展成4k的小页,64k的大页。
 
页表的结构与格式就是这些了。。下面看转换的具体过程
 
 
段地址转换
 
大页地址转换
小页的地址转换
 
极小页的地址转换
 
 

S3C2440之MMU的更多相关文章

  1. MMU内存管理单元

    arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及 ...

  2. [转帖]MMU内存管理单元

    MMU内存管理单元 https://www.cnblogs.com/alantu2018/p/9002309.html 之前对这一块一直不理解 最近学习了点 CPU time slice 以及 con ...

  3. S3C2440—9.复制程序到SDRAM中执行

    文章目录 一.S3C2440的启动方式 二.代码 一.S3C2440的启动方式 S3C2440的MMU有一种"steppingstone".技术,是协助MCU从无法执行程序的NAN ...

  4. buildroot构建项目(一)---buildroot介绍

    1.1 什么是buildroot Buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfig配置文件构成的.你可以和编译Li ...

  5. 学了5天Arm,今天谈谈初学感受 (转)

    一.初探      4月1日入手友善mini2440.先看了下板子,感觉没什么稀奇的,s3c2440总线上外挂SDRAM(对这个不是很感冒,之前搞过一个FPGA的SDRAM控制器),NOR    .  ...

  6. 转 s3c2440硬件学习----内存管理单元MMU

    本篇基本是韦东山书上的 一.内存管理单元MMU介绍 内存管理单元简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查.MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访 ...

  7. 十三、S3C2440 裸机 — 初始化代码及MMU

    13.1 NOR FLASH 搬运 把程序从 nor flash 上搬运到 SDRAM 中 程序存储在 nor flash 上,运行时将程序搬运到 SDRAM 中运行 nor flash 启动:nor ...

  8. S3C2440的Linux启动过程分析(一)——SC2440处理器结构

    1.1.     S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MM ...

  9. 第七章 内存管理单元MMU介绍

    7.1 内存管理单元MMU介绍 7.1.1 S3C2410/S3C2440 MMU特性 负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查 特性: 与ARM V4兼容的映射长度.域.访问权 ...

随机推荐

  1. autoproxy 规则

    目前在 gfwList 中,有如下的规则格式: example.com 匹配:http://www.example.com/foo匹配:http://www.google.com/search?q=w ...

  2. 服务器重写技术:rewrite

    rewrite 是一种服务器的重写技术,它可以使得服务器支持 URL 重写,是一种最新流行的服务器技术. 主要功能:限制特定IP访问网站,实现URL的重写.

  3. Linux下解决“shutdown: command not found"问题

    今天关机时,使用shutdown来执行此操作,但出现了一个"bash:shutdown:command not found"错误提示.这让我很困惑,这个命令在系统中是肯定存在的,但 ...

  4. 260. Single Number III

    Given an array of numbers nums, in which exactly two elements appear only once and all the other ele ...

  5. php部分--题目:投票

    1.建立两个表格:要显示百分比的话,就要在选项表中加上一列标记number 2.链接数据库,并对题目和选项进行显示 <?php $db=new MySQLi("localhost&qu ...

  6. HDU 5957 Query on a graph

    HDU 5957 Query on a graph 2016ACM/ICPC亚洲区沈阳站 题意 \(N(N \le 10^5)\)个点,\(N\)条边的连通图. 有\(M \le 10^5\)操作: ...

  7. URAL 1208 Legendary Teams Contest(DFS)

    Legendary Teams Contest Time limit: 1.0 secondMemory limit: 64 MB Nothing makes as old as years. A l ...

  8. 【NOIP2013】华容道

    看别人的代码然后被坑了一下午+一晚上,睡一觉第二天醒悟过来打表过了 果然打表才是正确的调试方法,跟踪什么的去屎(╯‵□′)╯︵┻━┻ 原题: 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成 ...

  9. 共享内存+互斥量实现linux进程间通信 分类: Linux C/C++ 2015-03-26 17:14 67人阅读 评论(0) 收藏

    一.共享内存简介 共享内存是进程间通信中高效方便的方式之一.共享内存允许两个或更多进程访问同一块内存,就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针,两个进程可以对一块共享 ...

  10. ceph

    http://docs.ceph.com/docs/master/radosgw/swift/java/