MMU配置和使用

发布者:画意人生最新更新时间:2022-05-30 来源: eefocus关键字:MMU  配置  内存管理 手机看文章 扫描二维码
随时随地手机看文章

一:初识MMU

MMU是memory managerment unit 即内存管理单元,是把虚拟内存转化为物理内存的一个“介质”,为什么要用到虚拟内存呢,因为在嵌入式系统中,进程和程序是很多的,物理内存根本不够用,所以使用MMU可以最大限度减少物理内存的使用,提高运行效率。MMU也是嵌入式和单片机两者中不同点最大的地方,单片机是没有MMU这个概念的。在这里,我们尝试去做一个简单的程序。假设保存为a。


#include

int a=1;

void main()

{

   while(1)

{

printf("&a=%p,a=%dn",&a,a);

sleep(3);

}

}


首先在虚拟机上运行这个程序后在我的主机上显示的是0x80496a4 a=1

再将此文件复制一次保存为b。修改b,将int a=1改为int b=2。


#include

int b=1;

void main()

{

   while(1)

{

printf("&b=%p,b=%dn",&b,b);

sleep(3);

}

}


运行后发现显示的是0x80496a4 b=2

为什么读出来的地址一样,一个读出的是1,一个读出的是2呢?

这就是MMU的作用了,这个地址0x80496a4其实是虚拟地址,MMU需要将其转化为物理地址。


二:MMU深入学习

MMU 页表描述

为了支持段和页的映射方式,MMU使用两级页表描述符,一级页表描述符决定访问的是一个分段还是一个分页式的表,如果访问的是一个分页式的页表,处理器MMU决定页表类型是大页还是小页并找到二级页表。


一级页表描述符格式分析

这里写图片描述

如上图所示:

bit[1:0]: 映射类型,分段式还是分页式。

00 忽略

11 无效,返回Translation fault

10 分段式

01 分页式

nG : 0 转换表被标记为全局的; 1 转换表属于特定进程

S : 共享位,0 非共享; 1 共享内存

XN: 0 包含可执行代码; 1 不包含可执行代码

APX,AP位: 权限访问控制位

Doman : 域标识,属于哪个域

P: ECC校验

TEX,C,B: 此区域是否采用缓冲buffer,cache,还是直接访问,一般外设采用无缓冲,内存采用缓冲方式(个人理解)

NS:No-Secure 属性


二级页表描述符格式分析

这里写图片描述

bit[1:0] : 01 时,采用粗粒度大页64K进行映射 1X时,采用小(细)页4K进行映射


1M分段式映射

这里写图片描述

页表基地址(TTBRx寄存器中)18bits[31:14]+虚拟地址12bits[31:20] +2[00] 构成了一级页表描述符的地址

取得了一级页表描述符的地址,访问这个地址从中可以得到真实的物理段基地址[31:20]

将得到的物理段基地址[31:20]加上虚拟地址中的[19:0]位偏移地址构成了真正的物理地址

每个虚拟地址可以索引 2^12 个一级描述符地址,每个一级描述符可以包含 2^20 个物理地址,总共可以索引4G空间


三:代码实现

所需要进行的工作包括以下三点

1 建立一级页表

2 写入TTB (写入TTB,因为MMU通过cp15寄存器的c2找到表项,来进行后续的工作)

3 打开MMU


一:

根据一级页表描述符,表的基地址在内存起始位置,表项的前十二位Section base address为物理基地址,段描述:section base address是物理地址高十二位,SBZ为should be zero,AP为访问权限(access peimission) ,Domain为域,C为cache,B为write buffer,最后两位10表示段式映射。表项需要设置段式还是分页式,权限,域这里选择为0,由于访问GPIO是很简单的,所以不需要cache和write buffer。


二:

这里写图片描述

c2是设置TTB的寄存器。TTB实际上是页表的基地址,在这里页表放在内存首地址上,写入c2寄存器中。所以这里只要把首地址写入c2寄存器中即可。


三:

使能MMU,cp15的C1寄存器的第0位使能MMU,将其设置为1即可。

这里写图片描述

设置域的访问权限,每个域的访问权限是由c3寄存器控制的,决定每个域的S和R位,在这里设置为11,意思是不去检查他的访问权限,这里把所有的位都设置为1即可。以下是c3寄存器的描述。

这里写图片描述

这里写图片描述

参考:http://www.jianshu.com/p/faebd7feb218


以下为代码实现:


虚拟地址 找到物理地址,然后通过物理地址点亮led

