4412裸机程序之mmu

发布者:心语如画最新更新时间:2021-12-13 来源: eefocus关键字:裸机程序  mmu 手机看文章 扫描二维码
随时随地手机看文章

内存管理单元MMU,负责虚拟地址到物理地址的转换,并提供硬件进制的内存访问权限检查,操作系统通过MMU可以实现各个用户进程自己独立的地址空间,


通过内存权限的检查可以保证每个进程使用的内存不被其他进程破坏。具体操作系统怎么运用MMU的就比较复杂了,我们只看看最原始的裸机程序怎么配置寄存器操作MMU建立虚拟地址到物理地址映射,了解其原理。


ARM提供4种映射长度:段(1M),大页(64K),小页(4K),极小页(1k)
按1M的长度映射就是说一段1M的虚拟地址映射一段1M的物理地址,这1M的地址访问权限是一样的,明显如果按1k,4k映射,内存访问权限将控制的更精细,当然也更复杂。


我们看看1M的精度怎么映射,假设要映射虚拟地址范围(0x0~0x4000000)到物理地址范围(0xB0000000~0xB4000000), 每0x100000的地址长度是1M,那么范围就是64M.
这个映射是以1M对齐的,就是要已(0x0~0x100000)这样映射,而不能(0x1~0x100001),可以看出虚拟地址和物理地址低20位变化是一样的,这样我们只需要一个4byte的内存空间存放每1M的虚拟地址右移20后与物理地址右移20位建立映射,总共4*64byte。代码大致如下:


unsigned long va = 0x0;
unsigned long pa = 0xB0000000;
while(va<0x4000000){
    ttb[va >> 20] = pa | 2;
     va += 0x100000;
     pa += 0x100000;
}


这样给定一个虚拟地址0x3000400,右移20作为ttb的index就可以找到其后12位对应的物理地址0xB3000000+0x400就是物理地址,当然这样运算是mmu自己做的,我们只需要把ttb的内存地址附给mmu的寄存器。上面的过程叫建立页表,页表建完后,启动MMU,我们操作的就是虚拟地址了。启动MMU是操作cp15协处理器,下面代码会有说明,了解下。


下面的例子我们用虚拟地址来点led.

#include "regs.h"

void (*uart_asm_putc)(int c) = 0x0202391c;
void (*uart_asm_putx)(int x) = 0x02023940;

#define GPM4CON (*(volatile unsigned int *)0xB10002E0)
#define GPM4DAT (*(volatile unsigned int *)0xB10002E4)

void init_ttb(unsigned long *ttb_base);
void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa);
void memset(char *buf, char ch, int size);
void led_blink(void);

void delay(volatile int time)
{
      for(; time > 0; time-- )
;
}

void main(void)
{    
    unsigned long c1_flags, ttb = 0x73000000;
    volatile int *p = 0x52345678;

    *p = 0x8;    

    init_ttb(ttb);
    mmap(ttb, 0x12345678, 0x52345678);
    mmap(ttb, 0xB10002E0, 0x110002E0);

    c1_flags = 1 | (1 << 3) | ( 1 << 11) | (1 << 28);

    __asm__ __volatile__ (
        "mvn r0, #0 n"            
        "mcr p15, 0, r0, c3, c0, 0n"

        "mcr p15, 0, %1, c2, c0, 0n" //configure ttb

        "mrc p15, 0, r0, c1, c0, 0n"
        "orr %0, r0, %0n"
        "mcr p15, 0, %0, c1, c0, 0n" //enable mmu
        :
        : "r" (c1_flags), "r" (ttb)
        : "r0"
    );

    p = 0x12345678;
    uart_asm_putc('r');
    uart_asm_putc('n');
    uart_asm_putc('c');
    uart_asm_putc('y');
    uart_asm_putc('j');
    uart_asm_putc(':');
    uart_asm_putx(*p);
    uart_asm_putc('r');
    uart_asm_putc('n');
     
       led_blink();
}

void init_ttb(unsigned long *ttb_base)
{
    unsigned long va, pa;

    memset(ttb_base, 0x00, 16 * 1024 );        

    for (va = 0x00000000; va < 0x10000000; va += 0x100000) { //Others
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    
    }

    for (va = 0x10000000; va < 0x14000000; va += 0x100000) { //SFR
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    
    }

    for (va = 0x40000000; va < 0x80000000; va += 0x100000) { //DRAM
        pa = va;
        ttb_base[ va >> 20] = (pa & 0xfff00000) | 2;    
    }
    
}

void mmap(unsigned long *ttb_base, unsigned long va, unsigned long pa)
{
    ttb_base[ va >> 20] = (pa & 0xfff00000) |  2;    
}

void memset(char *buf, char ch, int size)
{
    int i;
    for (i = 0; i < size; i ++)
        buf[i] = ch;
}

void led_blink(void)
{

unsigned long tmp = 0;
    int i = 0;

    /*
     *  GPM4_0-GPM4_3 设置为输出功能
     */
    tmp = GPM4CON;
    tmp &= ~0xffff;
    tmp |= 0x1111;
    GPM4CON = tmp;
    
    /*
     *  实现流水灯
     */
     while(1)
     {
        GPM4DAT = i;
        if (++i == 16)
              i = 0;
          delay(9999999);
     }
    
 }

代码位置:https://github.com/cyj1988jyc/luoji4412/

关键字:裸机程序  mmu 引用地址:4412裸机程序之mmu

