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内存管理机制中,地址空间、虚拟地址、物理地址和内存映射是重要的概念。
理解这些概念可以帮助开发人员设计和实现更稳定、高效的嵌入式系统。
因此,我们建议开发人员在开发嵌入式系统时,要注意这些概念,并确保正确的内存管理。
几乎每一种外设都是通过读写设备上的寄存器来进行的。
外设寄存器也称为“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地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。
)
这个解释差不多吧。