历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2019年08月22日 | ARM920T_内核MMU与cache应用分析

发布者:bin0990 来源: eefocus关键字:ARM920T  内核MMU  cache 手机看文章 扫描二维码
随时随地手机看文章

一、cache分类及应用场合

cache是内存和CPU之间的高速缓冲存储器,其分为icache(指令缓存)和dcache(数据缓存)。如果开启了cache,当CPU运行时会将正在运行的指令地址附近的指令或者数据调入cache,这样当运行下一条指令或用到下一条数据时直接从cache中查找,如果查找不到再访问内存,以此加快CPU执行速度。icache可以直接开启,而dcache需要开启MMU之后才能开启。


在启动文件中开启icache的代码可以放在时钟速度配置完成之后,代码如下:


    bl enable_icache

 

enable_icache:

    mrc p15, 0, r0, c1, c0, 0

    orr r0, r0, #(1<<12)

    mcr p15, 0, r0, c1, c0, 0

    mov pc, lr

二、MMU的应用

当CPU执行小的应用程序时,只要代码大小在芯片存储容量范围内,CPU每次都可以直接访问内存执行指令,但是当代码很大超出芯片存储容量时,则不能运行。此时需要MMU(内存管理单元),MMU可以将物理地址重映射,开启MMU之后CPU每次访问的都是虚拟地址,而每一个虚拟地址或者多个虚拟地址对应一个物理地址。32位的CPU虚拟地址范围为4G,映射方式为在物理存储地址上建立映射表。每个表有多个条目,每个条目大小1M,所以表的大小为:    条目数 = 4G/1M = 4096 ,一个条目32位占4Byte, 表大小 = 4096 * 4Byte = 16KB。因而只要在nand上占据16KB的空间即可重映射4G的访问范围。


CPU发出的VA(虚拟地址)经过CP13的C13转换为MVA(modified virtual address),MMU所看到的地址其实是MVA,通常外在来看不加以细分,权当VA处理。MMU常用section转换方式进行虚拟地址到物理地址的转换,其格式如下:

高12位为PA(物理地址)的高12位,AP设置访问权限(常设置为11,特权模式/用户模式下可读可写,所有模式下允许任何访问),domain(域设置,arm9有16个域,此处设置0选择域0),C(是否开启cache),B(是否开启Write buffer),其他位用默认值。


重映射代码如下:


#define MMU_SECDESC_AP      (3<<10)

#define MMU_SECDESC_DOMAIN  (0<<5)

#define MMU_SECDESC_NCNB    (0<<2)

#define MMU_SECDESC_WB      (3<<2)

#define MMU_SECDESC_TYPE    ((1<<4) | (1<<1))

 

#define MMU_SECDESC_FOR_IO   (MMU_SECDESC_AP | MMU_SECDESC_DOMAIN | MMU_SECDESC_NCNB | MMU_SECDESC_TYPE)

#define MMU_SECDESC_FOR_MEM   (MMU_SECDESC_AP | MMU_SECDESC_DOMAIN | MMU_SECDESC_WB | MMU_SECDESC_TYPE)

 

 

#define IO  1

#define MEM 0

 

void create_secdesc(unsigned int *ttb, unsigned int va, unsigned int pa, int io)

{

int index;

 

index = va / 0x100000;

 

if (io)

ttb[index] = (pa & 0xfff00000) | MMU_SECDESC_FOR_IO;

else

ttb[index] = (pa & 0xfff00000) | MMU_SECDESC_FOR_MEM;

}

 

/* 

 *    VA           PA           CB

 *    0            0            00

 *    0x40000000   0x40000000   11

 *

 *    64M sdram:

 *    0x30000000   0x30000000   11

 *    ......

 *    0x33f00000   0x33f00000   11

 *    

 *    register: 0x48000000~0x5B00001C

 *    0x48000000   0x48000000   00

 *    .......

 *    0x5B000000   0x5B000000   00

 *

 *    Framebuffer : 0x33c00000

 *    0x33c00000   0x33c00000   00

 *

 *    link address:

 *    0xB0000000   0x30000000   11

 */

void create_page_table(void)

