S3C2440之MMU操作(MDK4.22)

发布者:滁州鱼儿最新更新时间:2016-06-12 来源: eefocus关键字:S3C2440  MMU操作  MDK4.22 手机看文章 扫描二维码
随时随地手机看文章
关于MMU知识:

1.ARM CPU上的地址转换过程涉及到了3个概念,虚拟地址VA,变换地址MVA,物理地址PA。当没有启动MMU的时候,CPU核,CACHE,MMU见到的都是PA。

启动MMU之后,CPU核对外发出VA,VA被转换为MVA,供给CACHE和MMU使用,MMU再将MVA转换为PA,最终找到真实的地址。

CPU看见的VA,CACHE和MMU看不见VA,看见的是MVA;设备只看到VA。

转换算法:如果VA<32M,那么使用进程PID来转换,PID通过CP15的C13读取。

if(VA<32M) then

MVA = VA | (PID << 25);

else

MVA = VA;                              //VA >= 32M

 

2.协处理器的cp15寄存器c2的31-14位存放一级页表的地址,一级页表有4096项,每项4字节,共16k,所以c2的0到13位不使用

若为段映射,只需要一级页表,每段1M,4096*1M=4G空间;若为页映射就需要二级页表,目标的物理页有大页,小页,极小页。

S3C2440之MMU操作(MDK4.22)
 

3.一级页表的描述符和二级页表描述符

S3C2440之MMU操作(MDK4.22)
 

注意到一级描述符是用来指引二级描述符的,除了段的直接指引到物理内存,若使用二级页表的话,那么二级页表类型有粗页表,细页表两种。

粗页表256项,每项指引真是内存为4K大小,本身占256*4=1k字节;细页表1024项,每项指引1k大小,本身二级页表占1024*4=4k字节。

所以注意到,若要对应真实物理页的大页的话,怎么办呢?利用粗页的话,需要16个粗页二级描述符;利用细页的话,需要64个二级描述符。

S3C2440之MMU操作(MDK4.22)
 

4段的转换举例

S3C2440之MMU操作(MDK4.22)
 

5内存访问权限问题

注意到一级页表中的描述符中有domain字段,4位,共16种情况

S3C2440之MMU操作(MDK4.22)
 

对应的为cp15中的c3寄存器设置。

00无访问权限,任何访问都会导致domain fault异常

01客户模式,使用段描述符,页描述符进行权限检查

10保留

11管理模式,不进行权限检查,运行任何访问

cp15中的c3 + domain + cp15寄存器c1中的R/S/A位 + 描述符AP共同决定访问权限

 

6TIB和Cache的作用

TLB是为了减轻页表访问所带来的访问内存负担,利用程序访问的局部性原理,选择高速且容量较小的存储器存储近期使用的页表条目。

一般做法:在启动MMU之前使无效整个TLB;更改页表表项的时候,使无效所涉及到的虚拟地址所对应到的TLB条目。

Cache的作用,在主存和CPU通用寄存器之间设置一个高速,容量相对较小的存储器。把正在执行的指令的附近一部分数据或者指令从主存调入这个

存储器,供CPU在一段时间内使用。Cache的(1)clean操作是将cache或writerbuffer已经脏的数据写入主存(2)invalidate不将数据写入主存,使之不能

再使用而已。

cp15的寄存器1的12位Icr位开启Icaches;第2位写1开启Dcaches;Writterbuffer和Dcache紧密结合,没有专门的控制为开启,停止它。

 

 

程序部分:

本程序将0-1M映射为本身,将0xa0000000~0xa000fffff映射为0x56000000~0x560ffffff,将0xb0000000~0xb3ffffff映射为0x30000000~0x3fffffff

涉及到代码文件有s3c2440.s文件,init.c文件,led.c文件,led.sct文件

s3c2440.s主要是调用一些初始化程序,init.c是初始化代码,led.c只是利用新的虚拟地址寻找gpio,点亮led。

编译器MDK4.22a

 

led.sct文件如下所示:

LR_ROM1 0x00000000 0x00200000  {    ; load region size_region
  NANDFLASH 0x00000000 0x00200000  {  ; load address = execution address
   *.o (initcode, +First)
   .ANY (+RO)
  }
}


LR_ROM2 2048 2048 {
  SDRAM 0xb0004000 {
   led.o (*)
  }
}

存在多个加载域,会产生多个bin,可以参见的另一篇文章讲到如何连接多个bin文件S3C2440开发工具realview MDK4.22使用入门

 

init.c文件:

