设为首页 加入收藏

TOP

OK6410,MMU,内存管理 杂谈(一)
2016-12-12 08:15:31 】 浏览:374
Tags:OK6410 MMU 内存 管理 杂谈

一、MMU学习



  MMU其实就是一个页表。将虚拟地址通过查表的方式,对应到物理地址去他由一个或一组芯片组成,一般存在与协处理器中。


  1.将虚拟地址转化为物理地址


  2.访问权限管理


1.1得出mmu功能




  这个图就说明了MMU的作用:


  有三个任务在运行,运行的地址都是0x400000,如果不进行处理,肯定是不行的。所以加入了MMU,MMU其实就是一个页表。将虚拟地址通过查表的方式,对应到物理地址去。虽然三个任务的运行地址都是0x400000,但是这个地址是虚拟地址,在页表中,将每个任务的虚拟地址对应到不同的物理地址,这样,就实现了各个任务虽然是同一个虚拟地址,但是在不同的物理地址中运行。


1.2映射方式(ARM920T_TRM1_S 57页)


  映射方式:映射方式有两种,段映射和页映射。段映射只用到一级页表,页映射用到一级页表和二级页表。


  映射粒度:段映射的映射粒度有两种,1M section和16M supersection;页映射的映射粒度也有两种,4K small page和64K large page。



1.3页表


  MMU要自动进行虚拟地址到物理地址的转化,首先要找到一级页表,而一级页表的基地址(TTB:translation table base)则是保存在CP15的C2寄存器中。因此,当程序员创建好相应的页表后,需要将页表基地址写入该寄存器。


MMU有一级转换和二级转换,其实就是查几次表。对于一级转换,就是只查一次页表,就确定了物理地址。这个在S3C6410中,方式是段映射。对于二级转换,就要查两次页表或者三次,才能确定物理地址,这个在S3C6410中。有两种方式,一种细页方式,一种粗页方式。这两种的区别就是每一页对应的大小不一样而已。



  通过虚拟地址的[31:20],找到对应的转换描述符,这个转换描述符其实就是一个存在ram中的32位的一个数据。通过判断这个描述符的最后两位,判断是什么转换。


1.3.1一级页表描述符



  一级页表描述符后两位如果是10则表示为段转换。


  如果是段转换,就按照段转换的格式去转化物理地址


  如果是页转换,就在去找第二级的页表,然后再按照二级页表的格式去转化物理地址。


  B:表示是否使能write buffer(使用buffer可以提高cpu运行效率-à当CPU访问内存数据时但是内存没准备此时cpu可以将数据暂时存放于buffer)


  C: 表示是否开启cache(cahce用来保存cpu可能要经常访问内存区域的数据,以便于快速访问)


 XN:


  Domain:用来说明该段属于哪一个域,ARM11共有16个域(由CP15的C3来设置),每个域可以设定不同的权限。将段分配到某个域,就使这段的权限和设定的域权限一样。 (手册arm11 P195)


  P:表示段区间有ECC,ARM11不支持,所以这一位为0.


  AP:访问权限,这个配合域,说明该段地址的访问权限。(手册arm11 P329)


  APX:提供额外的访问权限。


 S:表示区域是否共享。0不共享,1共享。这个手册上说,是为了多核使用的。目前用不到,设置为0.


  nG:


  Section base address:这个就是段的物理地址的高12位。


1.4段转换


  ARM11是32位的,对于段转换,每一个段代表物理的1MB地址,一级页表总共有4096个转换符,所以够表示的空间是4G。页表的首地址就是TTB,这个地址是很重要的,因为有了这个地址才能知道页表是存在什么地方的,才能通过偏移找到对应的描述符。所以,是有一个寄存器来保存这个地址的,这个寄存器就在CP15的c2寄存器。


  通过虚拟地址的高12位偏移,找到页表中的对应描述符,判断描述符的最后两位,确定是什么转换。10的话就表示是段转换。


  判断是段转换后,将描述符的高12位取出,这个就是物理的基地址,在和虚拟地址的后20位拼接,就得到对应的物理地址。


  对于段转换,每一个段代表物理的1MB地址。为什么是1MB了。因为总共是有4096个描述符,而ARM11是32位的,所以能够表示的空间是4G。


以段的方式进行映射时,虚拟地址MVA到物理地址PA的转换过程如下:


  ①页表基址寄存器位[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到描述符


  ②取出段描述符的位[31:20](段基址),它和MVA[19:0]组成一个32位的物理地址(这就是MVA对应的PA)




1.5页转换(ARM11 360页


  二级转换



1.6程序设计


1.6.1建立页表


  使用段映射的方式,那么就要将段映射的描述符写入到相应的内存中去。


  首先将页表放在ddr的第一个位置,也就是0x50000000。所以需要将这个地址写入到TTB中。


  其次,开启MMU后,使用的就是虚拟地址了,所以还要建立程序段的页表,不然一旦开启MMU,CPU去取指令,这个时候发出的就是虚拟地址,但是又没有建立虚拟地址到物理地址的映射表。这样的话,就取不到指令了,程序就崩溃了。所以还需要对代码区建立映射页表。代码区的映射就是将虚拟地址直接转换为物理地址使用。


  将这个地址给映射到0x7F000000区域去。


  unsigned long *ttb = (unsigned long *)0x50000000;//获取基地址


  unsigned long vaddr, paddr;


  vaddr = 0xA0000000;


  paddr = 0x7f000000;


  *(ttb + (vaddr >> 20)) = (paddr & 0xFFF00000) | MMU_SECDESC;


  //获得一级描述符的地址 并且赋值


  首先申明一个ttb指针,这个指针就指向一级表的基地址,也就是ddr的首地址,0x50000000。然后再申明两个变量,一个表示虚拟地址,一个表示物理地址。


  根据前面的一级段描述符格式,往对应的内存单元写入数据即可。段描述符的高12位是物理地址的高12位,所以首先有一个物理地址和0xFFF00000与的操作,将物理地址的高12位写入到段描述符。


  这里使用*(ttb + (vaddr >> 20))来对对应的页描述符进行赋值。在一级页表中,是通过虚拟地址的高12位来决定偏移是多少。高12位也就是位移20位,所以这里就是加上虚拟地址右移20位的值,也就是取出高12位的值。注意,这里是指针操作,假设这个时候虚拟地址的高12位值是5,那么写的地址不是0x50000005,而是0x50000014。因为指针的数据类型是long型,4个字节,所以加1,地址就会加4,加5,地址就会加5*4=20。


  后面位的配置:



  设置为访问权限是11,也就是不进行访问权限的检查。将域设置为0。CACHE和write BUFFER都给关掉。因为这只是对一个寄存器的操作,没有必要使用CACHE和write BUFFER。


  这样,就建立好了GPIO的页表。访问虚拟地址0xc7000000,也就是访问物理地址0x7f000000。整个段空间是1Mb。


1.6.2建立代码区的页表


  这个时候,代码已经是在内存中运行的了。所以,直接将内存的所有地址空间进行映射,空间是64MB大小。


  


  使用的宏


  


  其实就是多一个开启CACHE和WRITE BUFFER。


  内存映射是映射一片区域,从0x50000000地址开始到0x54000000这64M的虚拟地址给映射到0x50000000地址开始到0x54000000这

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇内存管理单元MMU(memory managem.. 下一篇Java 对象流的简单使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目