ARM的内存映射.
ARM中的RO、RW和ZI DATA说明

;
}
Prog2:
#include <stdio.h>
const char a = 5;
void main(void)
Prog3:
#include <stdio.h>
void main(void)
{
;
}
Prog4:
#include <stdio.h>
3; ZI
再看两个程序,他们之间的差别是一个未初始化的变量“a”,从之前的了解中,应该可以推测,这两个程序之间应该只有ZI大小有差别。
Prog3:
#include <stdio.h>
void main(void)
实际上,RO中的指令至少应该有这样的功能:
1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
2.
将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中
Total RO Size(Code + RO Data) 1008 ( 0.98kB)
Total RW Size(RW Data + ZI Data) 97 ( 0.09kB)
Total ROM Size(Code + RO Data + RW Data) 1009 ( 0.99kB)
Code RO Data RW Data ZI Data Debug
948 60 1 96 0 Grand Totals
================================================================================
ARM的七种异常类型

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嵌入式的人来说,遇到的第一个难点我觉得就是地址映射的原理,往往会被一些概念弄得稀里糊涂(比如像我这种智商不高的)。
所以就静下心自己好好研读了以下杜春雷《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. 动态链接库加载在操作系统中,内存映射也常用于动态链接库的加载和执行。
当一个进程需要调用某个动态链接库中的函数时,操作系统会将该库的某个区域映射到进程的地址空间中,这样进程就可以直接访问库中的代码和数据。
Cortex-M4内存映射

与传统的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处理器系统初始化的具体流程。
硬件初始化在系统上电后,ARM处理器进入硬件初始化阶段。
主要任务是对处理器的外设进行初始化。
1.初始化时钟系统:ARM处理器的时钟系统是处理器运行的根底,因此在初始化过程中需要设置适当的时钟频率和时钟源。
这可以通过配置PLL〔Phase Locked Loop〕或者外部晶振来实现。
2.使能缓存:缓存是提高处理器性能的关键。
在初始化过程中,需要配置L1缓存和L2缓存的大小、映射方式等参数,并使能它们。
3.配置中断控制器:中断是处理器与外设交互的一种方式。
在初始化过程中,需要配置中断控制器,使其能够正确地响应外设发出的中断请求。
4.初始化外设:根据系统的需求,初始化各个外设,包括串口、SPI、I2C等外设。
这些外设的初始化过程涉及到设备的存放器配置、中断使能等操作。
5.设置存储器映射:ARM处理器通过存储器映射来访问外部存储器。
在初始化过程中,需要设置存储器映射表,使处理器能够正确地访问外部存储器。
软件初始化在硬件初始化完成后,ARM处理器进入软件初始化阶段。
主要任务是加载和运行操作系统及应用程序。
1.复位处理器:在软件初始化过程中,可以选择复位处理器,将处理器重新置于初始状态。
这通常通过将Reset引脚拉低来实现。
2.加载引导程序:引导程序是系统启动的第一段代码,其功能是加载操作系统的核心代码。
在软件初始化过程中,需要将引导程序加载到适当的内存位置,并设置处理器的执行起点。
3.初始化操作系统:一旦引导程序加载完成,操作系统开始初始化。
这包括初始化内核数据结构、初始化设备驱动程序、启动任务调度器等。
4.加载应用程序:在操作系统初始化完成后,可以选择加载应用程序。
应用程序的加载可以通过文件系统来实现,将应用程序从存储设备读取并加载到内存中。
ARM存储系统MMU

编码 0b00 0b01
访问类型 没有访问权限 客户类型
0b10 保留 0b11 管理者权限
含义 这时访问域将产生访问失效
根据页表中地址变换条目的访问权限控制位决定是否 允许特定的存储访问。 将产生不可预知的结果 不会产生访问失效
23
关于快表的操作
1. 使无效快表的内容(由CP15中的C8控制)
指令 MCR p15,0,Rd,c8,c7,0 MCR p15,0,Rd,c8,c7,1 MCR p15,0,Rd,c8,c5,0 MCR p15,0,Rd,c8,c5,1 MCR p15,0,Rd,c8,c6,0 MCR p15,0,Rd,c8,c6,1
不能访问
0b00 0 1 只读
只读
0b00 1 1 不可预测 不可预测
0b01 X X 读/写 不能访问
0b10 X X 读/写 只读
0b11 X X 读/写 读/写
22
MMU中的域
域是段、大页和小页的集合。ARM 结构支持16 个域。
对域的访问由域访问控制寄存器( CP15的寄存器C3 )的两 个位字段控制。即,C3中的每2位控制一个域的访问控制特 性。其编码及含义如下表:
Rd 0 虚拟地址 0 虚拟地址 0 虚拟地址
含义 使无效指令和数据Cache 使无效整个Cache中的单个地址变换条目 使无效指令Cache 使无效指令Cache中的单个地址变换条目 使无效数据Cache 使无效数据Cache中的单个地址变换条目
2. 锁定快表的内容(由CP15中的C10控制)
24
CP15中的寄存器C1
F(bit[10]): 由生产商定义。 Z(bit[11]): 使能跳转预测, 0 = 禁止, 1 = 使能。 I(bit[12]): 当数据和指令cache分开时,使能指令cache。 0 = 禁
基于ARM处理器的内存Remap机制研究

R MC N O O 0一R MC N 寄 存 器 : 置 系统 片外 扩展 R M s A / ls ak0一B k5的起 始 和终 止 地 O O5 设 O / R M FahB L n n a
址 . 中 D 0 D 9 是 B k基 指针 , 设置 值左 移 1 即为 该 B k的起 始 物理 地 址 . 2 其 1 1 位 n a 该 6位 n a D 0一D 9位 用 于 2
第 2 卷 第 8期 6
20 0 6年 6 月
绍
兴
文
理
学
院
学
报
Vo . 6 No. 12 8
J R L OF S AO N N VE S OU NA H XI G U I R nY
J .o 6 L 2o m
基于 A M处理 器的 内存 R m p R e a 机制研究
马 群 利
( 州 职业 技 术 学 院 , 江 台 浙 台州 370 ) 100
摘
要 : 过 对 各 种 A M 处 理 器 实 现 R m p过 程 的深 人 分 析 , 重 探 讨 了在 不 同 的存 储 体 系 中 , 种 不 同 机 制 的 R m 实 通 R ea 着 各 e印
现 . 时 比较 并 总结 了各 种 R m p机 制 的优 缺点 , 同 ea 为嵌 人 式 系 统 的存 储 体 系 设 计 提 供 参 考 . 关 键 词 : 人 式 系统 , R 处 理 器 , e a , 嵌 AM R m p 存储 系 统
器 , 6 在 4M范 围 内任意设 定 起始 位 置 ( 特殊 功 能 寄存 器 B n 外 ) 以 达 到连 续 的 存储 器 映 射 .3 4 1 B ak除 , ¥C 50 没有 专 门 的内部 R M 及 R M, O A 但可 以将 内部 的 8 C ce 置 为 S M 使 用 , ah 配 K A R 此时 S M 地址 固定 在 特 殊 A R
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
几乎每一种外设都是通过读写设备上的寄存器来进行的。
外设寄存器也称为“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地址并不存在一个对应关系,只是逻辑上被编码为一个连续统一的“物理地址”。
)
这个解释差不多吧。