ARM地址重映射的通俗解释
- 格式:pdf
- 大小:527.50 KB
- 文档页数:11
对于刚刚学习ARM嵌入式的人来说,遇到的第一个难点我觉得就是地址映射的原理,往往会被一些概念弄得稀里糊涂(比如像我这种智商不高的)。
所以就静下心自己好好研读了以下杜春雷《ARM体系结构与编程》有关MMU和地址映射的讲解,个人感觉写得比较清晰,以下是自己在读的时候理解的内容,如有不正,请指出!对于32为ARM处理器,最大寻址空间为4GB(2^32),但是物理空间并没有配置到这么大,所以对于VA来说,其地址为0x00000000~0xFFFFFFFF,对于PA来说,其地址应小于或等于0xFFFFFFFF。
地址映射原理:把虚拟地址划分为一定大小空间的存储块,同样,物理空间也划分为同样大小的块。
然后,依照存储块的大小,可分为:1、段(1MB)2、大页(64KB)3、小页(4KB)4、极小页(1KB)第一种称为段模式,后面三种称为页模式这些映射,都是通过页表实现的,页表又可可以分为:一级页表(用于段模式)二级页表(用于页模式)什么是页表呢?页表就是存储在内存中(会被拷贝到SDRAM中存放,以供MMU查询),用于表示VA与PA的映射关系的一个表格。
表格中每项称为条目,条目里的内容称为描述符(段描述符和页描述符)。
段模式:以段模式映射时,因为VA大小位4GB,段模式每个条目表为1MB大小的空间,所以全映射时,条目总数(全映射时页表所占内存空间)=4GB / 1MB =4096条(每条32位,即4字节,共4 KB)。
其中,所谓的每个条目大小为1MB,意思是,CPU发出的一段地址范围为1MB的VA (假如0x00000000~0x000FFFFF),这一段VA经过MMU变换,都会索引(查找)到同一个条目。
该条目再次结合VA(PA的[19:0]位,称为段内地址偏移量),形成真正的PA地址。
具体请看下图对于段模式,其只需要使用一级页表。
页表中,条目中存储的描述符格式如下:1、段基址:在设计地址映射时,要映射的物理地址要1MB对齐,段基址就是这段1MB物理地址起始地址的高[31:20]位,每个条目中的描述符的段基址都不一样(以段来说,相差1MB)。
关于地址重映射1、通俗解释ARM芯片的地址重映射映射就是一一对应的意思。
重映射就是重新分配这种一一对应的关系。
我们可以把存储器看成一个具有输出和输入口的黑盒子。
如下图所示,输入量是地址,输出的是对应地址上存储的数据。
当然这个黑盒子是由很复杂的半导体电路具现的,具体的实现的方式我们现在不管。
存储单位一般是字节。
这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。
图1普通的单片机把可执行代码和数据存放到存储器中。
单片机中的CPU从储器中取指令代码和数据。
其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。
如下图,CPU读取0x00000000地址上存储单元的过程。
图 2ARM比较复杂。
ARM芯片与普通单片机在存储器地址方面的不同在于:ARM 芯片中有些物理存储单元的地址可以根据设置变换。
就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了。
图3是随意举了个例子(不要与ARM芯片对应),旨在说明地址重映射的过程。
图3表示把 0x00000000地址上的存储单元映射到新的地址0x00000007上。
CPU 存取0x00000007就是存取0x00000000上的物理存储单元。
图 3下面图4,图5是对ARM芯片的两种地址重映射方式的图示。
假设我们的应用程序存放在外扩 FLASH当中,那么应用程序的异常向量表就存放在0x80000000起始的64个(其中有32个存放异常向量)物理存储单元中。
但是ARM核发生异常(中断)后是从 0x00000000~0x0000003F地址范围取异常向量的。
所以要把0x80000000~0x8000003F范围内的存储单元重新映射到0x00000000~0x0000003F地址范围上。
以后CPU存取0x00000000~0x0000003F地址就是存取 0x80000000~0x8000003F范围内的存储单元。
几乎每一种外设都是通过读写设备上的寄存器来进行的。
外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。
CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。
而具体采用哪一种则取决于CPU 的体系结构。
有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。
在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。
此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。
这就是所谓的“内存映射方式”(Memory-mapped)。
而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。
这是一个与CPU地RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。
CPU通过设立专门的I/O指令(如X86的IN和OUT指令)来访问这一空间中的地址单元(也即I/O端口)。
这就是所谓的“I/O 映射方式”(I/O-mapped)。
与RAM物理地址空间相比,I/O地址空间通常都比较小,如x86 CPU的I/O空间就只有64KB(0-0xffff)。
这是“I/O映射方式”的一个主要缺点。
===========================================以上描述中“外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分”应该如何理解?这个I/O端口被映射到内存后,是在内存中有一个I/O端口的“镜像”吗(就是说I/O本身的寄存器地址和映射到内存后的端口地址是分开的,只是关系上存在一个对应而已)?还是说I/O端口本身和物理内存一起被编码为连续的“CPU识别的地址”(即CPU将物理内存编码后接着将I/O地址也跟着编码,内存地址和I/O地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。
单片机重映射随着科技的发展和应用的广泛,单片机(Microcontroller)在各个领域中得到了广泛的应用。
单片机重映射(Remapping)是指将单片机的引脚或者功能进行重新分配和配置,以满足特定应用需求的一种技术手段。
通过单片机重映射,可以使单片机具备更多的功能和扩展性,提高系统的灵活性和效率。
单片机重映射涉及到对单片机的引脚和功能进行重新配置,使其能够适应不同的应用场景。
在单片机设计中,通常会有一些功能模块或引脚需要被多个外设所共享,而这些外设可能需要在不同的时间段内使用。
为了解决这个问题,就需要对单片机进行重映射,将不同的功能或引脚分时使用,从而实现多个外设的共享。
单片机重映射的具体实现方法可以有多种,比较常见的有软件重映射和硬件重映射两种方式。
软件重映射是通过软件编程的方式实现的,通过对单片机的寄存器进行设置和配置,将某个引脚或功能从一个外设映射到另一个外设。
软件重映射的优点是灵活性高,可以根据需要随时进行配置和修改。
但是,软件重映射的缺点是需要占用额外的处理器资源和时间,并且可能会影响系统的实时性能。
硬件重映射是通过硬件电路的方式实现的,通过对单片机的引脚进行物理连接和切换,将某个引脚或功能从一个外设映射到另一个外设。
硬件重映射的优点是实时性好,不会影响系统的性能和时序要求。
但是,硬件重映射的缺点是配置和修改比较困难,需要设计和制造专门的硬件电路。
单片机重映射的应用非常广泛。
在嵌入式系统中,由于单片机的引脚和功能资源有限,需要通过重映射来实现多个外设的共享。
比如,一个单片机可能需要同时连接多个传感器、执行器和通信模块,通过重映射可以将不同的功能映射到不同的引脚上,从而实现多个外设的并行工作。
在工业控制系统中,单片机重映射也发挥着重要的作用。
工业控制系统通常需要连接大量的传感器、执行器和通信设备,通过重映射可以将不同的功能映射到不同的引脚上,从而实现系统的灵活配置和扩展。
单片机重映射还可以用于汽车电子、医疗设备、智能家居等领域。
什么叫地址映射地址映射 -…… 为了保证CPU执⾏指令时可正确访问存储单元,需将⽤户程序中的逻辑地址转换为运⾏时由机器直接寻址的物理地址,这⼀过程称为地址映射.地址映射最⼩单位为1页,4K⼤⼩,所以len值最⼩为:0x00001000.地址映射分类:地址映射也可以成为地址重定位或地址变换,可以分为以下两类:静态重定位当⽤户程序被装⼊内存时,⼀次性实现逻辑地址到物理地址的转换,以后不再转换(⼀般在装⼊内存时由软件完成).动态重定位在程序运⾏过程中要访问数据时再进⾏地址变换(即在逐条指令执⾏时完成地址映射.⼀般为了提⾼效率,此⼯作由硬件地址映射机制来完成.由硬件⽀持,软件硬件结合完成.硬件上⼀般需要⼀对寄存器的⽀持).什么叫物理地址?什么叫逻辑地址?什么叫地址映射?地址映射分哪⼏类?_…… 什么叫物理地址?什么叫逻辑地址?什么叫地址映射?地址映射分哪⼏类?1、物理地址就是由硬件地址编码电路产⽣的内存地址.2、逻辑地址是软件程序中使⽤的地址,是为了编程的简易性、安全性等⽬的由物理地址按⼀些规则由物理地址转...什么叫做映射地址_…… 概念:为了保证CPU执⾏指令时可正确访问存储单元,需将⽤户程序中的逻辑地址转换为运⾏时由机器直接寻址的物理地址,这⼀过程称为地址映射.直观的:CPU执⾏指令----存储单元 .这个过程需要下⾯的转换,逻辑地址-------物理地址.数学映射是什么定义_…… 在数学上,映射则是个术语,指两个元素集之间元素相互“对应”的关系,名词;也指“形成对应关系”这⼀个动作,动词.举例:设A={1,2,3,4},B= {3,5,7,9},集合A中的元素x按照对应关系“乘2加1”和集合B中的元素对应,这个对应是集合A到集合B的映射.【什么叫映射,他到底有什么作⽤,还有⼀⼀对应⼀⼀映射是什么意思】…… 映射是数学中描述了两个集合元素之间⼀种特殊的对应关系的⼀个术语.如果映射f是集合A到集合B的映射,并且对于集合B中的任⼀元素,在集合A中都有且只有⼀个原象,这时我们说这两个元素之间存在⼀⼀对应关系,并称这个映射叫做从集合A到集合B的⼀⼀映射.对于⼀⼀映射,A集合中的不同元素在B集合中对应不同的象.函数中映射到底是什么意思?我刚刚上⾼中,对于函数中映射的概念⾮常不清楚,课本上的定义觉得很不好理解,感激不尽啊!_…… 简单的讲映射就是集合A通过对应法则得到⼀个集合B,只是将集合过度到函数就可以了,分别理解前⾯提到的概念,1.集合A理解为⾃变量X 2.集合B理解为因变量Y 3.对应法则理解为f(x) 举例说明⼀下:求集合A到集合B的映射,对应法则为集合A的2倍, 那么⽤函数来表⽰就是 Y=2X f(x)="X的2倍“...映射是什么?函数是什么?什么叫到⾃⾝的⼀个映射?那么,b称为a在f下的象,a称为b在f下的⼀个原象,且a是A集合的元素,b是B集合的元素,你所说的象集是A集合吗,原象集是B集合吗?_…… 映射就是⼀对⼀的对应或者多对⼀的对应函数就是定义在数集上的映射到⾃⾝的⼀个映射,就是像集是原像集的⼀个⼦集.⽐如R-->R的映射,这个⾮常多.。
ARM映像文件及其地址映射2010-06-24 14:161、什么是arm的映像文件,arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到ROM里执行。
在axd调试过程中,我们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。
映像文件一般由域组成,域最多由三个输出段组成(RO,RW,ZI),输出段又由输入段组成。
所谓域,指的就是整个bin映像文件所处在的区域,它又分为加载域和运行域。
对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。
简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态。
一般来说flash里的整个bin文件所在的地址空间就是加载域,当然在程序一般都不会放在 flash里执行,一般都会搬到sdram里运行工作,它们在被搬到sdram里工作所处的地址空间就是运行域。
我们输入的代码,一般有代码部分和数据部分,这就是所谓的输入段,经过编译后就变成了bin文件中ro段和rw段,还有所谓的zi段,这就是输出段。
在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW 段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。
对于加载域中的输出段,一般来说RO段后面紧跟着RW段,RW段后面紧跟着ZI段。
在运行域中这些输出段并不连续,但RW和ZI一定是连着的。
ZI段和RW段中的数据其实可以是RW属性。
2、简单地址映射对于比较简单的情况,可以在ADS集成开发环境的ARM LINKER选项output中指定RO Base和RW Base,即在simple模式下,告知连接器RO和RW的连接基地址。
这种模式下,ARM Linker会输出以下符号,它们指示了在运行域中各个输出段所处的地址空间,在使用的时候可以用IMPORT引入:| Image$$RO$$Base|:表示RO段在运行域中的起始地址|Image$$RO$$Limit|:表示RO区末地址后面的地址,即RW数据源的起始地址|Image$$RW$$Base|:RW区在RAM里的执行区起始地址,也就是编译器选项RW_Base指定的地址|Image$$ZI$$Base|:ZI区在RAM里面的起始地址|Image$$ZI$$Limit|:ZI区在RAM里面的结束地址后面的一个地址RO Base对应的就是| Image$$RO$$Base|,RW Base 对应的是|Image$$RW$$Base|,由于ZI段是包含在RW段里的,所以|Image$$RW$$Limit| 就等于|Image$$ZI$$limit| 。
关于arm的统一编制与内存映射机制Arm是统一编址的,也就是外设和内存进行统一的编址,共同形成了4G物理地址空间(32位为例子)。
大家知道操作外设时,实际上操作的是读写设备相关的寄存器,这些与外设相关的寄存器与不同操作模式下R0——R15那些寄存器是不同的,这些寄存器并不是所谓的物理上的寄存器,实际上是所谓的IO端口,通常会有控制、状态、数据的分类。
他们被连续地编址,对于其编址的方式有两种一种是IO映射、一种是内存映射。
IO映射是对x86为例的复杂指令集来说的,需要专门的IO控制指令,不详谈。
内存映射是对于统一编制的精简指令集计算机arm等来说的。
具体的方法就是将IO端口映射成和内存一样的物理地址,然后与内存一起进行统一编址,或者说成为了内存的一部分,当然还可以理解内存映射的意思是可以用访问内存的方式进行IO地址的访问,内存和IO地址一起编码为cpu识别的地址哦。
然后内存+IO端口地址=4GB 的寻址空间。
那么接下来还有个问题就是这种编址的硬件实现?这就要详见arm的AMBA(AdvancedMicrocontroller Bus Architecture)了,这是目前芯片总线的主流标准。
共定义了3组总线:高性能总线(AdvancedHigh Performance Bus,AHB)、系统总线(AdvancedSystem Bus,ASB)和外设总线(Advanced PeripheralBus,APB)。
不同的总线上挂接着不同的外设和存储器,大部分由三态门控制。
比如,当AHB总线上的主设备读写从设备时,发出的地址经过AHB总线的译码器产生该地址所对应从设备的选择信号,选中从设备;这样就可以对从设备进行读写啦。
或者可以这样想AHB总线上的译码器根据地址产生相应的片选信号,选中对应的设备。
对于硬件的实现我们这是简单地理解以便更好地体会上述编址。
涉及到具体的硬件读写操作,地址的硬件实现会提到很多的译码器、三态门、总线、还有时序等等具体情况具体分析,在此不做详述。
1.内存管理和MMU当ARM 要访问存储器时,MMU 先查找TLB(Translation Lookaside Buffer,旁路转换缓冲)中的虚拟地址表。
如果TLB 中没有虚拟地址的入口,则转换表遍历硬件会从存放在内存的转换表中获得转换和访问器权限。
一旦取到,这些信息将被放到TLB 中,这时访问存储器的TLB 入口就拿到了。
在TLB 中其实包含了以下信息:1)控制决定是否使用高速缓冲2)访问权限信息3)在有cache 的系统中,如果cache 没有命中,那么物理地址作为线性获取(line fetch)硬件的输入地址。
如果命中了cache 那么数据直接从cache 中得到,物理地址被忽略。
ARM 的工作流程可用下图表示:这种机制是纯粹的高速硬件操作,并不需要操作系统来完成。
操作系统只要提供内存转换表就可以了,但是需要符合一定的格式。
ARM9 的MMU 映射表分为两种,一级页表的变换和二级页表变换。
两者的不同之处就是实现的变换地址空间大小不同。
一级页表变换支持1 M 大小的存储空间的映射,而二级可以支持64 kB,4 kB 和1 kB 大小地址空间的映射。
在LINUX 中最终使用了1 M 一级页表和4 kB 的二级页表(即 1M段区和4KB页面)内核中地址转换表建立过程地址转换表建立是和内核的启动一起完成的,页表的建立也可以分为三个阶段:第一阶段是发生在内核解压缩、自引导时,也就内核镜像zimage 的文件头部分。
相关代码从某种意义上来讲不属于内核,它是BSP 代码中的一部分,是需要根据不同的架构来分别实现的。
通过平面映射的方式建立了256M 空间节描述表。
但是,这个映射表是临时的,是为了提高内核解压缩时的速度而实现的。
在解压缩结束之后,进入内核代码之前,MMU 功能就被关闭了,随之的映射表也被废弃不用。
当decompress_kernel 函数实现内核的解压缩之后,那么内核启动的第一阶段工作就完成了。
ARM简介及编程1.ARM简介(摘录)ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。
技术具有性能高、成本低和能耗省的特点。
适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。
ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。
利用这种合伙关系,ARM 很快成为许多全球性RISC标准的缔造者。
目前,总共有30家半导体公司与ARM签订了硬件技术使用许可协议,其中包括Intel、IBM、LG半导体、NEC、SONY、菲利浦和国民半导体这样的大公司。
至于软件系统的合伙人,则包括微软、升阳和MRI等一系列知名公司。
ARM架构是面向低预算市场设计的第一款RISC微处理器。
2.产品介绍ARM提供一系列内核、体系扩展、微处理器和系统芯片方案。
由于所有产品均采用一个通用的软件体系,所以相同的软件可在所有产品中运行(理论上如此)。
典型的产品如下。
①CPU内核--ARM7:小型、快速、低能耗、集成式RISC内核,用于移动通信。
-- ARM7TDMI(Thumb):这是公司授权用户最多的一项产品,将ARM7指令集同Thumb扩展组合在一起,以减少内存容量和系统成本。
同时,它还利用嵌入式ICE调试技术来简化系统设计,并用一个DSP增强扩展来改迚性能。
该产品的典型用途是数字蜂窝电话和硬盘驱动器。
--ARM9TDMI:采用5阶段管道化ARM9内核,同时配备Thumb扩展、调试和Harvard总线。
在生产工艺相同的情况下,性能可达ARM7TDMI的两倍之多。
常用于连网和顶置盒。
②体系扩展-- Thumb:以16位系统的成本,提供32位RISC性能,特别注意的是它所需的内存容量非常小。
③嵌入式ICE调试由于集成了类似于ICE的CPU内核调试技术,所以原型设计和系统芯片的调试得到了极大的简化。