MMU是内存管理单元,负责虚拟地址到物理地址的映射和内存访问权限检查。本文只讲地址映射,地址映射长度有段1MB、大页64KB、小页4KB、极小页1KB,本文只讲段1MB的情况,其它类似。我们每个进程的空间都是4G,不同的进程的变量地址有可能一样,这就是虚拟地址,其实它们对应到物理地址是不一样的。这种虚拟地址到物理地址的转换就是MMU做的事。所以开启MMU之后,cpu发出的地址就是虚拟地址,关闭MMU,cpu发出的地址就是物理地址,关闭MMU的时刻,一般是boot阶段。
首先要建立一张映射表,按1M映射的话,4G共有4096个1M的段,每个需要4字节存储映射的地址,所以映射表的大小是4096*4字节(即16k),映射表的地址放在内存起始地址0x30000000。比如要把GPB的寄存器0x56000000映射到0xA0000000,0xA000000/1M=2560,所以在映射表的2560*4地址,存放0x56000000。然后把表格的首地址,即0x30000000告诉MMU,启动MMU即可。后面操作虚拟地址0xA0000000就是操作物理地址0x56000000。
unsigned long *mmu_tlb_base = (unsigned long *)0x30000000;
/*
* 0x56000000是GPIO寄存器的起始物理地址,
* GPBCON和GPBDAT这两个寄存器的物理地址0x56000010、0x56000014,
* 为了在第二部分程序中能以地址0xA0000010、0xA0000014来操作GPBCON、GPBDAT,
* 把从0xA0000000开始的1M虚拟地址空间映射到从0x56000000开始的1M物理地址空间
*/
virtuladdr = 0xA0000000;
physicaladdr = 0x56000000;
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
MMU_SECDESC;
启动MMU的代码需要使用协处理器,需要了解arm核,暂不深入研究。
关键字:mini2440 硬件篇 MMU
引用地址:
mini2440硬件篇之MMU
推荐阅读最新更新时间:2024-03-16 15:22
ARM-I/Dcache, MMU关系
三者的配置关系: ICache | DCache | MMU | Allowed? ================================ Off | Off | Off | Yes On | Off | Off | Yes Off | On | Off | No Off | Off | On | Yes On | On | Off | No Off | On | On | Yes On | Off | On | Yes On | On | On
[单片机]
U-boot移植到mini2440上
本文章中的很多内容参考友善之臂的说明文档《mini2440之U-boot移植详细手册-20100419》,使用的U-boot的版本是u-boot-2010.03 说明:此次移植的目的不是为了制作一个功能强大的U-boot,只是做一个最简单的U_boot。该U-boot能够实现通过串口和电脑通信,可以将环境变量保存在NOR Flash中,通过TFTP服务器将使用NFS根文件系统的内核镜像从电脑拷贝到内存中执行。而且这个U-boot只支持从NOR中启动。 在移植U-Boot之前建议对U-Boot中的源码组织结构有较深的理解,可参考我的另一篇博文Bootloader介绍和Uboot源码结构 移植U-Boot的原则是,先选取与
[单片机]
mini2440通过dnw下载linux虚拟机的程序
先让linux虚拟机支持dnw传输 把链接里我已经编译好的dnw下载下来,放入linux的/usr/bin下就可以使用了 dnw使用方法 dnw是一个USB工具,通过USB发送文件给具有USB下载功能的bootloader。 命令本身的使用方法为(要发送成功,单板必须运行具有USB下载功能的bootloader): sudo dnw 意思为:它将文件通过USB口发送到单板上; 用来表示dnw想告诉开发板,这个文件想保存在的SDRAM地址; 可以不写 ,默认为0x30000000; bootloader会自己决定把文件保存在SDRAM哪里,是否使用 取决于bootloader。
[单片机]
Windows下u-boot-2011.03在Mini2440移植详解(5)
增加Nand Flash ECC的支持 又参考了网址http://blog.csdn.net/fulinus/article/details/8737129 修改相关文件: 1.u-boot-2011.03driversmtdnands3c2440_nand.c 2.u-boot-2011.03includeconfigsmini2440.h 一开始一直不能确定的是:nand- ecc.size 和nand- ecc.bytes到底是多少?板子上带的Nand Flash是:K9F1208U0B:64MB,8位。每1页包含512字节的main数据区和16字节的spare数据区。main区用于存储数据,spare区
[单片机]
S3C2416裸机开发系列六_MMU映射
S3C2416带有CP15协处理器,里面集成了16KB的I/D-Cache和MMU。MMU负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。笔者此处就MMU的使用作一个简单的介绍。 1. MMU映射时存储器访问 ARM CPU使用表格存储虚拟地址对应的物理地址,这类表格称为页表,页表由一个个条目组成,每个条目存储了一段虚拟地址对应的物理地址及其访问权限,或者下一级页表的地址。 当ARM要访问存储器时,根据MMU设定的一级页表基址(16KB对齐)以及虚拟地址一级页表索引 ,产生一个第一级描述符地址。MMU先查找TLB(转译查找缓存)中的虚拟地址表,如果是取指,则用指令TLB,否则用数据TLB。TLB的作用就是缓存之前
[单片机]
MINI2440启动配置文件/etc/init.d/rcS文件分析
Mini2440启动配置文件说明 对于mini2440,虽然root_qtopia这个文件系统的GUI是基于Qtopia的,但其初始化启动过程却是由大部分由busybox完成,Qtopia(qpe)只是在启动的最后阶段被开启。 由于默认的内核命令行上有init=/linuxrc, 因此,在文件系统被挂载后,运行的第一个程序是根目录下的linuxrc。这是一个指向/bin/busybox的链接,也就是说,系统起来后运行的第一个程序也就是busybox本身。这种情况下,busybox首先将试图解析/etc/inittab来获取进一步的初始化配置信息(参考busybox源代码init/init.c中的parse_inittab()函数
[单片机]
mini2440 uart串口实验(fifo模式+中断)
这次是S3C2440上面的uart0的FIFO模式的实验,程序设置串口0的输入fifo中包含的数据个数在从小于16字节的状态变换为大于等于16字节的状态的瞬间触发一个脉冲中断,在这个中断中,把输入fifo 中的数据全部写入到输出fifo中,在输出fifo 从非空状态变换成空的状态的瞬间会触发一个脉冲中断,在中断中我让灯闪一下,实验的正确现象是从超级终端往2440的串口0发数据,每发16个字节的数据,串口就会把这16个字节全部打印出来,同时由于输出fifo变空,会触发灯闪一下,经过测试,实验现象和上面说的是一致的。要注意在往utxh0寄存器写数据的时候要先检查输出fifo是不是已经满了,如果已经满了就要等待,否则会造成输出fifo对
[单片机]
初试mini2440 nandflash驱动移植
首先按照步骤修改相关信息之后执行make zImage出现了不少错误: 其中有代表性的错误如下: arch/arm/mach-s3c2440/mach-mini2440.c:189: error: array type has incomplete element type arch/arm/mach-s3c2440/mach-mini2440.c:190: error: array index in non-array initializer arch/arm/mach-s3c2440/mach-mini2440.c:190: error: (near initialization for 'smdk_default_
[单片机]