在这里虚拟地址选择为0xA0000000,映射到物理地址0x7f000000,需要页表建立映射关系,一般放在内存的起始地址,6410为0x50000000,


#define GPKCON (volatile unsigned long*)0xA0008820

#define GPKDAT (volatile unsigned long*)0xA0008824


/* 

 * 用于段描述符的一些宏定义

 */ 

#define MMU_FULL_ACCESS     (3 << 10)   /* 访问权限 */

#define MMU_DOMAIN          (0 << 5)    /* 属于哪个域 */

#define MMU_SPECIAL         (1 << 4)    /* 必须是1 */

#define MMU_CACHEABLE       (1 << 3)    /* cacheable */

#define MMU_BUFFERABLE      (1 << 2)    /* bufferable */

#define MMU_SECTION         (2)         /* 表示这是段描述符 */

#define MMU_SECDESC         (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_SECTION)   //这里访问GPIO是很简单的不需要cache和write buffer

#define MMU_SECDESC_WB      (MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL | MMU_CACHEABLE | MMU_BUFFERABLE | MMU_SECTION)


//对GPIO进行映射

void create_page_table(void)

{

    unsigned long *ttb = (unsigned long *)0x50000000;

    unsigned long vaddr, paddr;


    vaddr = 0xA0000000;

    paddr = 0x7f000000;

    *(ttb + (vaddr >> 20)) = (paddr & 0xFFF00000) | MMU_SECDESC;//取虚拟地址的高20位,物理基地址高十二位,


//内存映射,采用虚拟地址和物理地址相同,用while循环这里选择映射64M空间(不需要太多),这里需要打开cache和write buffer,每次映射好后加上1M,对下一段地址进行映射

    vaddr = 0x50000000;

    paddr = 0x50000000;

    while (vaddr < 0x54000000)

    {

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

        vaddr += 0x100000;

        paddr += 0x100000;

    }


}



void mmu_init()

{

   __asm__(


    /*设置TTB*/

    "ldr    r0, =0x50000000n"                  

    "mcr    p15, 0, r0, c2, c0, 0n"    


    /*不进行权限检查*/

    "mvn    r0, #0n"                   

    "mcr    p15, 0, r0, c3, c0, 0n"    



   /*使能MMU*/

    "mrc    p15, 0, r0, c1, c0, 0n"    

    "orr    r0, r0, #0x0001n"          

    "mcr    p15, 0, r0, c1, c0, 0n"    

    : 

    : 

  );

}


int gboot_main()

{

    create_page_table();

    mmu_init();


    *(GPKCON) = 0x1111;

    *(GPKDAT) = 0xe;


    return 0;    

}

关键字:MMU  配置  内存管理 引用地址:MMU配置和使用

上一篇:s3c6410时钟体系
下一篇:老查的ARM学习笔记:chapter-3(串口驱动程序分析 )

推荐阅读最新更新时间:2024-11-12 13:15

STM32F103封装方式与功能配置
STM32F103封装主要包括LQFP48、LQFP100、LQFP64、VFQFPN36、BGA100 STM32F103管脚功能配置,引脚功能如下图所示:
[单片机]
STM32F103封装方式与功能<font color='red'>配置</font>
STM32笔记(四)---配置系统时钟实验
配置系统时钟实验 1 使用 HSE 一般情况下,我们都是使用 HSE,然后 HSE 经过 PLL 倍频之后作为系统时钟。 通常的配置是: HSE=8M, PLL 的倍频因子为: 9,系统时钟就设置成:SYSCLK = 8M * 9 = 72M。使用 HSE,系统时钟 SYSCLK 最高是128M(16倍频)。 当程序来到 main 函数之前,启动文件: statup_stm32f10x_hd.s 已经调用 SystemInit()函数把系统时钟初始化成 72MHZ, SystemInit()在库文件: system_stm32f10x.c 中定义。如果我们想把系统时钟设置低一点或者超频的话,可以修改底层的库文件,但是为了维
[单片机]
[单片机框架][bsp层][nrf51822][nrf51422][nrf51802][bsp_gpio] GPIO配置和使用
GPIO The general purpose I/O is organized as one port with up to 32 I/Os (dependent on package) enabling access and control of up to 32 pins through one port. Each GPIO can be accessed individually with the following user configurable features: Input/output direction Output drive strength Internal pull-up and pull-d
[单片机]
比亚迪元,长安CS15和宝骏510谁的做工配置更厚道
    如今挣钱容易存钱难,很多朋友每年也能挣不少,平时开销再加上一些活动聚会等等,到年底到月底才发现这钱是真的靠不住,还没反应过来钱就没有了,那么买车怎么办?尤其是咱们年轻人买车就不考虑什么品牌或者大空间,买台差不多的汽车就行,什么国产合资都无所谓,只要价钱合适。但一般来说太便宜的合资车还真没有,所以只能瞄准国产车。如今SUV市场这么火爆,自然也首选SUV,那么就推荐目前卖的最火爆的三款国产小型SUV。      首先来说第一款,比亚迪元。作为比亚迪的一款小型SUV,首先从外观来看,我觉得比亚迪元的设计比较成功,但是比起宝骏510可能少了一些时尚感,但是设计上就有很大优势,比如说前脸中网的汉字“元”,融入前脸设计之后带来了极为不
