ARM920T_内核MMU与cache应用分析

发布者:bin0990最新更新时间:2019-08-22 来源: 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应用分析

上一篇:ARM内存边界对齐以及sizeof问题
下一篇:S3C2440代码重定位分析

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

u-boot之ARM920T的start.S分析
cpu/arm920t/start.S程序步骤大致有以下几个 1、设置中断向量表 2、设置CPU模式为SVC32 mode并且关闭IRQ与FIQ中断 3、关闭看门狗 4、屏蔽所有中断 5、判断程序是否在RAM中运行如果不是的话则先关闭MMU再则需要初始化RAM。 6、设置堆栈准备在C函数中运行了 7、 跳转到C函数clock_init初始化系统时钟 8、跳转到C函数CopyCode2Ram将代码拷贝到RAM中 9、清零BSS段 10、跳转到_start_armboot运行,此时代码已经在RAM中运行了 11、IRQ中断与FIQ中断发生后的上下文处理 1、cpu/arm920t/sta
[单片机]
u-boot之<font color='red'>ARM920T</font>的start.S分析
AMD 3D V-Cache技术测试:延迟略增,处理器性能更强
1 月 16 日消息,AMD 3D V-Cache 技术已经研发多年,2021 年正式官宣。这项技术使用芯片堆叠技术,能够将 CPU 缓存容量提升数倍,在不改变核心面积的情况下大幅提高处理器性能。外媒 Chips and Cheese 对搭载 3D V-Cache 的 AMD 处理器进行了测试,测量了新款 EPYC 处理器与旧款的缓存延迟差异等。   外媒使用 AMD EPYC 7V73X(Milan-X)系列与旧款 EPYC 7763(Milan-X)处理器进行对比,前者配备 768MB L3 缓存,后者配备 256MB L3 缓存,仅为前者的三分之一。   EPYC 7V73X 拥有 64 核 128 线程,主频 2.
[手机便携]
AMD 3D V-<font color='red'>Cache</font>技术测试:延迟略增,处理器性能更强
uboot启动流程
uboot 的启动过程及工作原理 2.1 启动模式介绍 大多数 Boot Loader 都包含两种不同的操作模式: 启动加载 模式和 下载 模式,这种区别仅对于开发人 员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加 载模式与下载工作模式的区别。 启动加载(Boot loading)模式:这种模式也称为 自主 (Autonomous)模式。也即 Boot Loader 从目标机 上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显
[单片机]
ARM920T__MMU DOMAIN
ARM920T 内核,提供了16个 DOMAIN 来说明 不同规格的权限访问模式,很多人会问,为什么弄16个之多,才几个嘛,一个1M,一个1K,一个 4K页,一个64K页,开始我也是这么问的,但是后来看到了手册,再联想一下芯片设计的向后扩展,我能理解,有两个原因 1.这是因为为了做扩展,很有可能后面做出2K的页,或者8K的页,这不是不可能的,到时候保证兼容前面的系列那就是大问题了 2.一个规格可能有几种访问方式,可以修改相应的寄存器,就能switch A collection of sections, large pages and small pages of memory, which can have their acces
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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