//creat page table
void create_page_table(void)
{
#define MMU_FULL_ACCESS(3<<10)
#define MMU_DOMAIN(0<<5)
#define MMU_SPECIAL(1<<4)
#define MMU_CACHEABLE(1<<3)
#define MMU_BUFFERABLE(1<<2)
#define MMU_SECTION(2<<0)
#define MMU_SECDESC(MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL |\
MMU_SECTION)
#define MMU_SECDESC_WB(MMU_FULL_ACCESS | MMU_DOMAIN | MMU_SPECIAL |\
MMU_SECTION | MMU_CACHEABLE | MMU_BUFFERABLE)
#define MMU_SECTION_SIZE0x00100000

ulong virtualaddr, physicaladdr;
ulong *mmu_tlb_base = (ulong*)0x30000000;

/*<1>0~1M map to 0~1M  virtualaddr == physicaladdr*/
virtualaddr = 0;
physicaladdr = 0;


//mmu page table store at 0x30000000
//vritualaddr>>20 is index of mmu page table
*(mmu_tlb_base + (virtualaddr>>20)) = (physicaladdr&0xfff00000) | MMU_SECDESC_WB;

/*<2>0xa0000000~0xa000fffff map to 0x56000000~0x560fffff*/
virtualaddr = 0xa0000000;
physicaladdr = 0x56000000;
*(mmu_tlb_base + (virtualaddr>>20)) = (physicaladdr&0xfff00000) | MMU_SECDESC;


/*<3>0xb0000000~0xb3ffffff map to 0x30000000~0x33fffffff total=64m totaldescs=64*/
virtualaddr = 0xb0000000;
physicaladdr = 0x30000000;

while(virtualaddr < (ulong)0xb4000000)
{
*(mmu_tlb_base + (virtualaddr>>20)) = (physicaladdr&0xfff00000) | MMU_SECDESC_WB;
virtualaddr += MMU_SECTION_SIZE;
physicaladdr += MMU_SECTION_SIZE;
}
}




//init MMU
void mmu_init(void)
{
ulong ttb = 0x30000000;

__asm{
mov r0,#0
mcr p15,0,r0,c7,c7,0         //invalidate Icache Dcache

mcr p15,0,r0,c7,c10,4//drain writer buffer
mcr p15,0,r0,c8,c7,0        //invalidate TLB

mov r4,ttb
mcr p15,0,r4,c2,c0,0         //set page table base-addr

mvn r0,#0                    //invert all bits:0x0000000->0xffffffff
mcr p15,0,r0,c3,c0,0         //set domain(all is 0b11)


mrc p15,0,r0,c1,c0,0        //read control register

bic r0,r0,#0x3000
bic r0,r0,#0x0300
bic r0,r0,#0x0087

orr r0,r0,#0x0002
orr r0,r0,#0x0004
orr r0,r0,#0x1000
orr r0,r0,#0x0001

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

};
}

 
关键字:S3C2440  MMU操作  MDK4.22 引用地址:S3C2440之MMU操作(MDK4.22)

上一篇:S3C2440之IIS操作MDK
下一篇:S3C2440之中断操作(MDK4.22)

推荐阅读最新更新时间:2024-03-16 14:56