{

/* ttb: translation table base */

unsigned int *ttb = (unsigned int *)0x32000000;

 

unsigned int va, pa;

int index;

 

/* 2.1 for sram/nor flash */

create_secdesc(ttb, 0, 0, IO);

 

/* 2.2 for sram when nor boot */

create_secdesc(ttb, 0x40000000, 0x40000000, MEM);

 

/* 2.3 for 64M sdram */

va = 0x30000000;

pa = 0x30000000;

for (; va < 0x34000000;)

{

create_secdesc(ttb, va, pa, MEM);

va += 0x100000;

pa += 0x100000;

}

 

/* 2.4 for register: 0x48000000~0x5B00001C */

va = 0x48000000;

pa = 0x48000000;

for (; va <= 0x5B000000;)

{

create_secdesc(ttb, va, pa, IO);

va += 0x100000;

pa += 0x100000;

}

 

/* 2.5 for Framebuffer : 0x33c00000 */

create_secdesc(ttb, 0x33c00000, 0x33c00000, IO);

 

/* 2.6 for link address */

create_secdesc(ttb, 0xB0000000, 0x30000000, MEM);

}

启动文件中代码如下:


/* 创建页表 */

bl create_page_table

 

/* 启动MMU */

bl mmu_enable

 

 

mmu_enable: 

/* 把页表基址告诉cp15 */

ldr r0, =0x32000000

mcr p15, 0, r0, c2, c0, 0

 

/* 设置域为0xffffffff, 不进行权限检查 */

ldr r0, =0xffffffff

mcr p15, 0, r0, c3, c0, 0

 

/* 使能icache,dcache,mmu */

mrc p15, 0, r0, c1, c0, 0

orr r0, r0, #(1<<12)  /* enable icache */

orr r0, r0, #(1<<2)  /* enable dcache */

orr r0, r0, #(1<<0)  /* enable mmu */

mcr p15, 0, r0, c1, c0, 0

 

mov pc, lr

有几个需要注意的关键点:


1. 由于代码重定位脚本中将nand中的代码重定位至0xB0000000,所以应该在重定位之前MMU进行地址的重映射,将0XB0000000映射到0X30000000,也就是nnad启动时SDRAM的起始地址,有关重定位参考此链接S3C2440代码重定位分析


2.在makefile时注意将mmu.c放至靠前的位置,必须在nand的前4K范围完成地址重映射,代码重定位,否则芯片将直接无法启动。


3.当使用NOR启动时,0地址映射时不能开启cache和write buffer。


代码重定位脚本:


SECTIONS{

. = 0xB0000000;

__code_start = .;

. = ALIGN(4);

.text  : {*(.text)}

. = ALIGN(4);

.rodata : {*(.rodata)}

. = ALIGN(4);

.data  : {*(.data)}

. = ALIGN(4);

__bss_start = .;

.bss : { *(.bss) *(.COMMON) }

_end = .;

}

关键字:ARM920T  内核MMU  cache 引用地址:ARM920T_内核MMU与cache应用分析

上一篇:第一页
下一篇:S3C2440代码重定位分析

推荐阅读

视频监控步入IP网络监控时代随着安防系统的发展,视频监控系统经历了从第一代百分之百的模拟系统(VCR),到第二代部分数字化的系统(DVR),再到第三代完全数字化的系统(网络摄像机和视频服务器)三个阶段的发展演变。与之相对应的,视频监控技术发展至今经历了:第一代模拟视频监控系统(CCTV)、第二代基于“PC+多媒体卡”数字视频监控系统(DVR)、...
在本文中,从事汽车移动和汽车技术投资的Firstmile解码了自动驾驶全景观。Firstmile是专注于支持下一代具有资本、深领域专业知识和强大工业网络的欧洲移动技术公司。这项研究报告由 Markus Ferres 和 Jens PhilippKlein 撰写。 今年 7 月,两家汽车巨头福特和大众宣布将扩大在美国和欧洲的电动汽车和自动驾驶汽车的全球联盟。这标志着一个新时代的...
自2018年中美贸易摩擦开始以来,“自主可控、国产替代”等口号,成为了半导体行业的发展主旋律,一些优秀的国内企业也开始在市场中崭露头角,进军资本市场的企业也越来越多。据集微网统计,在科创板开市一周年之际,已有20家半导体企业在科创板上市,另有超过27家半导体企业处于上市进行时,企业类型涵盖芯片设计、制造、封测、材料以及设备等领域,其中以...
据外媒报道,随着苹果正在研究一种“附件系统”,甚至Apple Music的框架也可能是这样连接在一起的,Apple Watch上巧妙的末端链接可能会被应用到更多的设备上。Apple Watch表带的设计是革命性的,最近公布的一项专利申请希望将其扩展到其他用途。  虽然是最新披露的,但这项专利申请的历史可以追溯到2015年,最初可以认为只是关于Apple Wat...