上一篇:xynos4412裸机开发 —— A/D转换器
下一篇:tiny4412 裸机程序 八、重定位到DRAM及LCD实验

推荐阅读最新更新时间:2024-11-11 11:18

Mini2440裸机程序之ADC
源代码及注释 #define GLOBAL_CLK 1 #include stdlib.h #include string.h #include def.h #include option.h #include 2440addr.h #include 2440lib.h #include 2440slib.h #include mmu.h #include memtest.h #include Mylib.h #define LED1 (1 (5 * 2)) #define LED2 (1 (6 * 2)) #define LED3 (1 (7 * 2)) #define LED4 (1 (8 * 2)) #defi
[单片机]
Mini2440<font color='red'>裸机</font><font color='red'>程序</font>之ADC
26.核心初始化之关闭MMU和cache
下面看看ARM存储体系: 可以看到速度最快的是处理器和内部寄存器,他们的数量很少,价格很昂贵。接着是TCM紧耦合存储器:cache和main memory。速度最慢的是外部存储介质:Flash和SD卡等。 CACHE: 上面是两种访存的两种机制,一种是处理器直接访问主存,另一种是处理器-cache-主存。第一种中,处理器的速度相比主存是非常快的,所以两者的速度很不匹配。浪费了处理器的很多资源。第二种是为了改进第一种的缺陷,在处理器和主存之间增加了一种叫Cache的原件,cache的访问速度比主存快,比处理器慢了点,这样就缓和了第一种的资源浪费现象。 其实在cache里存放的是主存的一些数据的拷贝:当处理器要访问主存里的数据
[单片机]
26.核心初始化之关闭<font color='red'>MMU</font>和cache
tiny4412内核自带led驱动分析
内核版本:linux-3.5 平台:tiny4412 一、关于混杂设备 此版本内核led驱动使用的是混杂设备misc,具体misc.c的实现路径:linux-3.5/drivers/char/misc.c 这就很大程度简化了我们的驱动代码,没有发现ldd3中提到的各种字符设备注册函数,而是发现了一个misc_register函数(共用的注册函数),这说明led设备是作为杂项设备出现在内核中的,在内核中,misc杂项设备驱动接口是对一些字符设备的简单封装,他们共享一个主设备号,有不同的次设备号,共享一个open调用,其他的操作函数在打开后运用linux驱动程序的方法重载进行装载。 二、关于gpio: 查找tiny441
[单片机]
tiny<font color='red'>4412</font>内核自带led驱动分析
JLink V8初始化exynos4412脚本
/** ****************************************************************************** * @author Maoxiao Hu * @version V1.0.1 * @date Dec-2014 ****************************************************************************** * COPYRIGHT 2014 ISE of SHANDONG UNIVERSITY **************************************************
[单片机]
学习4412开发板烧写Ubuntu系统
本文转自迅为 平台:iTOP-4412开发板 Ubuntu文件系统有俩种,一种是支持LCD的,也就是7寸/9.7寸屏幕;另一种是支持HDMI输出的。 LCD 显示版本:iTOP4412_ubuntu_12.04_for_LCD_20141230.tar.gz HDMI 显示版本:iTOP4412_ubuntu_12.04_for_HDMI_20141230.tar.gz 想要支持对应的显示器,烧写对应的文件系统就可以,烧写方法是一样的。 在光盘的“05_镜像_Ubuntu文件系统”→“system”文件夹中有支持LCD的Ubuntu文件系统。 支持HDMI的Ubuntu文件系统在网盘”iTOP-4412开发板系统源码
[单片机]
学习<font color='red'>4412</font>开发板烧写Ubuntu系统
ARM920T的MMU与Cache之cache
ARM920T有16K的数据Cache和16K的指令Cache,这两个Cache是基本相同的,数据Cache多了一些写回内存的机制,后面我们以数据Cache为例来介绍Cache的基本原理。我们已经知道,Cache中的存储单位是Cache Line,ARM920T的一个Cache Line是32字节,因此16K的Cache由512条Cache Line组成。要了解Cache的基本原理,我们从如何设计Cache这个问题入手。 设计Cache的一种最朴素的想法是,把VA分成以32字节为单位,从任何一个对齐到32字节地址边界的VA开始连续的32个字节(比如0x00-0x1f,0x20-0x3f,0x40-0x5f等等)都可以缓存到5
[单片机]
ARM920T的<font color='red'>MMU</font>与Cache之cache
ARM协处理器CP15设置MMU,cache等学习
一直对协处理器CP15很恐惧,因为在网上基本上找不到中文的详细说明,现在找了一些ARM官方文档(ARM920T Technical Reference Manual)来看,准备对它做个了结。 协处理器CP15包含了如下寄存器。 ======================================================================== 在ARM920T Technical Reference Manual中有如下关键术语 2.3.1 Addresses in ARM920T Three distinct types of address exist in an ARM920T sy
[单片机]
TQ2440国嵌学院gboot-关闭MMU和Cache
在register 1寄存器中最后3位定义如下: 第0位可以关闭MMU 第1位可以关闭Data address check 第2位可以关闭Cache 当然你会说这里只关闭了Dcache,没有关闭Icache, 在register 1寄存器中第12位定义如下: 第12位可以关闭Icache,通常情况下,不对这一位做设定。 代码如下: disable_mmu: mcr p15,0,r0,c7,c7,0 mrc p15,0,r0,c1,c0,0 bic r0, r0, #0x00000007 mcr p15,0,r0,c1,c0,0 mov pc, lr
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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