s3c2440 移值新内核 linux-4.1.36
arm-linuxgcc version 4.3.2 经过试验,最高可以编译到 linux-4.1.36 ,在高的版本会有错误 ,可能是 GCC 编译器版本较低造成。 解压比较麻烦还要装一个 xz xz -d ,我是用 7z-zip 在电脑上解好,传 tar 上去解包。 修改 makefile ARCH ?= arm CROSS_COMPILE ?= arm-linux- find -name *24*_defconfig 查找出来有的配置项 ./arch/arm/configs/s3c2410_defconfig ./arch/arm/configs/mini2440_defconfig s3c2410_defco
[单片机]
<font color='red'>s3c2440</font> 移值新内核 linux-4.1.36
S3C2440之IIS操作MDK
由图可知,有发送器,也有接收器,发送器和接收器都可以作为控制器。谁发出WS和SCK,谁就是控制器。 SCK为IIS串行数据的位时钟,WS为声道切换时钟,WS的频率等于采样频率fs。SCK频率=WS*每个数据的位数*通道数。 MSB先发送,由于收发对于字长的规定可以不一样,所以最终的长度需要根据实际情况而定。 2440具有64深度,且位长为16bit的FIFO。PCLK进过预分频A和B产生SCLK和LRCK。PCLK和MPLLin共同产生CDCLK,供给音频编码译码器使用。 因为2440的IIS接口仅仅是单纯的传输数据,依从IIS协议而已,实际使用中,需要将数据转换为模拟音频,或者将外界的音频转换为数字信号给
[单片机]
<font color='red'>S3C2440</font>之IIS<font color='red'>操作</font>MDK
s3c2440之IIS(4)S3C2440的I2S控制器
I2S音频总线学习(三)S3C2440的I2S控制器 一、I2S控制器结构框图 S3C2440A的Inter-IC Sound (IIS)总线接口作为一个编解码接口连接外部8/16位立体声音频解码IC用于迷你碟机和可携式应用。IIS总线接口支持IIS总线数据格式和MSB-justified数据格式。该接口对FIFO的访问采用了DMA模式取代了中断。它可以在同一时间接收和发送数据。 图1 结构框图 1 、总线接口,寄存器组和状态机(BRFC):总线接口逻辑和FIFO 访问由状态机控制。 2、5 位双预定标器(IPSR):一个预定标器用于IIS 总线接口的主时钟发生器,另外一个用作外部编解码时钟发生器。 3、64 位FIF
[单片机]
<font color='red'>s3c2440</font>之IIS(4)<font color='red'>S3C2440</font>的I2S控制器
基于S3C2440嵌入式系统主板的电磁兼容性设计
作者:许凯华,董淑云,刘玉华,胡立祥 华中师范大学  随着电子设备的频率越来越高,世界各国对电子产品电磁辐射标准的执行变得越来越严格,如何保证能在有限时间很好地在设计阶段发现并解决EMI/EMC问题非常重要,而PCB往往是一个电子系统的核心构成部分,一个经仔细电磁干扰设计的PCB板,能大幅度降低阻抗不匹配、传输线问题、信号互相耦合等现象引发的信号反射、延迟等线路不稳定因素,同时也可达到降低电磁辐射发射干扰,大大提高系统的稳定性和可靠性。本文将以嵌入式系统主板为平台,运用 EMIStream仿真软件,并采用源端串联端接阻抗的方法分析了解决嵌入式高速主板存在的电磁干扰问题。 1 电磁兼容性 1.1 电磁兼容和电磁干扰
[嵌入式]
S3C2440 块设备驱动程序的编写驱动之用内存模拟硬盘(二十一)
参考内核自带的块设备驱动程序: drivers/block/xd.c drivers/block/z2ram.c 1、本节需要的结构体如下: 1.1 gendisk磁盘结构体: struct gendisk { int major; //设备主设备号,等于register_blkdev()函数里的major int first_minor; //起始次设备号,等于0,则表示此设备号从0开始 int minors; //分区(次设备)数量,当使用alloc_disk()时,就会自动设备该成员 char disk_name ;//块设备名称,等于register_blkdev()函数里的name st
[单片机]
<font color='red'>S3C2440</font> 块设备驱动程序的编写驱动之用内存模拟硬盘(二十一)
S3C2440 外部按键中断解析
学习bootloader制作的过程中,学到 “通过按键进入中断控制LED亮灭”的实验时,自己所用的开发板和视频讲解中的不同,于是琢磨了一下中断涉及到的各个寄存器,并进行编码尝试,最终完成了实验,达到了通过按键以中断方式控制LED亮灭的目的。2440属于非向量中断方式,和6410、210的向量中断方式对于中断的处理有一些不同,因此本文的讲解并不完全适合6410和210。 一、概念 中断分为两大类:外部中断和内部中断。 1、外部中断:S3C2440的24个外部中断占用GPF0~GPF7(EINT0~EINT7)、 GPG0~GPG15(EINT8~EINT23)。使用这些引脚
[单片机]
<font color='red'>S3C2440</font> 外部按键中断解析
存储控制器和SDRAM 实验
S3C2440 存储控制器(memory controller)提供了访问外部设备所需的信号,这是一种通过总线形式来访问扩展的外设。 S3C2440 的存储器控制器有以下的特性: 支持小字节序、大字节序(通过软件选择) 每个BANK的地址空间为128MB,总共1GB(8 BANKs) 可编程控制的总线位宽(8/16/32 -bit),不过 BANK0 只能选择两种位宽(16/32 -bit) 总共8个BANK, BANK0 ~ BANK5 可以支持外接 ROM,SRAM等,BANK6 ~ BANK7 除可以支持 ROM,SRAM外,还支持SDRAM等; BANK0 ~ BANK6 共7个BANK的起始地址是固定的; BAN
[单片机]
存储控制器和SDRAM 实验
S3C2440裸机------Nor Flash原理及硬件操作
1. nandflash和norflash的区别 我们的nandflash上面只有8条数据线,在数据线上既传输命令又传输数据,但是我们的norflash和内存接口是一样的,有地址线和数据线,norflash可以像内存一样读,但是不能像内存一样写。如果norflash也能像内存那样写的话,那就比较容易被破坏,如果想写norflash,要发出某些特定的命令,需要做一些特殊的操作才能烧写norflash。下图是norflash和nandflash的区别。 2.norflash的操作 上图是norflash的命令, 如果想复位norflash,那么只需要向任意地址写入F0即可。 2.1 读id NOR手册上: 往地址555
[单片机]
<font color='red'>S3C2440</font>裸机------Nor Flash原理及硬件<font color='red'>操作</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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