[汽车电子]
努比亚发布千元全面屏幕V18:续航好评配置不给力
新浪手机讯 3月22日下午消息,今天下午努比亚在北京召开新品发布会,正式发布了旗下千元“全面屏”手机V18,售价1299元。( 新机上手体验 ) 努比亚V18发布会现场   这款产品采用了一块18:9,分辨率为1080*2160的Full HD屏幕,正面屏占比为86.25%。屏幕像素密度403,色域可达85%NTSC。对比度最高1500:1,峰值亮度可达470cd/㎡。 努比亚V18采用了全面屏设计   硬件配置方案为高通骁龙625处理器,搭配Adreno 625CPU。内存方面为4GB RAM+最高64GB ROM,支持最高128GB MicroSD卡拓展,支持双卡双待。   摄像头方面前置800万像素,光圈f/2.0摄像头,采
[手机便携]
430单片机时钟系统与复位系统的配置(2)
通过看视频 看学数据手册 已经对时钟系统有了一点感觉 首先 对时钟源有了自己的理解了 单片机有三个时钟源 分别是外部高频时钟(XT2CLK),外部低频时钟(LFXT1CLK),内部RC时钟(DCOCLK) 其中 外部高频时钟:的最高频率为8Mhz 仅可以提供高频时钟,一般作为CPU内部处理的时钟源(因为CPU要追求高效率嘛) 外部低频时钟:在单片机时钟引脚处放的是32.768KHZ,但是它可以通过内部的一个寄存器配置为高频模式 内部RC时钟:由内部RC振荡器产生 顾名思义,时钟源是生时钟信号的起源,其本质也是时钟信号。把这些信号进行 分屏,配置即可产生单片机系统的信号 LFXT1CLK- MCLK(主时
[单片机]
430单片机时钟系统与复位系统的<font color='red'>配置</font>(2)
或配备高通骁龙810处理器 LG G4配置预测
    据悉,LG今年的市场表现比去年同期有了大幅增长,其中LG G3作为LG的旗舰手机自然是功不可没,如今LG G3上市已经有一段时间了,那么下一代旗舰G4又会给我们带来了些什么惊喜呢?我们不妨来预测一下G4会是怎么样的吧。    机身设计   最近LG展示了一款拥有边框只有0.7mm的5.3英寸2K屏幕,这块屏幕能够展示在人们眼前,说明屏幕技术成熟度还不错,并且该屏幕是LG自主研发 的,明年技术应该能够成熟,那么LG应该把这块屏幕运用到下一代产品当中,此外同为韩国科技公司巨头的三星已经开始开始去尝试在手机材质上以及外观上进行 突破,LG应该不甘示弱,在外形上会有所改变的。    处理器的选择   CPU的选择
[手机便携]
魅蓝note 2正面谍照曝光 配置细节流出
    从魅族宣布将于6月2日举办魅蓝新品发布会开始,魅蓝note 2和其配置的“腰圆”键就成了大家讨论的热点。而在临近发布会之际,有网友又再次曝光了魅蓝note 2真机的正面谍照。 魅蓝note 2正面谍照   谍照中这款魅蓝note 2最主要的特点是采用了腰圆形状的实体Home键设计。对于该设计,魅族副总裁李楠表示是为“革Android系统的Back键的命”。   另外,魅族Flyme总设计师杨颜在不久前也曾表示:这次的腰圆形状以及更重要的交互设计是吐血几次才搞定的。从其话语间我们不难看出魅族在“腰圆”键上花费了大力气,其带来的体验更是值得期待。 魅蓝note 2背面谍照   除此外,魅蓝note 2还有一项
[手机便携]
热门资源推荐
热门放大器推荐
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved