ARM的内存映射.
- 格式:doc
- 大小:12.00 KB
- 文档页数:1
ARM7支持六种操作模式:(1)用户模式(usr):正常的程序执行状态(2)FIQ模式(fiq):支持数据传送或通道处理(3)IRQ模式(irq):用于通用的中断处理(4)管理模式(svc):用于操作系统的保护模式(5)异常模式(abt):数据或者指令预取异常时进入(6)无定义模式(und):当无定义指令被执行时进入(7)软件控制,外部中断,异常处理都可以改变操作模式。
大部分的应用程序在用户模式下执行。
其他模式,比如管理模式,在中断、异常服务、或者访问被保护资源时进入。
ARM 的中央寄存器集是16 个用户寄存器R0 – R15。
这些寄存器均是32 位宽度,R0 – R12 没有其他特殊功能,寄存器R13 – R15在CPU中有特殊功能。
R13被用作栈指针(stack pointer,SP)。
R14被称为链接寄存器(link register, LR),当调用一个函数时返回地址被自动保存到链接寄存器,在函数返回时有效。
这使得快速进入和返回“叶”函数(不调用其他函数的函数)成为可能。
如果函数是分支的一部分(即该函数将调用另一个函数),链接寄存器必须入栈(R13)。
R15 是程序计数器(program counter, PC)。
有趣的是,许多指令也可以在R13 – R15中执行,就像它们是标准的用户寄存器。
ARM中断的问题ARM的七种异常类型---------1> 复位异常2> 数据访问中止异常3> 快速中断请求异常4> 一般中断请求5> 预取指令异常6> 软件中断异常7> 未定义异常-------------------------问题:1> 为什么除了进入复位异常模式外,在别的异常处理模式中都允许FIQ中断?2> 数据访问中止异常的优先级大于 FIQ异常,为什么在数据访问异常处理模式中,还允许 FIQ中断?这样不就成了:在高优先级异常处理中允许低优先级的中断发生?即使这样,因为FIQ中断的优先级 < 数据异常中断优先级,也不会进入 FIQ中断处理程序啊,这样不就更没有用处了??ARM体系的各种异常的分析(学习日记)- [ARM7TDMI]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/10669519.html1.复位异常(1)当内核的nRESET信号被拉低时,ARM处理器放弃正在执行的指令,当nRESET信号再次变高时,ARM处理器进行复位操作;(2)系统复位后,进入管理模式对系统进行初始化,复位后,只有PC(0x00000000)和CPSR (nzcvqIFt_SVC)的值是固定的,另外寄存器的值是随机的。
对于刚刚学习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. 大型文件处理内存映射非常适用于处理大型文件,如视频文件、数据库文件等。
通过内存映射,可以将整个文件映射到内存中,然后使用指针和偏移量来访问文件的不同部分。
这样可以避免反复读取文件和分配缓冲区的开销,而且读写操作更高效。
2. 共享内存内存映射还常被用于进程间共享内存。
多个进程可以将同一个文件的某个区域映射到各自的内存空间中,这样它们就可以通过读写内存来进行通信。
这种方式比较高效,可以提供更快的数据传输速度和更简单的编程接口。
3. 动态链接库加载在操作系统中,内存映射也常用于动态链接库的加载和执行。
当一个进程需要调用某个动态链接库中的函数时,操作系统会将该库的某个区域映射到进程的地址空间中,这样进程就可以直接访问库中的代码和数据。
与传统的ARM架构有所不同,自ARMv7以后的Cortex系列(这里只以Cortex-M为例),其内存映射结构发生了很大的变化。
首先是ARMv7-M的内存映射是大致框架预定义好的了(即其内存映射已经固定好了,哪个地址范围用使用什么总线支持什么外设等都已经在框架里规定好了的,这样带来的一个好处是方便软件在不同的ARM芯片中的移植),其次就是ARMv7-M的存储器系统支持所谓的“位带”(Bitband),可以方便实现“位”的原子操纵,还有就是支持非对
齐访问、互斥访问和大小端配置,下面就以Cortex-M4的Kinetis为例说说其内存映射的安排:
这里有个概念需要细说一下,即Write-Back和Write-through(这部分摘自ARM CM3 权威指南)。
其中写回(即
Write-Back)是指写入的数据先逗留在缓存中,待到必要的时候在落实到最终的目的地,即实现Cache的功能,利于改善数据传送的效率,减少主存储器的访问操作;而Write-through(即写通),指绕够cache,直接落实到目的存储器,写操作立即生效,常用于和片上外设或者其他处理器共享内存中,怎么样是不是想到了“volatile”这个关键字了,对了,他们两个就是对应的,即用Volatile声明的变量时放在写通区RAM里的。
ARM处理器系统初始化过程在嵌入式系统中,ARM处理器是最常用的处理器之一。
ARM处理器的系统初始化过程可以分为硬件初始化和软件初始化两个阶段。
本文将介绍ARM处理器系统初始化的具体流程。
硬件初始化在系统上电后,ARM处理器进入硬件初始化阶段。
主要任务是对处理器的外设进行初始化。
1.初始化时钟系统:ARM处理器的时钟系统是处理器运行的根底,因此在初始化过程中需要设置适当的时钟频率和时钟源。
这可以通过配置PLL〔Phase Locked Loop〕或者外部晶振来实现。
2.使能缓存:缓存是提高处理器性能的关键。
在初始化过程中,需要配置L1缓存和L2缓存的大小、映射方式等参数,并使能它们。
3.配置中断控制器:中断是处理器与外设交互的一种方式。
在初始化过程中,需要配置中断控制器,使其能够正确地响应外设发出的中断请求。
4.初始化外设:根据系统的需求,初始化各个外设,包括串口、SPI、I2C等外设。
这些外设的初始化过程涉及到设备的存放器配置、中断使能等操作。
5.设置存储器映射:ARM处理器通过存储器映射来访问外部存储器。
在初始化过程中,需要设置存储器映射表,使处理器能够正确地访问外部存储器。
软件初始化在硬件初始化完成后,ARM处理器进入软件初始化阶段。
主要任务是加载和运行操作系统及应用程序。
1.复位处理器:在软件初始化过程中,可以选择复位处理器,将处理器重新置于初始状态。
这通常通过将Reset引脚拉低来实现。
2.加载引导程序:引导程序是系统启动的第一段代码,其功能是加载操作系统的核心代码。
在软件初始化过程中,需要将引导程序加载到适当的内存位置,并设置处理器的执行起点。
3.初始化操作系统:一旦引导程序加载完成,操作系统开始初始化。
这包括初始化内核数据结构、初始化设备驱动程序、启动任务调度器等。
4.加载应用程序:在操作系统初始化完成后,可以选择加载应用程序。
应用程序的加载可以通过文件系统来实现,将应用程序从存储设备读取并加载到内存中。
关于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总线上的译码器根据地址产生相应的片选信号,选中对应的设备。
对于硬件的实现我们这是简单地理解以便更好地体会上述编址。
涉及到具体的硬件读写操作,地址的硬件实现会提到很多的译码器、三态门、总线、还有时序等等具体情况具体分析,在此不做详述。
arm内存管理机制ARM是一种广泛应用于嵌入式系统中的芯片,其内存管理机制是保证系统运行稳定的重要组成部分。
本文将介绍ARM内存管理机制的基础知识,包括地址空间、虚拟地址、物理地址和内存映射等内容,并给出一些指导意义的建议。
地址空间是指进程可以访问的地址集合。
ARM使用了一个32位地址空间,共2^32字节(4GB)。
这个地址空间被分成两个部分:用户空间(User Space)和内核空间(Kernel Space)。
用户空间是由应用程序使用的,内核空间是由操作系统使用的。
在ARM系统中,虚拟地址和物理地址是两个不同的地址空间。
虚拟地址是由应用程序使用的地址。
它是一个32位地址,它与物理地址是不同的,应用程序只能访问虚拟地址,并且不能直接访问物理地址。
应用程序访问虚拟地址时,操作系统将虚拟地址转换为物理地址,然后进行访问。
这个转换由ARM芯片的内存管理单元(MMU)完成。
物理地址是处理器处理的实际地址。
它表示访问硬件的实际位置。
每个ARM芯片都有一个物理地址空间,但它的大小和内容依赖于所用的芯片,那么关于内存地址的运用应该注意哪些方面呢?在ARM中,内存是通过内存映射的方式访问的。
内存映射是由操作系统控制的,它将虚拟地址映射到物理地址。
内存映射的目的是将不同的外设设备和物理内存映射到同一地址空间。
这样,应用程序可以使用相同的地址来访问不同的设备和内存。
在编写嵌入式系统时,必须小心使用内存映射。
错误的内存映射可能会导致系统崩溃或数据损坏。
因此,在设计和实现系统时,必须确保正确的内存映射,并尽可能减少内存分配和释放的次数。
总之,ARM内存管理机制中,地址空间、虚拟地址、物理地址和内存映射是重要的概念。
理解这些概念可以帮助开发人员设计和实现更稳定、高效的嵌入式系统。
因此,我们建议开发人员在开发嵌入式系统时,要注意这些概念,并确保正确的内存管理。
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 函数实现内核的解压缩之后,那么内核启动的第一阶段工作就完成了。
s3c2440地址空间的分配s3c2440启动过程详解一:地址空间的分配1:s3c2440是32位的,所以可以寻址4GB空间,内存(SDRAM)和端口(特殊寄存器),还有ROM都映射到同一个4G空间里.2:开发板上一般都用SDRAM做内存flash(nor、nand)来当做ROM。
其中nand flash 没有地址线,一次至少要读一页(512B).其他两个有地址线3:norflash不用来运行代码,只用来存储代码,NORflash,SDRAM可以直接运行代码)4:s3c2440总共有8个内存banks6个内存bank可以当作ROM或者SRAM来使用留下的2个bank除了当作ROM 或者SRAM,还可以用SDRAM(各种内存的读写方式不一样)7个bank的起始地址是固定的还有一个灵活的bank的内存地址,并且bank大小也可以改变5:s3c2440支持两种启动模式:NAND和非NAND(这里是nor flash)。
具体采用的方式取决于OM0、OM1两个引脚OM[1:0所决定的启动方式OM[1:0]=00时,处理器从NAND Flash启动OM[1:0]=01时,处理器从16位宽度的ROM启动OM[1:0]=10时,处理器从32位宽度的ROM启动。
OM[1:0]=11时,处理器从Test Mode启动。
当从NAND启动时cpu会自动从NAND flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。
cpu 是从0x00000000开始执行,也就是NAND flash里的前4KB内容。
因为NAND FLASH 连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。
通过这个载体把nandflash中大代码复制到RAM(一般是SDRAM)中去执行当从非NAND flash启动时nor flash被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000). 然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)。
stm32内存映射的原理STM32内存映射的原理是指将STM32芯片中所有的外设(如I/O端口、定时器、串口等)和存储器(如SRAM、Flash等)都映射到一个连续的地址空间内,方便访问和操作。
这个地址空间可以被认为是一个大的数组,每个元素代表一个外设或存储器单元,其中每个元素都有一个特定的物理地址。
在程序运行时,通过对这些物理地址的访问,就可以读写外设和存储器。
在STM32中,这个地址空间一般是32位的,可以表示4GB的空间。
但实际上并不是所有的地址都被用来映射外设和存储器,通常只有一部分被用来映射外设和存储器,而剩余的地址则没有任何用途。
此外,根据不同的芯片型号和具体的应用场景,内存映射的细节也可能有所不同。
在编写STM32的驱动程序时,需要使用寄存器和指针来访问内存映射中的外设和存储器。
具体来说,可以使用以下的方式来访问内存映射中的不同部分:- 对于内存中的数据,可以使用指向内存地址的指针来进行直接的读写操作。
- 对于外设的控制寄存器,通常需要先将其物理地址转换为虚拟地址并保存在指针中,然后使用指针来访问寄存器。
- 对于访问Flash存储器,需要使用特殊的指令来进行读操作,而写操作则需要先将Flash解锁,并按照特定的步骤进行操作。
- 对于存储器映射外设,可以使用类似于指针的方式来访问控制寄存器和数据寄存器。
除了这些基本的操作之外,还可以通过编写相应的驱动程序和接口,将内存映射中的不同部分整合起来,方便更高层次的应用程序进行调用。
例如,在通信领域中,可以通过将串口的控制寄存器、发送缓冲区和接收缓冲区整合在一起,实现对串口通信的封装和简化。
总的来说,STM32内存映射的原理是将芯片中的外设和存储器映射到一个连续的地址空间中,方便程序访问和操作。
在实际应用中,需要通过指针和寄存器等手段进行访问和控制,同时可以通过编写驱动程序和接口,将内存映射中的不同部分整合起来,方便更高层次的应用程序进行调用。
简述arm微处理器的存储器组织方式-回复ARM微处理器的存储器组织方式【引言】随着计算机技术的迅猛发展,微处理器成为现代计算机的核心部件之一。
而ARM(Advanced RISC Machine)微处理器则是一种广泛应用于各种移动设备和嵌入式系统的微处理器架构。
存储器是微处理器中至关重要的组成部分,它承担着存储和取回程序和数据的任务。
在本文中,我们将简要介绍ARM微处理器的存储器组织方式。
【1. 存储器类型】ARM微处理器采用的存储器组织方式分为多个级别,每个级别都有其特定的功能和特点。
ARM微处理器主要包括下列几种存储器类型:- 寄存器:寄存器是位于CPU内部的高速存储器,用于存储和操作数据。
ARM微处理器通常拥有多个通用寄存器,特定目的寄存器和状态寄存器,用于不同的数据操作和系统控制。
- 高速缓存:高速缓存是位于CPU核心和主存之间的中间存储器,用于加速主存的数据读取和写入。
ARM微处理器通常包括多级高速缓存,如一级指令缓存和数据缓存、二级缓存等,其容量和速度逐级递减。
- 主存储器:主存储器是微处理器中最大容量的存储器,用于存储程序和数据。
ARM微处理器支持多种主存类型,如静态RAM(SRAM)、动态RAM(DRAM)等,其容量可以从几兆字节到几个千兆字节不等。
【2. 存储器层次结构】ARM微处理器的存储器组织方式采用存储器层次结构,以便提高存储器的访问效率和性能。
存储器层次结构由多级存储器组成,每级存储器的容量和速度都不同,分别用于存储不同级别的数据。
ARM微处理器的存储器层次结构通常包括以下几个层次:- 第一级缓存(L1 Cache):一级缓存是位于CPU核心和主存之间的最接近CPU的高速缓存。
它通常分为一级指令缓存(L1 I-Cache)和一级数据缓存(L1 D-Cache),分别用于存储指令和数据。
一级缓存的容量较小,但速度非常快,可以迅速地响应CPU的读写请求。
- 第二级缓存(L2 Cache):二级缓存是位于一级缓存和主存之间的中间缓存,其容量比一级缓存大,速度相对较慢。
内存映射文件使用方法随着计算机技术的不断发展,内存映射文件成为了一种重要的文件处理方式。
内存映射文件可以将文件直接映射到内存中,提供了一种高效、方便的文件操作方式。
本文将介绍内存映射文件的使用方法,匡助读者更好地理解和应用这一技术。
一、什么是内存映射文件内存映射文件是一种将文件映射到内存的技术。
通过内存映射文件,我们可以像操作内存一样操作文件,而不需要频繁地进行磁盘读写操作。
内存映射文件可以提高文件的读写效率,并且简化了文件操作的代码。
二、内存映射文件的创建在使用内存映射文件之前,我们需要创建一个内存映射文件对象。
下面是一个简单的内存映射文件的创建示例:```pythonimport mmapfile = open('example.txt', 'r+b')mmap_obj = mmap.mmap(file.fileno(), 0)```在上述示例中,我们首先打开了一个文件,并以读写模式打开。
然后,通过`mmap.mmap`函数创建了一个内存映射文件对象`mmap_obj`。
这样,我们就可以通过`mmap_obj`来操作文件了。
三、内存映射文件的读写操作内存映射文件对象提供了一系列方法来进行读写操作。
下面是一些常用的方法:1. `read(size)`:从内存映射文件中读取指定大小的数据,并返回一个字节对象。
2. `write(data)`:将指定的数据写入到内存映射文件中。
3. `seek(offset[, whence])`:将文件指针挪移到指定的位置。
`offset`表示偏移量,`whence`表示偏移的起始位置,默认为0。
4. `size()`:返回内存映射文件的大小。
通过这些方法,我们可以方便地对内存映射文件进行读写操作。
例如,我们可以使用`read`方法读取文件的内容,并使用`write`方法将数据写入到文件中。
四、内存映射文件的应用场景内存映射文件在实际开辟中有着广泛的应用场景。
嵌入式芯片的存储器映射和存储器重映射1. 引言很多嵌入式芯片都集成了多种存储器(RAM、ROM、Flash、……),这些存储器的介质、工艺、容量、价格、读写速度和读写方式都各不相同,嵌入式系统设计需根据应用需求巧妙地规划和利用这些存储器,使得存储系统既满足应用对容量和速度的需求,又有较强的价格竞争优势。
本文所讲的存储器映射就是对各种存储器的大小和地址分布的规划。
存储器重映射就是为了快速响应中断或者快速完成某个任务,将同一地址段映射到不同速度的两个存储块,然后将低速存储块中的代码段复制到高速存储块中,对低速存储块的访问将被重映射为对高速存储块的访问。
2. 存储器映射(Memory Mapping)对于具体的某款嵌入式芯片,它包含的各种存储器的大小、地址分布都是确定的。
存储器映射(Memory Mapping)就是指(物理)地址到存储单元的一一对应(注意,本文中所讲的存储器映射不是指虚拟地址到物理地址的映射。
更确切地讲,本文所讲的存储器映射是存储布局(Memory Layout))。
同一类型的存储器称为一个存储块(Memory Block),也有的地方称为一个存储区域(Memory Area,Memory Region),嵌入式系统设计者通常会为一个存储块分配一段连续的物理地址。
多种存储器按某种方式排列,形成整个存储空间。
存储器映射可以理解为这样一个函数:输入是地址总线上的地址编码,输出是被寻址单元中(或数据总线上)的数据。
该函数是一个逻辑概念,计算机系统上电复位后才建立起这种映射,当计算机系统掉电后,这个函数就不复存在,只剩下计算机系统中实现这个函数的物理基础——电路连接。
也可以这样认为:存储器映射是计算机系统上电复位时的预备动作,是一个将CPU所拥有的地址编码资源向系统内各个物理存储器块分配的自动过程。
3. 存储器重映射(Memory Remapping)3.1 为什么需要存储器重映射目前很多嵌入式系统中的Flash分为Code Flash和Data Flash。
几乎每一种外设都是通过读写设备上的寄存器来进行的。
外设寄存器也称为“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地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。
)
以上两种理解哪种才是正确的?
另外我想问一下这个“CPU的单一物理地址空间”包括哪些对象,仅仅是物理Memory (RAM\ROM\FLASH)对象吗?是不是一个逻辑上的概念?
回答:外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分
就是说端口可以用访问内存的方式操纵,比如mov指令,可以把数据直接传送到那个端口
I/O端口本身和物理内存一起被编码为连续的“CPU识别的地址”(即CPU将物理内存编码后接着将I/O地址也跟着编码,内存地址和I/O地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。
)
这个解释差不多吧。