标签:
转自:http://blog.chinaunix.net/uid-29091195-id-4020919.html
一、MMU初步了解
概念:内存管理单元(memory management unit),简称MMU
主要作用:负责虚拟地址到物理地址之间的转换
提供硬件机制的内存访问权限检查
发展由来:由于程序的大小逐步发展到大于内存的大小这一问题的出现
导致了虚拟存储器的产生,虚拟存储器的基本思想是:数据、堆栈的总
大小可以超越物理存储器(大于内存的程序在执行的时候只将其中需要
运行的一部分调入内存,其他部分在外部存储器中)。由于虚拟存储器
的出现导致cpu发出的虚拟地址不能够直接送至地址总线,这是就需要
一个将虚拟地址转换物理地址的设备,它就是内存管理单元(MMU)。
32位处理器最大可以虚拟出的地址范围是0~0xffffffff
二、工作特点
1、没有启用MMU时候,cpu发出的地址是物理地址
2、启用MMU后,cpu发出的是虚拟地址
注:另一说法其实是cpu总发出虚拟地址,只不过是在没有进行空间映射
时候,虚拟地址到物理地址的转换是一种线性转换的机制。
虚拟地址到物理地址的转换方法一般有两种:
其一、使用一个固定的函数式
其二、建立一个表格进行映射。(页表由一个个条目组成)
ARM cpu使用页表进行地址转换的过程:
1)根据给定的虚拟地址找到一级页表中的条目
2)如果此条目是段描述符,直接返回物理地址,转换结束
3)否则此条目是二级页表,继续在二级表中查找下一条目
4)如果此条目是页描述符,则返回物理地址,转换结束
5)其他的情况,则转换出错
注:有上述的过程不难知道一般的ARM处理器最多用到二级页表。
三、TLB了解
概念:转译查找缓存(translation lookaside buffer)
作用:解决MMU每次转换都需查表,降低了cpu性能的问题
工作过程:当cpu发出一个虚拟地址的时候,MMU会首先访问TLB,如果
在TLB中有这一虚拟地址的描述符,则直接使用该描述符进行地址转换
。否则MMU访问页表找到对应的描述符在进行地址转换和权限检查,同时
使用一定的算法将这一描述填入TLB中。
四、Cache了解
概念:在主存和cpu的寄存器之间的告诉小容量存储器,简称高速缓冲存
储器,也有的将其叫做快取
作用:将正在执行的指令地址附近的一部分指令或者数据从主存调入这
个存储器,供cpu在一段时间内使用,从而提高程序运行的速度。
一般离cpu越近的cache速度越高,但是其容量一般比较小(按一级、二级
cache来说,一级更高速,二级容量更大一些)
cache有指令快取(ICache)和数据快取(DCache)
五、mmu编程实例:(实验平台mini2440)
下面的实验是将GPB的地址0x56000000映射到0xA0000000,然后再对虚拟地址
进行操作,点亮led的实例,实验目的在于学习mmu的页表建立,以及的段址映射
的方法。
1、启动代码(start.S)
.text
.global _start
_start:
ldr sp, =0x4096 @以下是c程序,运行前需要设置栈指针
bl disable_watch_dog
bl memsetup
bl copy_2th_to_sdram
bl create_page_table
bl mmu_init
ldr sp, =0xB4000000
ldr pc, =0xB0000000 @这个地址很重要,他必须是第二阶段代码的重载地址(运行地址)
halt:
bl halt
2、初始化事件(init.c)
点击(此处)折叠或打开
注:这部分代码是linux应用手册中的实例程序,只是修改了第二阶段的代码拷贝的目的地址
3、点亮led灯(led.c使用虚拟地址)
点击(此处)折叠或打开
4、工程链接脚本(mmu.lds)
SECTIONS {
first 0x00000000 : { start.o init.o }
second 0xB0000000 : AT(2048) { led.o }
}
注:second段的加载地址必须与拷贝代码中的起始地址一致,否则拷贝后代码无法执行
second段的运行地址(重载地址)必须与启动代码start.S中的跳转地址一致,否则
pc指针无法正确的跳转到第二阶段执行点亮led灯的程序。
5、工程Makefile
objs := start.o init.o led.o
mmu.bin : $(objs)
arm-linux-ld -Tmmu.lds -o mmu_elf $^
arm-linux-objcopy -O binary -S mmu_elf $@
arm-linux-objdump -D -m arm mmu_elf > mmu.dis
%.o:%.c
arm-linux-gcc -Wall -O2 -c -o $@ $<
%.o:%.S
arm-linux-gcc -Wall -O2 -c -o $@ $<
clean:
rm -f mmu.bin mmu_elf mmu.dis *.o
标签:
原文地址:http://www.cnblogs.com/sky-heaven/p/5684822.html