史海拾趣

问答坊 | AI 解惑

《DSP实时多任务操作系统》

关于DSP实时多任务操作系统在国外已经广为大家应用,但在国内大家迟迟接受不了这种基于DSP操作系统的概念,往往被基本输入输出BIOS所困扰,大家可以想想:为什么计算机上有了主板的BIOS,还需要一个DOS和windows?有专家认为:在未来的几年内,DSP系 ...…

查看全部问答∨

音频处理初步

一、音频媒体的数字化处理   随着计算机技术的发展,特别是海量存储设备和大容量内存在PC机上的实现,对音频媒体进行数字化处理便成为可能。数字化处理的核心是对音频信息的采样,通过对采集到的样本进行加工,达成各种效果,这是音频媒体数字 ...…

查看全部问答∨

风河公司发布商用Android开发开台

嵌入式软件专家Embedded software specialist 风河公司(Wind River) 宣布为Andrors移动手机厂商提供商用的商用开发平台OEM服务。根据风河公司称,这个平台非常稳定,因为Android源代码经过了广泛的测试。   风河公司在他的商用开发平台中集成 ...…

查看全部问答∨

搭建Android开发环境 ZT

如何搭建Android开发环境谷歌官网上有详细的介绍,这里主要给出一些简要提示,更多细节可参考http://code.google.com/android/intro/installing.html Supported Operating Systems: Windows XP or Vista Mac OS X 10.4.8 or later (x86 only) Lin ...…

查看全部问答∨

uCOS-II在车载GPS移动终端中的应用

一、             统概述 目前市场上的商用嵌入式系统产品,如Vxwork、PSOS和Windows CE等已经十分成熟,提供有力的开发和调试工具,但开发成本昂贵,而uCOS-II是一种多任务实时操作系统,内核源代码公开 ...…

查看全部问答∨

关于iar仿真msp430的问题

请问各位大侠,IAR能仿真msp430单片机串行口通讯吗?如果能请帮我查查程序哪里错了. #include<msp430x14x.h> void main( void ) {   char m=0;   int i[25]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21, ...…

查看全部问答∨

关于GPRS数据中心开发疑问??

现在在做GPRS数据中心,我们采用的是GPRS专线接入方式,连接数据中心,我用的是TCP/IP协议;每个DTU都有固定IP;现在只有我一个人做,特请教大家; 1)数据中心是客户端,采用轮询方式,采集DTU数据;可我在很多GPRS公司提供的应用案例中,他们都是把数据中心 ...…

查看全部问答∨

串口1发给串口0可以,反过来就不行,为什么

求助阿,兄弟姐妹们,能帮帮我吗? interrupt[UART1RX_VECTOR] void usart1_rx (void) { while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready? TXBUF0 = RXBUF1;// RXBUF1 to TXBUF0 } 以上串口0是可以正常收到串口1的数据的, in ...…

查看全部问答∨

LPC1768 ~I2C使用問題

各位先進好~    小弟最近入手MCB1700,想使用P0.19與P0.20的I2C    keil範例中並無I2C的簡單範例,我找NXP提供的source(如附件)    打開官方example,並使用示波器量測P0.20&P0.19並無CLK與DATA出 ...…

查看全部问答∨

上位机软件类编写心得

开发上位机软件的语言有很多,为何偏偏选中了.NET呢,主要是因为这个语言开发上位机软件相当方面而且微软提供了大量的类库和API。虽然底层实现代码不像JAVA一样可以开源的,但是这个不影响这门语言的推广,试问有几个人会真正意义上去研究底层的代 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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