您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > ARM9存储器结构总结
ARM存储器结构ARM存储器:片内Flash、片内静态RAM、片外存储器映射就是一一对应的意思。重映射就是重新分配这种一一对应的关系。我们可以把存储器看成一个具有输出和输入口的黑盒子。输入量是地址,输出的是对应地址上存储的数据。当然这个黑盒子是由很复杂的半导体电路实现的,具体的实现的方式我们现在不管。存储单位一般是字节。这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。普通的单片机把可执行代码和数据存放到存储器中。单片机中的CPU从储器中取指令代码和数据。其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的,UGGboots。而ARM比较复杂,ARM芯片与普通单片机在存储器地址方面的不同在于:ARM芯片中有些物理存储单元的地址可以根据设置变换。就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了(这就是后面要说的重新映射)。例如将0x00000000地址上的存储单元映射到新的地址0x00000007上。CPU存取0x00000007就是存取0x00000000上的物理存储单元。(随便举的例子为了说明道理,没有实际意义)存储器重新映射(MemoryRe-Map)存储器重新映射是将复位后用户可见的存储器中部分区域,再次映射到其他的地址上。存储器重新映射包括两个方面:1、BootBlock重新映射(关于BootBlock的相关内容看我博客中的另一篇文章)。2、异常(中断)向量重新映射BootBlock重新映射:本来BootBlock在片内Flash的最高8KB,但是为了与将来期间相兼容,生产商为了产品的升级换代,在新型芯片中增加内部Flash容量时,不至于因为位于Flash高端的BootBlock的地址发生了变化而改写其代码,整个BootBlock都要被重新映射到内部存储器空间的顶部,即片内RAM的最高8KB。(地址为:0x7FFFE000~0x7FFFFFFF)异常(中断)向量重新映射:本来中断向量表在片内Flash的最低32字节,重新映射时要把这32个字节再加上其后的32个字节(后面这32个字节是存放快速中断IRQ的服务程序的)共64个字节重新映射(地址为:0x00000000~0x0000003F)重新映射到的地方有三个:内部Flash高端的64字节空间、内部RAM低端的64字节空间和外部RAM低端的64字节空间,再加上原来的内部Flash低端的64字节空间,异常向量一共可以在四个地方出现。为了对存储器映射进行控制,处理器设置了存储器映射控制寄存器MEMMAP,其控制格式如下图所示:注:1、当MEMMAP[1:0]=00时是映射到内部Flash高端,同内部Flash高端的BootBlock一起又被映射到了内部RAM高端2、当MEMMAP[1:0]=01时相当于没有重新映射,异常向量表在内部Flash低端3、当MEMMAP[1:0]=10时映射到了内部RAM的低端4、当MEMMAP[1:0]=11时映射到了外部RAM低端首先说一下,S3C2440存储器空间并不包括NANDFLASH,NANDFLASH只是一个外设而已。S3C2440存储器控制器的寻址范围是0~0x3fffffff,共1G。这1G空间分为8个BANK,BANK0~BANK7。在产品开发阶段,一般使用BANK0控制NORFLASH,BANK6控制SDRAM;对于成品,则会去掉NORFLASH,而将固件放在NANDFLASH上,SDRAM不变。对于代码存储,如NORFLASH,是没有必要访问到具体字节;而对于SDRAM,因为可能保存有字节变量,必须得支持访问到字节。这里就说一下,在32位总线宽度下,存储器控制器是如何访问SDRAM的字节的。比如,使用两片16位的SDRAM组成32位宽度的数据总线。S3C2440的地址线A0、A1不再使用,S3C2440提供了DQM0、DQM1、DQM2和DQM3来选通某个字节(猜想:DQM0、DQM1、DQM2和DQM3是由A0、A1经内部译码器而得,这样可以节省外部元件)。再把SDRAM的行、列地址展开,再加上SDRAMBANK的选择线,其实SDRAM就完全可以看做一片SRAM了。1、S3C2440A的存储器管理器提供访问外部存储器的所有控制信号2、27位地址信号、32位数据信号、8个片选信号、以及读/写控制信号等3、总共有8个存储器bank(bank0—bank7)bank0---bank5为固定128MB;bank6和bank7的容量可编程改变,可以是2、4、8、16、32、64、128MB;最大共1GB4、bank0可以作为引导ROM其数据线宽只能是16位和32位,其它存储器的数据线宽可以是8位、16位和32位5、7个固定存储器bank(bank0-bank6)起始地址bank7的开始地址与bank6的结束地址相连接,但是二者的容量必须相等6、所有存储器bank的访问周期都是可编程的7、支持SDRAM的自刷新和掉电模式8、支持大小端(软件选择)我们知道,在32位机器上linux操作系统中的进程的地址空间大小是4G,其中0-3G是用户空间,3G-4G是内核空间。其实,这个4G的地址空间是不存在的,也就是我们所说的虚拟内存空间。也就是说,我们不论我们运行a.out程序多少次这些地址都是一样的。我们知道,linux操作系统每个进程的地址空间都是独立的,其实这里的独立说得是物理空间上得独立。当一个程序被执行时,该程序的内容必须被放到进程的虚拟地址空间,对于可执行程序的共享库也是如此。可执行程序并非真正读到物理内存中,而只是链接到进程的虚拟内存中。当一个可执行程序映射到进程虚拟地址空间时,一组vm_area_struct数据结构将被产生。每个vm_area_struct数据结构表示可执行印象的一部分;是可执行代码,或是初始化的数据,以及未初始化的数据等。一、S3C2440存储控制器如果大家写过S3C2440的ARM裸机程序都应该知道通常SDRAM的起始地址是0X30000000,但是大家有没有想过为什么呢?下面我将给大家做一个简要的介绍。查S3C2440的手册可知S3C2440可寻址1G的地址范围,但是S3C2440的地址线只有27根,理论上只能寻址2的27次方等于128M的地址范围。于是S3C2440通过一个叫BANK的东东解决了这个问题。S3C2440引出了8根BANK线(对应nGCS0~nGCS7),通过这个8根线来选通和关闭不同的存储器,这样S3C2440最多就可以连接8个128M的存储器,只要在某一时刻只选通一个BANK就可以实现1G的寻址空间每个BANK有个地址,对该BANK地址的访问实际上就是选通该BANK,于是ARM核只要发出一个地址,然后S3C2440的储存控制器只要把该地址解释成两部分:一部分是BANK地址一部分是连接到该BANK存储器内部的地址就可以访问了。而作为32位的CPU,可以使用的地址范围理论上可以达到2的32次方等于4G,除去上述的1G地址空间,还有一部分是CPU内部寄存器的地址,剩下的地址空间没有使用。下面我们来看到S3C2440存储器的地址空间分布图左边的是表示CPU从NORFLASH启动时的地址空间图,右边是CPU从NANDFLASH启动时的地址空间图。从图中可以看出SDRAM接在BANK6上面,地址为0X30000000,这就解释了开始最开始的那个问题。问题又来了为什么CPU从NAND和NOR启动时地址空间不同?这是因为NOR是线性结构,跟普通的内存差不多,它接在BANK0上。而NAND则是另外一种结构,S3C2440有专用的NAND控制器和地址线来连接,它不能接在BANK0上。CPU启动时必定从0地址开始执行程序,而从NAND启动时,0地址没有存储器,那CPU怎么办呢?于是就出现了一种叫“起步石”(steppingstone)的东东,它是S3C2440内部的一块4K的存储器,当从NAND启动时,0地址线会连接到起步石上面,同时CPU会通过内部的硬件将NANDFLASH开始的4K数据复制到起步石里面。起步石里面的程序一般设计为对SDRAM进行初始化,然后将NAND里面的部分程序复制到SDARM,然后跳到SDRAM开始执行程序。所以当做U-BOOT移植使其支持从NAND的启动时,需要对NAND的前4K程序做处理。下面我们再来看看S3C440存储控制器一般所接外设的访问地址和部分寄存器的访问地址二、S3C2440MMU1.MMU的作用我们再第一部分讨论的全部都是物理地址,注意不要与这部分要将的虚拟地址给混淆起来。内存管理单元(MemoryManagerUnit)简称MMU。它负责将虚拟地址转换成物理地址,然后传给上部分介绍的存储管理器进行寻址。现代的多用户多进程操作系统通过MMU使各个用户进程都有自己的独立的地址空间:地址映射功能使得每个进程拥有“看起来”一样的地址空间,而内存访问权限的检查可以保护每个进程所用的内存不会被其他进程破坏。我来打个蹩脚的例子。甲同学(进程甲)去一个图书管理员那儿去借名为“内存”的一本书,说他7点钟要用。图书管理员给甲同学一个牌子上面写着哪个层楼房哪个房间有这本书,不过这块牌子只能7点钟去取书,且只能借三个小时(权限),而乙同学同样要借这本书不过是12点,图书馆同样给乙同学一块牌子,不同的时这块牌子只能12点钟去取书也只能借三个小时。结果是甲乙同学都借到了这本书,他们都感觉拥有了这本书,在他们拥有这本书的期间不会被其他同学打扰。实际上这里的同学就代表进程,图书管理员代表是内核,牌子代表的是虚拟地址,书代表实际的内存,而MMU完成的工作就是拿到同学的牌子帮同学找到书的过程。虚拟地址最终要转成物理地址才能读写实际的数据,这通过将虚拟地址空间、物理地址空间划分为一个同样大小的一块块小空间,然后为着两类小空间建立映射空间,有可能多块虚拟地址映射到同一块物理地址空间,或者有些虚拟地址空间映射具体物理地址空间上去。启动MMU后,CPU对外发出虚拟地址,然后MMU将虚拟地址转成物理地址再进行访问。2.虚拟地址空间到物理空间的转换过程在ARMCPU中使用页表的方式进行转换。linux内核一般使用两级页表的方式。页表是个什么东东,他就像我们的书上的目录,有主目录,次目录。当我们要找一个知识点的时候先找到主目录,然后再找到次目录再找到相应的知识点。每一个进程都会在内存里面创建一个目录,目录的存放地址保存起来。当需要访问目录时,就会将目录放到CPU的一个专用寄存器里面,然后MMU读取这个寄存器里面的值就会帮我们找到我们要访问的物理地址。页表是怎样建立的呢?实际上它就是在内存的一个地址内存放了第一级目录的内存地址,然后在第一个级的目录的内存内又存放了实际的物理地址。椐了解NORFLASH是容量小,速度快,稳定性好,适合做程序存储器。NANDFLASH总容量大,适合做数据存储器是不能从NANDFLASH启动的,NANDFLASH是的读写时序是不能直接有ARM硬件产生的,要读写NANDFLASH是要通过程序来实现的,很明显能看出来的就是NANDFLASH只有8个数据、地址复用的数据地址接口2410/2440可以直接从NANDFLASH启动的,因为它把NAND前面的4K映射到了RAM的空间NORFLASH地址线和数据线分开,来了地址和控制信号,数据就出来。NANDFlash地址线和数据线在一起,需要用程序来控制,才能出数据。通俗的说,就是光给地址不行,要先命令,再给地址,才能读到NAND的数据。而且都是在一个总线完成的。结论是:ARM无法从NAND直接启动。除非装载完程序,才能使用NANDFlash.装载程序只能从maskrom或者Norflash.三星的2410可以从NF启动程序,它会把第一块的前4KB复制到内部SRAM中,然后从SRAM执行,也就是说,你需要编写一个长度小于4K的引导程序,作用是将主程序拷贝到SDRAM中运行(NF地址不是线性的,程序不能直
本文标题:ARM9存储器结构总结
链接地址:https://www.777doc.com/doc-3385982 .html