1.3 大纲详述
在本节,学生可以了解每个知识点的详细要求。引用大纲的文字采用斜体,紧跟着正体的文字将解释大纲的内容,包含如何找到相关信息,以及一些必要的额外信息。
1.3.1 实现
1.ARM处理器家族
(1)什么是多内核
Candidates should be familiar with the available processors from ARM and know which of these may be used in multiprocessor configurations.
考生需要熟悉ARM的处理器,并且了解其中哪些是用于多处理器配置的。
本书3.4节描述了一些常见的ARM处理器,3.5节更详细地描述了Cortex-A系列的处理器,尤其需要详细了解表3-3。
(2)连接硬件
Candidates should be aware of the concept of coherency hardware, what it does, why it is required and what are the benefits of using it.
考生需要了解连接硬件的含义,它是做什么的,为什么需要它以及它的优势是什么。
虽然这部分内容是在大纲的开始部分提及的,但它属于难度较大的知识点。连接硬件是在多核系统中必须使用的。要理解它是如何工作的以及它是如何影响软件开发的,需要具备对多核系统以及缓存知识的了解。这部分内容位于第10章(缓存)及第22章(介绍多核系统),连接硬件是在23.1节介绍的。
(3)通用中断控制器GIC
通用中断控制器GIC在“编程手册”的14.2节介绍,考生应该同时参考23.3节(多内核系统中断处理)来学习。GIC常用于Cortex-A5多内核、Cortex-A9多内核以及Cortex-R7多内核处理器中,它也可作为可选部件存在于Cortex-A7和Cortex-A15内核中。
(4)架构版本归属
Candidates must be able to identify which ARM processors conform to which Architecture versions. Architectures from ARMv4T onwards are included, with the exception of ARMv7-M and ARMv6-M architectures.
考生需要能够识别具体的ARM的处理器是属于哪个处理器架构版本的。ARMv4T架构之后的都需要了解。
表3-2提供了相关的详细信息
(5)性能
Candidates must be able to distinguish between applications, real-time and microcontroller profiles, be aware of the distinguishing features between them and understand the typical target market/applications of each.
考生需要能够区别ARM Cortex的应用、实时和微控制器三大系列的区别,理解它们之间的不同特性以及所针对的典型目标应用和市场。
《Cortex-A系列程序员指南》,顾名思义,它只介绍了Cortex-A系列,并没有提供很多关于Cortex-R和Cortex-M系列的知识。Cortex-A系列处理器主要应用于需要MMU内存管理单元和缓存工作的操作系统的应用场合,要求拥有高性能的处理能力。
Cortex-R系列处理器主要面向实时应用,它面向需要硬实时反应能力的嵌入式系统。这说明它的特性要求有快速、确定的中断响应,有紧密耦合的存储器(TCM)位于处理器的局部快速总线上以提供快速响应的代码和数据,有奇偶校验或者ECC校验机制来保证错误的检测和修正。Cortex-R系列处理器使用内存保护单元MPU代替Cortex-A系列中的内存管理单元MMU来进行内存的管理和保护。
Cortex-M系列处理器面向低成本和功耗敏感的微控制器和混合信号系统。例如一些终端设备,包括智能电表、人机交互设备、自动和工业控制系统、大型家用电器、消费类产品和医疗仪器等。这类领域应用的关键是要求微量代码(更好的代码密度),易于使用以及节能。例如,Cortex-M0+内核是ARM处理器中能耗最低的内核,可达到mW/MHz。Cortex-M系列处理器仅支持16位和32位的Thumb指令集,通常不含缓存。
2.指令周期时序
Candidates should be aware of the effects of pipeline and memory system on instruction execution timing.
考生需要了解流水线和内存系统对指令执行时间的影响。
流水线在“程序员指南”的5.4节有一些介绍,分支预测在5.5节介绍。这些都提供了一些流水线架构相关的基本知识。
了解ARM7TDMI的三级流水线(取指、译码、执行)的含义可以帮助理解流水线对执行周期时序的影响。ARM7TDMI技术参考手册给出了这个流水线,这让理解流水线的概念变得更容易。
例如,在ARM7TDMI上分支跳转会导致2个周期的损失,因为分支跳转发生在流水线的执行阶段,此时位于取指和译码阶段的指令将被冲刷掉,流水线被重新按新的指令流填满,因此在跳转后的第一条指令执行前将产生3个周期的延迟。
同理,一旦理解了简单的流水线,“加载-使用损耗”的概念就很明了了,它用于描述当寄存器加载一个存储空间的值时的状况。如果接下来的指令需要使用这个寄存器的值,那么它需要等待该寄存器完成数据的加载(并到达处理器流水线的相关级,可能通过专用通道到达)。编译器(或者汇编器)会避免这种情况发生,它一般会试图把使用加载数据的指令从加载指令处分离开。
1.3.2 软件调试
1.标准调试手段
(1)软件断点和硬件断点的区别
Candidates should be aware of the differences and limitations between Hardware and Software breakpoints. They should understand the usage of watchpoint units in configuring these two types of breakpoint.
考生需要清楚硬件和软件断点的区别以及各自的限制,需要了解在配置这两种类型的断点时观察点单元的使用。
这部分在30.1节有详细介绍。在较早的处理器(如ARM7TDMI)中,并没有配备专用的断点指令BKPT,而是使用设置观察点单元来查看特定的位模式的,调试器可以在RAM的代码空间中设置无限量的软件断点。调试器会读取需要放置断点指令的操作码,并保存到主机上。这条指令然后被一个特定的数据位替代(通常对应的是一个无效指令)。通常,这需要处理器的数据缓存被清空并且使指令缓存无效,以确保从处理器数据端写入的特定数据可以被取指逻辑正确访问。在较新的处理器上,包括所有的Cortex系列处理器,则采用了BKPT指令来代替原来的需要放置断点的操作码。当断点被移除时,原本存储在主机上的原操作码会被写回。与此对应的是,硬件断点可以被设置在任何类型的存储器上(包括RAM和ROM),但它的数量则由硬件限制。
在学习这部分内容时,建议使用真实的调试器来理解它的使用和限制,获得一些实际的应用经验,这可以比书本上的解释提供更多的有益背景知识。
(2)监控模式与停止模式调试
Candidates should be aware of the differences between debugging in each of the two modes and when one would be chosen over the other e.g. choosing monitor mode if interrupts must continue to be serviced while debugging.
考生需要了解调试的两种模式之间的区别以及何时选用哪种模式。例如,需要在调试过程中仍旧响应中断时,则应选择监测模式来调试。
这一部分在30.1.1节有介绍。
(3)矢量捕捉
Candidates should be aware of the function of this feature, why and when it is typically used.
考生需要了解矢量捕捉的功能,为什么以及何时需要使用它。
矢量捕捉是调试器捕获处理器异常中断的方法,早期开发时在异常中断服务句柄被取指之前捕获到处理器的异常中断。许多ARM的处理器都由矢量捕获硬件来完成这一任务。而在另外一些处理器,如ARM7TDMI,调试器可以采用在异常矢量表的适当位置设置断点的方法来进行中断矢量捕获。
(4)判别异常触发原因(如DFSR、SPSR、Link链接寄存器)
Candidates should understand how to determine the actual cause of an exception by using additional resources, which might include special registers that contain fault status. For example, using the DFSR, DFAR to determine cause of a Data Abort or using the SPSR and LR to locate and retrieve SVC comment field.
考生应当理解如何使用额外的资源来判别触发一个异常中断的原因,这些资源通常包括含有错误状态的特殊寄存器,如使用DFSR、DFAR来判别数据中止的原因,采用SPSR以及Link寄存器来定位并获取SVC系统调用的参数位。
当调试一段软件时,通常有必要了解为何特定的处理器异常会发生。为此ARM处理器提供了一系列的寄存器来提供有用的信息。在异常中断中,当前异常模式的链接寄存器(LR)会给出主程序中最靠近触发异常的指令的位置。通常触发异常的指令的位置是LR寄存器的值减去4或者8(详见13.2节)。类似地,SPSR寄存器的mode位可以给出在进入异常模式之前处理器所处的模式。
对于特定的模式,还有一些额外的信息。在取指异常或数据中止异常后,CP15寄存器的错误状态寄存器(FSR)和故障地址寄存器(FAR)是值得注意的,它们可以给出异常中止发生的原因(如一个外部存储器错误或者该地址的转换表项无效)以及产生异常中止的内存访问操作的地址。
注意
ARMv6-M和ARMv7-M架构在异常处理模型上与其他的ARM内核有所不同,但在基本的考试中这些并不要求掌握。
(5)跟踪
Candidates should be aware of what Trace is, what on-chip and off-chip components are required to make it work, what it is used for. Also that it is non-intrusive.
考生需要了解什么是跟踪,它正常工作需要哪些片上和片外模块,它是用来做什么的,以及它是属于非侵入式的。
这些都在30.2节中介绍。
(6)交叉触发
考试对这部分不做要求
(7)物理调试接口
Candidates should be aware of available options for making physical connections to the target for the purpose of run-control debug (e.g. JTAG, SWD)
考生需要理解在线调试所需要的连接到物理目标系统的物理连接选项(如JTAG、SWD)。
这部分在第30章介绍。JTAG是一个广泛使用的工业标准,它在物理上通常需要至少5个信号引脚来连接主机计算机和ARM目标系统板。串行调试口SWD是一个拥有类似调试功能的2脚调试口,并且它通常只在较新的处理器上才有。而从处理器抓取跟踪信息,则需要比控制代码执行大得多的带宽,因为每个周期都会有很多的32位地址和数据信息产生,因此专用的跟踪端口需要更多的引脚。此外,跟踪信息也可以存储在片上的缓冲区中,采用较少物理引脚的慢速调试口来读取这些跟踪信息。
(8)调试访问内存
Candidates should be aware of how a debugger uses the processor to access memory and be aware of how memory translation affects this. They should also understand the potential impact of cache maintenance caused by debug operations on the state of the memory system.
考生需要了解调试器是如何使用处理器来访问内存的,并且理解内存转换如何影响这种访问,还需要理解对内存系统状态的调试操作可能带来对缓存内容维系的潜在影响。
调试器通常需要显示调试目标内存(或者外设)的内容并进行修改,它通常是通过处理器执行加载或者存储指令来实现的,然而有些系统则可以通过内建的调试系统单元来直接对内存进行写(或读)操作,不需要处理器本身参与内存操作。
一个良好的调试器会减少调试动作对系统的影响。例如,它通常会尽量减小调试时对缓存的修改。如果调试器在调试窗口上显示一块内存区域的内容但调试器必须使用处理器来读取内存时,它会尽量采用非缓存方式来操作,从而确保之前缓存中的内容不会被冲刷掉。程序员必须了解(当内存管理单元MMU被使能时)调试显示使用的是虚拟地址而非物理地址,而且缓存中的内容可能与外部存储器的内容不一致。
如果内存访问是直接通过片上系统的调试单元(而非处理器)来进行的,那么访问使用的就是物理地址而非处理器的虚拟地址转换,而且它是直接访问内存的(绕过处理器的缓存)。
(9)半主机
Candidates should be aware of semi-hosting, understand what its function is and how it can be used during development. They should also be aware of the invasive nature of using this feature and how it may affect timing etc. They should also be aware of the danger of using semi-hosting when no debugger is connected and how to retarget the standard C library.
考生需要理解半主机的功能是什么,在开发过程中应如何使用;需要了解这种机制的侵入式特性以及它对时序等方面的影响;还需要了解当目标板没有连接调试器时使用这一机制的风险,以及它如何重定向到标准C库。
半主机是一种让ARM目标板上的代码可以使用主机计算机上调试器提供的部分资源的机制。
这些资源可以包含键盘输入、显示输出、硬盘I/O。例如,程序员可以使用这种机制提供的标准C库函数,如printf()和Scanf()来使用主机上的终端屏幕和键盘。开发的硬件通常不包含全功能的输入/输出设备,而半主机则可以让主机提供这些资源。
半主机是通过一系列专用的软件指令产生异常来实现的。应用程序使用适当的半主机异常调用——调试中介来响应异常处理。调试中介会提供到主机所需的通信。
半主机的接口一般是通过ARM提供的调试单元作为中介来实现的。ARM的工具使用SVC 0x123456(ARM状态)或者SVC 0xAB(Thumb状态)来表示半主机调试函数。
当然,如果脱离了开发环境,运行着调试器的主机并不会连接到目标系统上。此时开发人员有必要将任何使用到半主机的库函数重定向,如fputc()函数。这意味着需要使用能够输出字符到指定设备的代码来替代使用SVC调用半主机的库函数代码。
2.标准调试技术
(1)调用栈
Candidates must understand what a call stack is and how it may be used in debugging.
考生需要理解什么是调用栈以及它在调试时应如何使用。
应用程序代码主要使用堆栈来进行参数传递、保存局部变量和保存返回地址。每个函数压入堆栈的数据都被组织为一个“堆栈帧”,当调试器停止处理器时,它可以分析堆栈中的数据,为程序员提供“调用栈”,这是从最顶层函数调用到当前子函数之间每一层级的调用关系,它可以在调试时让用户非常方便地了解整个调用路径,了解为何程序会运行到当前的位置。
为了能够重建调用栈,调试器必须能够确定堆栈的哪些项包含了返回地址的信息。如果编译的时候包含的话,这些信息一般会存在于“调试器信息”(DWARF调试表)中,或者从一个由程序压入堆栈的“帧指针”链表获得。当然,代码必须使用帧指针。如果这两种类型的信息都没有,那么这个调用栈无法被重建。
在多线程任务应用中,每个线程都有自己的堆栈,因此调用栈的信息也只和它对应的线程相关。
(2)单步执行
Candidates must understand what single stepping is and how it may be used in debugging. They should understand the difference between Step-In and Step-Over when single-stepping.
考生需要理解什么是单步执行以及如何在调试中应用,它需要理解在单步执行时Step-In和Step-Over的区别。
单步执行指的是调试时调试器可以控制执行部分代码,每一次执行一条指令。Step-In和Step-Over的区别可以从函数调用中理解。当采用Step-Over来调试函数时,整个函数会作为一步来执行,让程序员可以直接执行整个函数而不需要进入函数里面去单步执行。Step-In表示进入函数里面去单步执行函数体。
(3)开始/停止
Candidates must understand what start/stop debugging is and how it may be used.
考生需要理解什么是开始/停止调试以及如何使用它。
开始的含义就是按下调试器的“开始”按钮,处理器退出调试状态并重新进入正常执行状态(从当前的程序指针处开始执行),直到程序遇到某个让它停止的因素为止,这些因素通常是一个断点、观察点或者捕捉向量事件或者是从外部调试器及其他系统阻塞所产生的调试请求。
开始/停止的调试模式与不能停止代码执行的调试的系统形成鲜明的对照。在一些嵌入式系统中(如汽车引擎控制系统),在进行系统调试时是不能简单地让处理器停止执行的。
(4)打印printf
Candidates must understand how printf may be used in code instrumentation (they may also be expected to understand what other kinds of instrumentation might typically be used).
考生需要理解如何在代码仪器化中使用printf(还需要理解其他可用的仪器化函数)。
这是一个最基本的调试技术,通常在所有的处理器架构中使用,用于在代码中插入指令来输出一些数据,例如来显示程序的指令流或者某一时刻一些关键变量的值。
(5)裸机代码和应用代码
Candidates should be aware of the difference in debug options between applications running on OS-based or bare metal system (e.g. Ethernet, GDB server, ICE).
Example: Candidates should know that it is necessary to run a server program on the target system in order to debug an OS-based application.
考生需要了解基于操作系统的应用层软件调试和基于裸机代码的系统调试方法的差别(如以太网、GDBServer、ICE)。
例如,考生需要知道在目标板上调试一个基于操作系统的应用程序必须运行一个调试服务程序。
在30.4节介绍了这方面的内容。
(6)RAM/ROM调试
Candidates should be aware of the limitations of debugging code running in different types of memory (e.g. breakpoints and image load).
Example: Candidates should know that it is not possible to set an unlimited number of breakpoints when executing code in ROM. More advanced candidates would understand why this is the case.
考生需要了解在不同类型的存储空间中进行代码调试的限制。
例如,考生应该知道调试在ROM中执行的代码时是不能设置无限量的断点的,更深入的了解应该知道为什么如此。
软件断点只能设置在RAM中,因为RAM是可写的空间。调试ROM中的代码的另一个通常的限制是很难修改代码来修改错误的部分。
(7)调试时序相关问题
Candidates should be aware that certain debug approaches may affect the timing of the code (e.g. halt mode) and be aware of non-invasive alternatives (e.g. trace).
考生需要了解某些调试方法可能会影响代码的时序(如暂停模式)并了解其他非侵入式的调试方法(如跟踪)。
(8)使用调试器调试软件的影响(系统可能会被更改状态)
Candidates should be aware of the implications/impact of debugging (e.g. reading memory locations).
考生需要了解调试的含义和影响(如读取内存位置)。
1.3.3 架构
本节主要讨论指令集架构。
1.指令集
(1)LDREX/STREXCLEX
Candidates should be aware of how these instructions work and how they might be used to implement software synchronization (e.g. mutex). At this level candidates should be able to recognize a simple mutex implementation (in assembler) and be able to explain its operation. They will not be expected to write one.
Example: Candidates should be aware of what a mutex is. More advanced candidates will be aware of the exclusive access instructions which are used to implement mutexes and similar constructs.
考生需要了解这些指令如何工作,如何用于软件的同步(如互斥);应该能够识别一个互斥的应用(在汇编代码中)并能解释它们的作用,但不需要考生自己编写一个此类代码应用。
例如,考生需要理解什么是互斥。更高级的考试需要了解用来实现互斥或类似操作的独占访问指令。
独占访问和互斥在23.4节和24.4节介绍,考生需要花时间来熟悉例子23-1中的代码并理解它的操作。
(2)DMB/DSB/ISB
Candidates must understand the features of a weakly ordered memory system and recognize when manual ordering is required. Candidates must also know how to achieve required access ordering using the ARM barrier instructions. They should be able to insert suitable barrier instructions in simple code sequences where particular ordering is required.
Examples: Candidates should know that ARM systems implement a weakly-ordered memory model and that this means barriers are required to enforce ordering in some circumstances. More advanced candidates will know what these instructions are and how to use them in simple code sequences.
考生需要理解弱排序内存系统访问的特性以及知道什么时候需要手动排序;还必须要知道如何通过ARM的隔离指令实现所需要的内存访问顺序,当需要特定的顺序时,应该能够在简单的代码序列中插入恰当的隔离指令。
例如,考生需要知道ARM系统采用的弱排序内存模型并且意味着在某些特殊场合需要用隔离来强制访问顺序。更高级别的考试需要了解这些隔离指令是什么,以及如何使用它们。
在第12章详细介绍了ARM内存系统顺序模型以及隔离的使用,考生需要特别关注这些才能理解DSB和DMB的区别以及12.2节中给出的应用例子。如果可能的话,考生应该在实际的应用例子中寻找一个使用隔离指令的应用。例如,如果一个中断源可以被通过访问映射到内存空间的外设寄存器来清除的话,就可能有必要使用隔离指令来强制确保这个清除操作完全执行完毕,再进行后续的指令,如重新使能中断。但如果没有这个隔离指令的话,可能会产生虚假的中断。
(3)VFP
考生不需要掌握此方面知识。
(4)NEON
考生不需要掌握此方面知识。
(5)Exception异常入口/出口
Candidates must be able to describe the exception entry sequence of an ARM processor. They must understand and describe the state of the processor on entry to an exception (e.g. PC, LR, CPSR, SPSR etc). Candidates must also be familiar with the standard exception return instructions (not including ERET) and return address adjustments for each exception type.
Example: Candidates should know what operations the core undertakes automatically on processing an exception. More advanced candidates will know the standard exception return instructions for each exception type.
考生必须能描述ARM处理器的异常入口序列,必须理解并能描述处理器在一个异常入口的状态(如PC、LR、CPSR、SPSR等寄存器),还必须熟悉异常返回的标准指令(不包括ERET)以及对每种异常类型的返回地址的调整。
例如,考生应该知道在处理一个异常时哪些操作是内核自动处理的。更高级别的考试需要知道每个异常类型的标准返回指令。
这些内容将在第13~15章介绍
(6)PSR操作指令
Candidates must know the instructions that allow manual control of the PSRs, which bits may and may not be modified in unprivileged mode.
Example: Candidates should know the instructions which may be used to modify the PSR. More advanced candidates will know how to use these instructions and what their limitations are.
考生必须知道手动控制PSR寄存器的标准指令,以及在非特权级别模式下寄存器的哪些位可以或不可以修改。
例如,考生应该知道用来修改PSR寄存器的指令。更高级别的考试需要了解如何使用这些指令以及它们的限制。
PSR寄存器将在5.3节介绍。在用户模式(非特权模式)下,程序不能修改PSR的用来控制处理器模式的[4:0]位,以及用来管理异常的使能/禁止的A、I和F位。
(7)WFI、WFE、SEV
Candidates should be aware of the ARM hint instructions for entering low power states, what a typical implementation does on executing such an instruction and when they might be used. Candidates should also have knowledge of wakeup conditions from each low power state.
Example: Candidates must be aware of the WFI instruction and that it may not actually do anything. More advanced candidates will be aware also of WFE and of the conditions which cause wakeup from standby mode.
考生应该知道ARM用来进入低功耗模式的隐藏指令、执行这些指令的典型操作以及何时使用它们,还应该了解从每种低功耗状态下唤醒的条件。
例如,考生必须了解WFI指令以及它可能实际并不做任何动作。更高级别的考试需要了解WFE指令以及从休眠模式下唤醒的条件。
这部分知识将在第26章介绍(在12.2.3节中也有描述)。
(8)通用指令集
Candidates must have a good knowledge of the syntax and semantics of ARM and Thumb data processing, branch and load/store instructions. They should be able to recognise and interpret such instructions, and be able to match fragments of C code with their corresponding fragments of assembler code.
Example: Candidates will be familiar with the core instruction set, including operand order, basic syntax and addressing modes. More advanced candidates will be able to map instructions onto C code, including knowledge of literal pools, loop structures, register spilling and simple compiler transformations.
考生必须非常熟悉ARM和Thumb指令的语法和语义,包括数据处理指令、分支指令和加载/存储指令,应该能够识别并解释这些指令,并且能为C语言代码编写合适的汇编代码。
例如,考生需要熟悉内核指令集,包括操作数顺序、基本语法和寻址方式。更高级别的考试要能够将指令映射到C代码,包括代码中的文字池概念、循环结构、寄存器溢出和简单的编译转换。
第6~7章介绍了ARM的汇编语言。考生还可以参考DS-5编译器工具的“ARM汇编编译工具链”文档,这个文档可以从ARM网站下载。在网络上和已出版的相关图书中还有很多介绍ARM汇编语言的辅导资料。
强烈建议考生通过编写汇编语言代码并观察编译器的输出C代码来获得实际应用经验。
对于在考试大纲中提到的文字池的概念,第一次提到是在7.1.1节,它主要是用来表示常数,寄存器泄漏在18.1节介绍,20.3节给出了一些循环结构和编译器转换的例子。
2.电源模式
(1)待机,休眠,关机
Candidates must know the architectural power modes, and understand the progression between these power modes. Candidates are not expected to know the power domains or power-saving features of specific processors or implementations.
Example: Candidates will know that there are different sleep modes and be able to rank them in order of power saving. More advanced candidates will be aware of the progression between these modes.
考生必须了解电源模式的架构并理解这些电源模式的关联,不需要知道特定处理器的电源域或省电特性的实现。
例如,考生要知道有不同的睡眠模式而且能从省电角度来分出级别。更高级别的考试要能理解这些模式的关联。
请参考第26章。
(2)入口/出口
Candidates should be aware of the software requirements for entering and exiting power saving modes (e.g. they should know what state must be preserved and be aware of how this is done).
Example: Candidates will k now about the WFI instruction and when it might be used. More advanced candidates will know what state must be preserved on entry to power saving modes.
考生需要了解进入和退出省电模式的软件需求(例如要知道什么状态必须保存,而且应当知道如何做到)。
例如,考生要了解WFI指令并知道何时使用。更高级别的考试要了解进入省电模式时要保存哪些状态。
请参考第26章。
3.内存模型
(1)访问顺序
Candidates must understand the characteristics of a weakly ordered memory system as used by ARM processors. They should be able to recognize examples of access patterns which could and could not be re-ordered by a processor.
Example: Candidates will know that ARM supports a weakly-ordered memory model and what this means when writing software. More advanced candidates will be able to recognize and analyze access patterns from fragments of code.
考生必须理解ARM处理器使用的弱排序内存系统的特性,应该能识别可以或不可以重排序的访问模式。
例如,考生需要知道ARM支持的是弱排序内存模型以及在编写代码时意味着什么。更高级别的考试需要能识别并分析代码片中的访问模式。
请参考第12章。
(2)内存类型(如普通、设备、严格排序)
Candidates must know the three memory types defined by the ARM architecture. They should understand the characteristics of each, what they are used for and the ordering requirements which result.
Example: Candidates must know the three memory types defined by the ARM architecture and that peripherals should be classed as Device memory. More advanced candidates will know the characteristics and typical use of each memory type.
考生必须知道ARM架构定义的这三种内存类型,应该理解每种内存类型的特性、用于什么场合以及产生的排序结果。
例如,考生必须了解这三种ARM架构的内存类型,外设必须归类为设备类空间。更高级别的考试需要知道每种内存类型的特点以及典型应用。
请参考第12章。
(3)VMSA
① 转换表格式
对这部分不做要求。
② 转换表位置
对这部分不做要求。
③ TLB
Candidates should be aware of the existence, location and purpose of TLBs. They should be aware of circumstances which require TLB maintenance operations.
Example: Candidates must know the purpose of TLBs. More advanced candidates will know that TLB maintenance operations are required and when these must be carried out.
考生应该了解TLB的存在、位置及目的,需要了解什么情况需要使用TLB。
例如,考生必须知道TLB的目的是什么。更高级别考试要了解TLB运行所需的操作以及何时使用。
转换查找缓冲区(TLB)在11.4节介绍。使用操作则在10.5节介绍。
④ OS支持(如ASID)
对这部分内容不做要求。
⑤ 地址转换
Candidates must have an awareness of virtual to physical memory translation, why it is necessary and how it is used by Operating Systems. They should be aware of where the MMU is located in the memory system hierarchy. They should be aware of which cores have virtual memory capability and which do not.
At this level, knowledge of page table and descriptor formats is not required.
Example: Candidates must know what virtual-physical address translation is and what it is used for in an Operating System environment. More advanced candidates will be aware of how Operating Systems use the MMU to achieve this and may be aware of multi-level translation tables.
考生必须理解虚拟内存到物理内存的转换及其必要性,以及操作系统如何使用这种转换,应该理解MMU在内存系统架构中所处的位置,还需要了解哪些内核有虚拟内存、哪些没有。
在初级认证的难度下,对页表和描述符格式的知识不做要求。
例如,考生必须知道虚拟地址到物理地址的转换以及它为何要在操作系统中使用。更高级别的考试需要了解操作系统如何使用MMU来实现这种转换并了解多级转换表。
第11章详细介绍了MMU内存管理单元,MMU是L1存储系统的一部分,因此需要熟悉第10、12章的内容,以便更好地理解MMU的工作。
考生应该尝试实际编程应用MMU,这并非意味着新建一个页表。例如,考生可以运行系统,观察使能MMU和禁止MMU,无地址转换发生并且所有的数据内存访问被视为强顺序访问,因此数据缓存是未使用的。CP15的SCTLR寄存器的M位用于使能或者禁止MMU。
(4)PMSA
Candidates should have an awareness of the features of the PMSA and what it can be used for. They should know which cores have MPUs and which do not. They should be aware of the limitations of a MPU as compared to an MMU.
Example: Candidates should know that an MPU can be used to partition and protect memory regions. More advanced candidates will know the number and usage of these regions.
考生应该理解PMSA的特性及其用途,应该知道哪些内核有MPU、哪些没有,应该理解使用MPU相比MMU的限制。
例如,考生应该知道MPU是用来分开并保护内存区域的。更高级的考试需要知道这些区域的数量以及使用。
本书没有介绍这方面的内容,因为MPU是与Cortex-R/M系列相关的。
在不需要MMU的系统中,ARM提供了MPU,它并不为虚拟地址提供地址转换功能,但可与L1内存系统工作来控制访问L1和外部存储空间。MPU可以将内存分为不同的区域并设置独立的内存属性(普通/设备/强排序、可缓存属性等)以及每个区域的保护属性。MPU通常支持小的、固定数量(如8或12)的内存分区。
每个分区均配置了自己的基地址和大小,而且分区可以重叠以满足内存映射的编程效率。为了支持重叠,分区都分配了优先级。当访问地址位于区域中时,MPU会返回优先级最高的区域属性和访问许可。
(5)Alignment对齐
Candidates must have good knowledge of the data and instruction alignment requirements of the ARM architecture and be aware of the consequences of misalignment in systems with and without an MMU.
Example: Candidates will know the basic code and data alignment restrictions. More advanced candidates will be aware of specific cases (e.g. LDREX, LDRD, VFP) and of the consequences of violating alignment rules.
考生必须清楚ARM架构中数据和指令对齐的要求并了解有MMU和无MMU情况下非对齐的系统影响。
例如,考生需要知道代码和数据对齐额基本限制。更高级别的考试需要理解一些特殊情况(如LDREX、LDRD、VFP)以及违反对齐规则的影响。
请参考17.2节。考生应该熟悉上面提到的几种情况的特殊对齐规则(加载和存储独占指令、加载和存储双精度与浮点指令),可以参考ARM架构参考手册(ARM)或其他汇编文档。
(6)Endianness
Candidates must know what endianness means. They should know the two endian models supported by the ARMv7 architecture. Knowledge of endianness support prior to ARMv7 is not required.
Example: Candidates should know what endianness is and that ARM supports both big-endian and little-endian models. More advanced candidates would know that endianness can be changed at runtime and how to use this feature.
考生必须知道endianness的含义,应该知道ARMv7架构支持两种endian模型。ARMv7架构之前的架构所支持endian的知识不做要求。
例如,考生应该知道什么是endianess以及ARM同时支持的big-endian(大端)和little-endian(小端)模型。更高级别的考试要了解endianness可以在运行时调整并且如何使用这种特性。
请参考17.1节
(7)属性(如可共享属性,可执行属性)
Candidates must know the memory attributes available in ARMv7, (e.g. executability) and understand when and how to apply them in real-world examples.
Example: Candidates should know and understand the read-write and execute permissions. More advanced candidates will know about shareability and how and when to use it.
考生必须知道ARMv7架构的内存属性(如可执行)并理解何时以及如何在真实的应用中使用。
例如,考生应该知道并理解读写和执行权限。更高级别的考试要要知道共享属性以及何时、如何使用。
这部分内容将在11.7节和第12章介绍。
本书并没有介绍在页表中设置的一个重要的属性——XN位(永不执行)。当置位时,它可以禁止从该存储区域的预测取指操作(对外设空间很有用)并产生一个取指中止的异常,表示不应该从该内存地址取指(这对于捕获无效的函数调用产生的问题很有用)。
(8)缓存
Candidates must understand the ARMv7 cache hierarchy (e.g. levels of cache, Harvard vs. unified). Candidate must know the available cache maintenance operations (e.g.Clean, Invalidate) and understand when they are required. Detailed knowledge of the instructions used to carry out these operations, nor how to address individual cache lines, is not required.
Example: Candidates should know caches exist, that they are in a hierarchy, that some are unified while others are Harvard. More advanced candidates will know that maintenance operations are required, what these operations are and in what circumstances they would be used.
考生必须理解ARMv7架构的缓存层级(如缓存的级别,哈弗结构与统一结构),必须知道一些对缓存的操作(如清空、使失效)并理解何时使用,但不需要了解这些详细的操作指令以及如何寻址失效的缓存行。
例如,考生应该知道缓存如何存在,它们的层级关系,其中一些是统一结构的,而另一些是哈弗结构。更高级别考试要了解缓存需要一些维护操作,这些操作是什么以及何种情况下使用。
第10章详细介绍缓存架构。考生应该了解一些实际的应用缓存的经验,例如,可以验证在关闭缓存时系统的性能显著下降。
4.寄存器
(1)VFP
Candidates should be aware that VFP supports a separate register bank. They should be aware of the number and size of these registers. Detailed knowledge of floating point operating and number formats is not required.
Example: Candidates must know that VFP uses a separate register bank. More advanced candidates will know the size, format and behavior of these registers.
考生应该了解VFP拥有一个独立的寄存器表,应了解这些寄存器的数量和大小。关于浮点运算和浮点格式的详细知识不做要求。
例如,考生必须知道VFP使用一个独立的寄存器表。更高级别的考试需要知道大小,格式和这些寄存器的行为。
第8章介绍了ARM的浮点单元。
NEON和VFPv3使用同一寄存器表。这是与ARM的寄存器表独立的。在VFPv3中,可以看到这些寄存器表有32个64位双精度寄存器(D0~D31),以及32个32位单字寄存器(S0~S31,在这种情况下只有一半的寄存器)或者这些寄存器的组合。在VFPv2和VFPv-D16中,提供了更少数量的双精度寄存器(D0~D15)。
(2)NEON
Candidates should be aware that NEON supports a separate register bank. They should know how this overlaps with the VFP registers. Detailed knowledge of NEON operations and instructions is not required.
Example: Candidates must know that NEON uses a separate register bank. More advanced candidates will know the size, format and behavior of these registers.
考生应该了解NEON采用独立的寄存器表以及这些寄存器是如何与VFP的寄存器重叠的,NEON的详细操作和指令不做要求。
例如,考生必须知道NEON使用独立的寄存器表。更高级别的考试需要知道这些寄存器的大小、格式以及它们的行为。
第9章介绍NEON,更高级别的考试还需要参考第21章。
(3)ARM
Candidates must have detailed knowledge of the ARM general purpose registers (R0- R15), including any with special significance/use (e.g. R15 = PC). They should know which are banked between modes.
考生必须了解ARM通用寄存器的知识(R0~R15),包括特殊用途的寄存器(如R15 =PC),还需要了解寄存器在不同模式下存在的分组空间。
请参考5.3节。
(4)系统控制寄存器(如CP14、CP15)
Candidates should be aware that system control registers are accessed via CP15 and debug registers via CP14. Although detailed knowledge is not required, they should be aware of what features are available in VMSA and PMSA processors.
Example: Candidates must know that CP15 is used for system control and CP14 for debug. More advanced candidates will know some detail on specific registers.
考生应该了解如何通过CP15来访问系统控制寄存器、通过CP14来访问调试寄存器。虽然对详细的知识不做要求,但应该了解VMSA和PMSA处理器的特性。
例如,考生必须知道CP15是用来访问系统控制的,CP14是用来访问调试的。更高级别的考试要了解一些特殊寄存器的细节。
这些内容在7.8.1节中有介绍,此外在全书中均介绍了一些特殊寄存器。
5.版本
(1)ARM架构
Candidates must have a high-level knowledge of the evolution of the ARM architecture between ARMv4T and ARMv7-AR. Candidates should be able to identify which architectural features are available in which versions. They should be able to match processors with the architecture to which they conform. Candidates should be aware of what is defined by the architecture (e.g. programmer' s model) and what by the implementation (e.g. pipeline structure).
考生需要深入了解ARM架构中ARMv4T和ARMv7-AR的演变,能识别哪种架构特性在哪个版本中,能够识别处理器属于哪种架构,应该了解架构定义了哪些内容(如编程模型)以及实现了哪些功能(如流水线架构)。
请参考3.1节。
(2)VFP架构
Candidates should be aware of the major differences between the VFPv3 and VFPv4.
Candidates should also be aware of differences between the D16 and D32 variants (i.e. number of registers). Detailed knowledge of VFP function or number format is not required.
考生必须了解VFPv3和VFPv4的主要区别,了解D16和D32模式的区别(如寄存器的数量)。VFP功能和数据格式的详细知识不做要求。
这部分内容在第3章介绍,包含D16和D32模式的双精度寄存器数量的区别。在D16模式中,有16个双精度寄存器,也可以变成32个单精度寄存器;在D32模式中,有32个双精度寄存器(D0~D31)。在Cortex-A5、A7以及A15处理器中支持VFPv4架构的扩展,它在VFPv的基础上扩展了混合乘累加操作和半精度格式转换。
(3)NEON架构
Candidates should be aware of the major differences between versions 1 and 2 of the advanced SIMD extensions. They should also be aware that Advanced SIMD extensions are only available in A class processors. Detailed knowledge of NEON instruction behavior is not required.
考生应该了解高级SIMD扩展的版本1和版本2的主要区别,了解高级SIMD扩展只存在于Cortex-A系列处理器。NEON指令详细的知识要求。
请参考第3章。
(4)兼容性
Candidates must understand the compatibility limitations of code written for the different architecture versions (e.g. ARMv6 code cannot be guaranteed to run on a ARMv5 processor but will run on a ARMv7 processor).
考生应该理解不同架构版本代码的兼容性限制(如ARMv6代码不能保证一定可在ARMv5上运行,但可以在ARMv7上运行)。
请参考第3章。
6.异常模型
(1)模式
Candidates must know the names and functions of the seven basic operating modes.
Knowledge of HYP and MON modes is not required. They should know about register banking, including which registers are banked in which modes. They should know which modes are privileged and which are associated with specific types of exception or interrupt.
考生必须知道7种基本操作模式的名字和功能,HYP和MON模式的知识不做要求;此外还需了解寄存器分组,包括哪些寄存器在哪种模式下有分组,应该知道哪种模式是特权模式,以及与特殊类型的异常或中断相关联。
请参考第5章。
(2)中断
Candidates must understand the differences between FIQ and IRQ, including banked registers, placement of FIQ in the vector table, use with an interrupt controller. Candidates should know how to enable and disable FIQ and IRQ via the CPSR.
考生必须理解FIQ和IRQ的区别,包括分组寄存器、FIQ在矢量表中的位置,以及如何使用中断控制器,应该知道如何通过CPSR使能和禁止FIQ和IRQ。
请参考第13、14章。
(3)中止
① 数据中止
Candidates should know what events can cause a Data Abort exception and what the usual corrective actions are. Knowledge of how to code solutions for these corrective actions is not required. Candidates should be aware of the high-level difference between a synchronous and asynchronous abort.
Example: Candidates must know what events may cause a data abort. More advanced candidates would understand the difference between asynchronous and synchronous aborts.
考生应该知道哪种情况会导致数据中止异常以及如何进行纠正(对这些纠正的代码方案不做要求),应该从高层级了解同步中止和异步中止的区别。
例如,考生必须知道哪种情形导致数据中止。更高级别考试需要理解同步中止和异步中止的区别。
② 预取指中止
Candidates should know what events can cause a Prefetch Abort exception and what the usual corrective actions are. Knowledge of how to code solutions for these corrective actions is not required. Candidates should know and understand why the Prefetch Abort exception is not taken immediately on receiving the error from the memory system.
考生应该知道哪种情况会产生预取指中止异常以及如何进行修正(关于如何修正的具体代码方案不需要掌握),需要知道并理解为何预取指异常并不是在接收到内存系统错误时立即触发。
数据中止和预取指中止在第13章和15.1节中有介绍。
本书并没有介绍更早版本的ARM架构,ARM7TDMI与更早的ARM处理器的一个主要区别是它使用了一个基本更新数据中止模型。更新的ARM设计则使用了一个基本恢复的模型。
基本恢复数据中止模型是指当数据中止异常出现在执行内存访问指令时,处理器硬件会将基址寄存器的值恢复到执行该指令之前。这可以避免数据中止异常处理程序中由于中止指令可能对特定的基址寄存器进行更新而采取的展开基址寄存器操作。这让编写一个可以解决中止和重复执行错误指令的异常处理程序变得简单。
(4)未定义指令
Candidates should know what events can cause an Undefined Instruction exception, how to determine which event has occurred and what the usual corrective actions are for each cause. At this level, knowledge of how to code these solutions is not required.
考生需要知道哪些情形可能触发未定义指令异常,如何确定哪种情形发生以及每种情况发生时通常正确的处理是什么。在这一级别,正确处理的代码编写不要求掌握。
请参考15.2节。
(5)管理员调用
Candidates must know what Supervisor Calls are typically used for, what causes an Supervisor Call exception, how to use the SVC instruction, what happens to the comment field, how to pass parameters to a Supervisor Call exception handler.
Example: Candidates should know what an SVC instruction is used for. More advanced candidates will know how to pass parameters to an SVC handler.
考生必须了解管理员调用的典型用途是什么,哪种情形会触发管理员调用异常,如何使用SVC指令,备注区有何信息,以及如何向管理员调用异常服务程序传递参数。
例如,考生应该了解SVC指令的用途。更高级别的考试应知道如何向异常服务程序传递参数。
请参考15.3节。
(6)SMC
Candidates should know that the SMC instruction exists and that it is associated with entry to Mon mode in TrustZone systems. Detailed knowledge of its behavior is not required.
考生应该知道SMC指令并了解在TrustZone系统中它与进入Mon模式相关,该指令详细的作用不做要求。
请参考27章。
(7)复位
Candidates must know what can cause a system reset (debug, reset pin etc). They should also be aware of configuration options which can be sensed during reset (endianness, vector table location etc).
Example: Candidates must know the behavior and state of the processor on reset. More advanced candidates should know which configuration options can be sensed during reset.
考生必须知道哪些情况会产生系统复位(如调试、复位引脚),还应该了解在复位时的一些配置选项(如endianness、矢量表的位置等)。
例如,考生必须知道处理器在复位时的动作和状态。更高级别的考试需要知道复位时会检测哪些配置选项。
第13、16章将介绍复位异常的处理器行为。
在ARM架构中通常也把复位当做一种异常来考虑,尽管考虑它的异常返回毫无意义,复位是系统的起始,而并非可以返回的位置。本书没有专门列出所有的配置选项,不过HIVECS矢量表的地址在13.5节介绍。在一些处理器中,可能通过类似的样式支持配置endianness位(或者支持非对齐访问)。
(8)HVC
对此方面知识不做要求。
(9)入口顺序
Candidates must know the actions taken by the core during exception entry, including any modifications made to registers.
考生必须知道内核在进入异常时的动作,包括任何对寄存器的修改。
请参考13.3节。
(10)退出顺序
Candidates must know what actions which must be taken in order to return from an exception handler. They should know the standard instructions for returning from each exception type and why these are used in each case.
考生必须知道退出异常处理所需要进行的操作,应该了解从每种异常类型的处理函数中退出的标准指令以及为何要采用。
请参考13.4节。
(11)嵌套/重入
Candidates should be aware that exceptions of different types may be nested easily but that there are issues with return addresses when interrupts are re-entrant. Also that standard good practice is not to make FIQ re-entrant. Detailed knowledge of coding a solution for re-entrant interrupts is not required.
Example: Candidates must know what is meant by a re-entrant interrupt handler and that there are issues with nesting interrupts on ARM systems. More advanced candidates will know what these issues are and be aware of common solutions to them.
考生应该了解不同类型的异常可以很容易地嵌套,但当中断是可重入时返回地址会有问题,此外标准的好习惯是不要让FIQ可重入。关于可重入中断的代码解决方案的知识不做要求。
例如,考生必须知道什么是可重入中断服务以及在ARM系统中嵌套中断的问题。更高级别的考试需要了解这些问题是什么以及通常的解决方法。
请参考14.1.3节。
(12)低延迟中断模式
对此方面知识不做要求。
(13)中断矢量表
Candidates should know the two standard locations of the vector table, how these are selected (HIVECS), that the vector table contains instructions not addresses, that RESET is the first entry and FIQ is the last. Knowledge of extra vector tables in systems implementing the Security Extensions is not required.
Example: Candidates must know that the default location for the vector table is at 0x0 and that it contains instructions. More advanced candidates will know that the vector table can be relocated and to where, and will know the layout of the table.
考生应该知道关于矢量表的两个标准位置,如何进行选择(HIVECS),矢量表中包含的是指令而非地址,以及复位是矢量表的第一个元素,而FIQ是最后一个。关于系统配备的安全扩展部分的额外的矢量表知识不做要求。
例如,考生必须知道矢量表缺省的地址是0x0,它的元素是指令。更高级别的考试要知道矢量表可以重定位到哪里,并知道表的格式。
请参考13.5节。
7.安全扩展
(1)安全监控
Candidates should know that a Secure Monitor is used for handling the transition between Secure and Normal worlds. They should have a general understanding of how monitor mode is used to achieve this. Detailed knowledge of its internal function is not required.
考生应该知道安全监控是用来处理安全模式和普通模式的切换的,应该对如何使用安全模式来实现有一个通常的认识。关于它内部的功能的知识不做要求。
(2)安全异常
对此方面知识不做要求。
(3)安全内存
Candidates should be aware that, in a TrustZone system, areas of memory can be made Secure as the S/NS information is propagated on the external bus. They should understand why this is useful.
考生应该了解在TrustZone系统中,内存的区域可以配置为安全内存,S/NS信息可在外部总线上传递,应该理解为什么这个功能很有用。
请参考第27章。
(4)虚拟化扩展
对此方面知识不做要求。
1.3.4 软件开发
1.同步(如互斥、信号量、互锁)
Candidates should be aware of the need for this kind of construct and be able to insert them in example code sequences. They should be able to read and understand synchronization functions which use LDREX/STREX. They should understand that memory barriers are sometimes required to ensure correct and efficient operation.
考生应该了解这类同步结构的需求以及能够在例程中添加它们,应该能使用LDREX/STREX来进行同步的函数,还应该能够在需要的时候使用内存隔离来确保正确高效的操作。
请参考23.4节。
2.内存管理
(1)缓存维护
Candidates should be aware that operations are required to maintain coherency between contents of cache and main memory. They should understand the terms “flush”, “clean” and“invalidate”. They should know that these operations are achieved via CP15 but detailed knowledge of instructions used to achieve these operations is not required.
考生应该了解保持缓存内容和主存储器内容一致需要一定的维护操作,理解冲刷、清空、使失效等术语的含义,应该知道这些维护操作是通过CP15来实现的,但关于实现这些操作的具体指令的知识不做要求。
请参考10.8节。
(2)隔离
Candidates must know what ISB, DSB and DMB instructions do. They should also be able to determine where these instructions are required in typical use cases.
考生必须知道ISB、DSB和DMB指令的具体功能是什么,还应该知道这些指令分别适用于哪种情形。
请参考12.2节。
3.操作系统架构
(1)SMP和AMP
Candidates should be aware of the principal differences between SMP and AMP systems. Given examples, they should be able to differentiate between them.
Example: Candidates must know what is meant by SMP. More advanced candidates will also understand AMP and be able to differentiate between the two.
考生应该了解SMP和AMP系统原理上的区别,能区分这两种系统。
例如,考生必须知道SMP是什么意思。更高级别的考试还需要理解AMP以及他们两个之间的区别。
请参考第22章。
(2)线程,任务和过程
Candidates should be aware of the meaning of these terms in SMP and AMP systems.
Example: Candidates must know what these terms mean. More advanced candidates will know specifics of how some Operating Systems treat them.
考生应该了解SMP和AMP系统中线程、任务和过程的术语的含义。
例如,考生必须知道这些术语的含义。更高级别的考试要知道特定的操作系统中它们的特定含义。
请参考22.2节。
(3)内核与用户空间
Candidates should be aware that Operating Systems partition memory into Kernel (privileged) and User (non-privileged) regions. They should know that this is configured via the MMU. They should understand that a transition to privileged mode is required to access Kernel space and that this is usually achieved via an exception. They should be aware of typical operations (e.g. memory map maintenance, exception handling) which must be carried out in a privileged mode.
Example: Candidates must know that different privilege levels exist in an Operating System environment. More advanced candidates will know how Operating Systems partition memory and how user programs gain access to privileged operations.
考生应该了解操作系统一般把内存分为内核(特权级别)和用户(非特权级别)两个区域,知道这是通过MMU来配置的,还应该理解要访问内核空间需要内核转换到特权模式,并且都是通过产生异常调用来实现的,应该了解在特权模式下的典型操作(如内存映射维护、异常处理)。
例如,考生必须知道在一个操作系统环境中存在不同的特权级别。更高级别的考试需要知道操作系统是如何分配内存以及用户编程如何获得特权级别的。
特权级别的概念将在第5章介绍,此外还将介绍相关的特权模式的异常处理。内核的内存管理相关概念在第11章介绍。更高级别的考试可以从Linux中syscall的使用来理解用户程序如何获得特权操作(如阅读syscall man的内容)。
(4)BSP
Candidates should be aware that some level of board/device-specific code is usually required by an operating system, and this is usually referred to as a Board Support Package (BSP).
考生应该了解操作系统通常需要一定级别的板级/针对设备的代码,这通常称为板级支持包。
板级支持包的概念在4.1.4节介绍。
4.启动
(1)多处理器启动
对此方面知识不做要求。
(2)使能VFP和NEON
对此方面知识不做要求。
(3)从RAM启动
对此方面知识不做要求。
(4)从ROM启动
对此方面知识不做要求。
(5)从TCM启动
对此方面知识不做要求。
(6)初始化堆栈指针
对此方面知识不做要求。
(7)放置中断矢量表
对此方面知识不做要求。
(8)占用中断矢量表
对此方面知识不做要求。
(9)外设配置
对此方面知识不做要求。
(10)缓存初始化(如TLB转换表、分支预测)
对此方面知识不做要求。
(11)MMU/MPU初始化
对此方面知识不做要求。
(12)安全启动
对此方面知识不做要求。
(13)特性询问
对此方面知识不做要求。
5.ABI
(1)AAPCS、ARM架构过程调用标准
Candidates should be familiar with the AAPCS rules in respect of register usage, parameter passing and result return, stack alignment and register preservation.
Example: Candidates must be aware of the AAPCS register usage rules and the requirement for stack alignment. More advanced candidates will know how parameters are mapped to registers and stack.
考生应该熟悉AAPCS在寄存器使用方面的规则、数传递和返回规则、栈对齐和寄存器保存规则。
例如,必须知道AAPCS的寄存器使用规则和对堆栈对齐的要求。更高级别的考试需要知道参数如何保存在寄存器和堆栈中。
ARM架构过程调用标准(AAPCS)在第18章介绍。重要的是,理解ARM架构中的变量声明的大小可能和其他架构有所不同(int是32位,short是16位,char是8位,双精度浮点是64位),且局部变量可能保存在寄存器中(如果当前使用的局部变量的数量不是太多)或者在堆栈中。
(2)硬/软链接
Candidates should be familiar with the concepts of hard and soft linkage in procedure calls with respect to floating point. Given examples, candidates should be able to differentiate between the two. They should be able to explain why this matters.
This is covered in the Cortex-A Series Programmer' s Guide 18.1.2, although familiarity with Chapter 7 and Cortex-A Series Programmer' s Guide 18.1.1 is assumed.
考生应该熟悉在浮点处理的过程调用中硬链接和软链接的概念,应该能够区分两者,能够解释为什么这很重要。
这部分在18.1.2节中介绍,在第8章和18.1.1节也有提及。
浮点运算可能使用硬件协处理器指令或者库函数,而浮点数链接则涉及浮点变量的函数之间传递参数。
软浮点链接是指函数的传递参数和返回值使用ARM的整数寄存器R0~R3及堆栈,硬浮点链接则使用VFP协处理器的寄存器来传递参数和返回值。使用软浮点链接的好处在于代码可以在没有VFP协处理器的内核上编译链接执行,这一点对于要编译一个可以同时在有浮点协处理器和无浮点协处理器上运行的函数库来说非常重要。使用硬浮点链接的好处是它比软浮点链接效率更高,但它只能运行在有浮点协处理器的系统上,而且所有的目标代码/函数库都必须编译成使用硬浮点链接。
(3)堆栈对齐(异常处理入口)
对此方面知识不做要求。
6.编译器
(1)自动矢量化
Candidates must know what vectorization is and that the compiler can do this automatically. They should be aware of what properties of a loop make this easier and more efficient for the compiler. They should know that certain combinations of compiler options may be required to enable this feature.
Example: Candidates must know what vectorization is. More advanced candidates will know how to write code and configure the compiler in order to facilitate this.
考生必须知道什么是矢量化以及编译器可以自动进行矢量化,了解循环的什么性能可以使得编译器的矢量化更容易以及效率更高,知道使能这种特性,必须会使用编译器的一些组合选项。
例如,考生必须知道什么是矢量化。更高级别的考试要了解如何编写代码以及配置编译器来实现这一特性。
在21.1.1节介绍了矢量化。编译器可以自动对源代码进行矢量化。由于C语言并没有并行特性,可能不得不告诉编译器在哪里进行这种动作更安全。这将需要用到关键字_restrict来保证指针不会寻址内存的重叠区域。
读者可以不用牺牲代码在不同平台或工具链上的可移植性就实现这点。
例1.4
http://infocenter.arm.com/help/topic/com.arm.doc.dht0002a/ch01s04s03.html#CACEHEAG链接给出了一个简短的函数,编译器可以安全地进行矢量化。这是因为编程者使用了关键字_restrict来保证指针pa和pb不会寻址到重叠的存储空间。
同样必要告诉编译器的是对于一个for循环来说(如下面类似的例子),对n的最低2位做屏蔽,将产生一系列乘4的迭代。
for(i = 0; i < ( n & ~3); i++)
两种编译器所必要的语法不同;在GCC编译器中必须加上“-mfpu=neon”以及“-ftree-vectorize”。而在一些工具链版本中,还必须加入“-mfloat-abi=softfp”来声明NEON变量必须在通用寄存器中传递。对于ARM编译器,读者必须指定包含NEON技术的目标处理器,编译器的优化等级大于等于“-O2”,以及增加“-0time”和“-vectorize”到编译命令行中。
(2)内部函数
Candidates should know what an intrinsic function is and why they are to be preferred to writing native assembly code. They should be aware that a large number of intrinsics are supported by the C compiler and be able to explain what certain example functions do.
Example: Candidates must know what is in intrinsic function and that the C compiler supports a large number of them. More advanced candidates will know how to use some of these functions.
考生应该知道什么是内部函数以及为何倾向于用汇编代码来实现它们,了解C编译器提供了大量的内部函数并能解释这些函数的作用。
例如,考生必须知道内部函数中有什么以及C编译器支持大量的函数。更高级别的考试要了解如何使用其中一些函数。
NEON的内部函数在21.1.3节介绍,其他的函数(如隔离和信号指令)在其他章节(如12.2节)。内部函数通常都使用无对应C语言操作符的ARM汇编语言函数。这样要么可以得到系统级的特性,要么可以更高效率地实现算法(如NEON的函数)。
(3)编译选项
Candidates should be aware of: Space/time optimization; Optimization level; C90/c99/cpp;Architecture/CPU specification.
考生需要了解时间/空间优化、优化等级、C90/c99/cpp、架构/CPU特定规格。
考生应该熟悉所使用的编译器中这些相关编译选项。GCC优化选项(如-O1, -O2)在20.1.5节介绍。-arch和-cpu的选项在两种编译选项中类似。在gcc中,一个特定的选项是“-std=c90”,而在armcc中,对应的选项是“-c90”或者“-c99”。
(4)ARM/Thumb状态
Candidates should know that it is possible to configure a compiler for ARM or Thumb compilation. They should be able to make sensible suggestions for when to use each instruction set.
Example: Candidates must know that it is possible to compile for ARM or Thumb. More advanced candidates will be able to make suggestions as to when each option is appropriate.
考生应该知道可以配置编译器的ARM或Thumb编译,能清晰地指出何时采用哪种指令集。
例如,考生必须知道可以编译ARM或者Thumb。更高级别的考试应该能够知道恰当的使用每种指令集。
这一部分内容并没有在本书中系统地说明,对于Cortex-A系列处理器来说,通常优先使用Thumb指令集的Thumb2扩展,而对于Cortex-M系列处理器则只支持Thumb指令集。
在较早的ARM处理器中,系统通常包含编译成ARM状态的代码和编译成Thumb状态的代码。32位ARM指令的功能更强,且实现特定任务所需的指令数量更少,所以一般用于系统中对性能要求较为苛刻的部分。另外,它还用于异常处理的代码,因为异常不能在Thumb状态下处理,如ARM7和ARM9系列处理器。
16位的Thumb指令在处理同样的任务时,相比ARM指令需要更多数量的指令。Thumb代码通常可以很容易在指令中编码较小的常数,因此有较短的相对跳转分支。这个相对的跳转分支对于ARM指令来说大约为±32MB的距离,而对于Thumb-2来说则为±16MB的距离。Thumb更限制了只有16位的指令,且条件相对跳转分支的范围为±256 B,无条件相对跳转的范围限制在±2048 B。
然而,由于Thumb指令只需要一般的空间存储,整个程序大小比相当的ARM程序减小1/3,因此Thumb指令通常被用于增加代码密度减小系统容量需求。当处理器直接连接16位存储空间且没有缓存的帮助时,Thumb代码的优势则更为明显。一个Thumb指令可以在一个周期内取出,而一个32位的ARM指令则需要2个时钟周期。
当执行一个Thumb指令时,PC程序指针每次从当前指令位置增加4。仅有的可以直接修改PC指针的16位Thumb指令是MOV和ADD。写入PC寄存器的值会被强制进行半字对齐,忽略数值的最低位并强制为0。
在ARMCC中,编译选项“-thumb”或“-arm”(缺省)可以用来选择编译器所用的指令集。
(5)交叉编译和本地编译
Candidates must know the difference between Cross compilation and Native compilation, and recognize advantages and disadvantages of each.
考生必须知道交叉编译和本地编译的区别,并知道它们的优缺点。
4.1.3节介绍了交叉编译和本地编译及其优缺点。
7.链接器
(1)动态和静态
Candidates must know the nature of the difference between Static and Dynamic linkage. They should be aware that dynamic linkage is usually used in OS environments while static linkage is used for bare-metal applications.
考生必须知道静态和动态链接的本质区别,了解动态链接通常用于操作系统环境,而静态链接常用于裸机程序应用。
在编译代码时,工具会把源代码编成目标代码模块,链接则把它们组合成可执行的程序。这一链接过程可以链接不同语言源代码(如汇编)或者编译好的库文件,不过它不一定有源代码,如果一个文件是静态链接生成的可执行程序,那表明文件的内容就包含在可执行程序中;在动态链接中,一个指向目标的指针包含在可执行程序中,但目标文件本身并不包含在其中,而是在程序在线运行时,把所需要的动态链接文件放入内存中的程序中。
静态链接文件是在链接时固定下来的且不可改变,而程序所调用的动态链接文件则可以通过直接修改文件内容而改变,因此改变文件的函数功能不需要通过重新链接程序的代码。
(2)内存布局
Candidates must be aware that they can provide a description of memory layout to a linker, and understand when and why this is necessary. They are not expected to know the format used by a particular tool.
考生必须能够给链接器提供一个内存布局的描述,并理解何时以及为什么要提供,无须知道具体特定工具描述内存布局所使用的格式。
在很多系统中,程序员有必要给链接器指定内存系统布局。例如,链接器需要知道系统中用来保存变量的RAM的位置以及用来保存可执行代码的ROM的位置,这些信息可以通过命令行选项或者scatter文件来传递给链接器。
ELF镜像文件会包含程序的各段、区域、输入片和输出片。输入片是输入目标文件的单独的一个片段,它包含代码、初始化数据、以及用来描述不需初始化的内存片段或在代码执行前必须设置为0的片段,这些性质都由诸如RO、RW和ZI等属性来标明。链接器通过这些属性来把各片段组成更大的块,即输出片和区域。一个输出片是由一系列相同RO、RW或ZI属性的输入片被链接器放置在一块连续的内存而构成的,一个区域则是由一系列连续顺序的放置在物理存储空间(通常是ROM或RAM)的输出片构成的。一个程序段对应于一个加载区域并包含输出片,程序段包含诸如代码文本和数据的信息。
输出片可以是RO(只读)、RW(可读写)或者ZI(初始化为0)的属性,只读区域的例子有程序中包含的常数;可读写区域的例子有一般的初始值不为0的变量,而这个初始值必须保存在镜像中,但这个变量需要放置在执行代码可以改变其值的地方;ZI区域的例子有初始值为0或没有指定的程序变量。
一个镜像可以包含一系列的不同区域和输出片,每个区域可能在内存中有用来存储的位置和一个不同的用来执行的位置(对于动态加载,或者为了加速代码执行在启动阶段从ROM复制到RAM)。独立于位置的代码或可重定位的代码是可以在运行时改变执行地址的。
(3)入口点
Candidates should know what constitutes an “entry point”. They should know why it is necessary to define entry points e.g. to indicate to the debugger where execution starts, or to prevent unwanted deletion of unreferenced sections. They should know the various methods of defining these to the linker.
考生应该知道一个入口是由什么构成的,知道定义入口的必要性,例如告诉调试器从哪里开始执行,或者防止对没有调用的片区的误删除,还应该知道链接器定义入口的几种方法。
例如,考生必须知道什么是入口而且链接器不能删除它。更高级别的考试要理解在链接时如何定义入口。
入口是镜像中程序执行的起始位置,镜像的初始入口是镜像执行起始的唯一位置。读者必须为程序指定唯一的初始入口点,否则链接器会输出告警信息。不是所有的源代码都有入口,一个源代码文件不允许有多个入口,初始入口点必须位于可执行区域,不能与其他的可执行区域重叠,而且必须是根执行区域(加载地址与执行地址一致)。
可以在汇编代码中使用“ENTRY”指令来指定多个入口点,在嵌入式系统中,这个指定用来标记处理器异常向量表(如复位、IRQ和FIQ)之后的代码,可以使用ENTRY关键字标记输出代码段,这将告诉链接器在进行裁剪未使用片段时不要删除该片段。对于C和C++程序,C库中的__main()函数是入口点。命令行中“-entry”也可以用来指定初始入口点,例如,“-entry 0x0”可以用于位于0地址的ROM的嵌入式系统。
链接器会从镜像中删除没有被使用的数据和代码段。如果没有指定入口,那么就无法识别没有被使用的片段。
(4)软件浮点库
Candidates should know that options exist for support of floating point in software.
考生应该知道软件上存在支持浮点运算的选择。
请参考第8章。
8.C函数库
(1)重定向
Candidates should be aware of the concept of semihosting, of why it is important to remove it before producing final code and of how to retarget basic functions in the C library. Exhaustive knowledge of these functions is not required.
考生应该了解半主机的概念,为什么在生成最终代码前一定要删除它,以及如何重定向C库中的基本函数。对这些函数的详尽了解不做要求。
(2)配置(如栈、堆)
Candidates should be aware of the possible heap and stack configurations (one-region, two region) and how these are configured. Candidates are not required to know precise details of how to achieve this using different tool chains.
Example: Candidates must know that stack and heap occupy separate regions of memory. More advanced candidates would know how to configure this in the final image.
考生应该了解堆和栈有哪些配置(一个区域、两个区域)以及如何配置,无须知道使用不同工具链的详细配置方法。
例如,考生必须知道栈和堆占用不同的内存区域。更高级别的考试需要知道如何在最终的镜像中配置这些。
栈是用来保存代码执行流过程中的临时数据用的,在ARM处理器,都是支持从特定地址向下生长的栈。堆则是用来动态分配内存的,ARM工具可以支持用在scatter文件中为链接器指定区域名称来配置堆和栈的起始地址,或者通过重定向“__user_initial_stackheap()”或“__user_setup_stackheap()”函数来配置。ARM工具支持两种类型的堆和栈:在单区域模型中,堆和栈共享一个内存空间,堆从内存空间的底部起始向上增长,而栈从内存空间的顶部向下生长;在双区域模型中,堆和栈拥有各自独立的内存空间,这些区域可以位于内存中任何合适的位置,堆仍然在它的区域内向上增长而栈在它的区域内向下增长。
在ARM架构的应用程序二进制接口(ABI)中要求栈在所有的外部接口必须是8字节对齐的,比如在不同源代码文件的函数之间的调用。然而,在内部调用中则不要求栈是8字节对齐的,比如在叶函数(叶函数是一系列多级函数调用的最底端函数,它不再调用其他函数),这样会导致当中断或异常产生时,堆栈可能不是8字节对齐的。
一般通常的栈顶指针都设置在RAM空间的顶点。例如,如果系统的内存地址从0到0x7FFF,那么R13的初始值可以设为0x8000,这意味着从0x7FFC起始的4字节是作为栈的第一个空闲位置。
(3)库(如裸机程序和操作系统、C函数库)
Candidates should be aware of the need for standard libraries, and understand that different implementations of the libraries are needed for bare-metal or Operating System environments.
Example: Candidates must know that here are several variants of the standard library. More advanced candidates would know what the differences are between these variants.
考生应该了解标准库的需要,并理解对于裸机程序或操作系统环境来说标准库是不相同的。
例如,考生必须知道有不同的标准库。更高级别的考试要了解这些库的不同点。
标准C库是在ANSI规范中为C语言定义的,用来为通常的任务提供诸如输入/输出、字符串处理、数学运算以及内存分配等功能函数。
基于不同的原因可能会有不同的实现库的方法。由于嵌入式系统通常只有很小的内存资源,可能会使用更小版本的库(如newlib),在这些库中有的函数被省略,或者只有较少的选项可配置。库的不同通常都是基于特定的操作系统/编译器的。
例如,GNU/Linux拥有的是典型的glibc标准库,嵌入式ARM库可能使用软浮点或者硬浮点,可能使用大端或者小端,可能采用ARM状态或者Thumb状态。此外,在本章的前面部分介绍过,库可能与应用程序静态链接或者动态链接。
9.目标
(1)模型(如PV和CA)
Candidates must know what types of ARM CPU model are available to them as software developers and be able to recognize advantages and disadvantages of each, as well as the advantages and disadvantages of using them over Development Boards and Final Hardware. They are not required to have knowledge of products from any specific company.
考生必须知道ARM CPU模型为软件开发者提供了哪些类型,并且知道每种类型的优缺点,以及在开发板和最终硬件平台上使用它们的优缺点。考生无须了解特定公司的相关产品技术知识。
ARM处理器的模型可以用来在缺少真实硬件的情况下进行软件开发。这些模型让系统可以在个人电脑上模拟系统并提供准确的模拟处理器,以及它所连接的内存和外设。这些模型可以提供有用的调试功能,让开发者在没有JTAG调试器的情况下可以观察寄存器和变量的值。当然,模型的运行速度远低于真实的硬件,通常来说,它启动Linux需要非常长的时间。
ARM的DS-5产品包含一个实时系统模型(RTSM),可以让在一台个人电脑上的系统模拟达到250 MHz的速度。除了处理器本身,它还可以使用主机电脑的资源来模拟诸如LCD控制器、键盘、鼠标、触摸屏、串口以及以太网控制器等外设。为了裸机应用或Linux内核开发的调试,DS-5提供了使用CADI连接的停止模式调试,以及专为Linux应用开发的使用gdb server连接的运行模式调试。
(2)开发板
Candidates must know what types of Development Board are available to them to target as software developers, and be able to recognize advantages and disadvantages of each, as well as the advantages and disadvantages of using them over Models and Final Hardware. They are not required to have knowledge of products from any specific company.
考生必须知道软件开发者可以使用哪些类型的开发板,并知道每种类型的优缺点,以及使用开发板而非模型和最终硬件的优缺点。考生无须熟悉任何特定半导体公司的产品的知识。
(3)最终硬件
Candidates should be able to recognize advantages and disadvantages of using Final Hardware over Models and Development Boards. They are not required to have knowledge of products from any specific company.
考生必须知道使用最终硬件与模型和开发板之间的优缺点。对任何特定公司的产品的知识不做要求。
市面上有非常丰富的使用ARM Cortex-A系列处理器的低成本开发板,建议考生基于这些硬件运行一些实际代码来获取经验。4.5节列出了一些合适的板子,但市面上还有更多、更新的板子。
1.3.5 系统
本节介绍系统部分的要求。
1.GIC架构
(1)分布模型
Candidates should be aware that multiprocessor systems require an interrupt controller/distributor such as a GIC. They should be aware of and know the differences between 1-N and 1-1 interrupt distribution models.
考生应该了解多处理器系统需要一个如GIC一样的中断控制/分布器,了解1-N(一对多)和1-1(一对一)中断分布模型的区别。
通用中断控制器GIC在14.2节和23.3节介绍。GIC主要存在于Cortex-A的多内核系列处理器中,属于ARM处理器的私有总线接口上的设备。它在单处理器和多处理器系统中管理中断,且本质上由一个在多处理器间共享的分布器加上一个或多个独立的私有处理器接口构成。
1-N(一对多)与1-1(一对一)分布模型的区别在于,1-N模型中一个中断会被发布给所有的处理器,而在1-1模型中,每个中断只会传递给一个处理器。
(2)优先级管理
Candidates should be aware that the priority of interrupts is configured via the GIC, how many levels of priority are available and what effect this has on interrupt handling.
考生应该了解中断优先级是通过GIC来配置的,有多少个中断优先级,以及优先级对中断处理的影响。
GIC的优先级管理在14.2.1节简单介绍。
(3)中断状态模型
Candidates should know the possible states of an interrupt as it is handled via the GIC, together with the necessary actions which are taken in each state. They should be aware of what causes transitions between states.
考生应该知道在GIC处理时一个中断可能存在的状态,以及在每个状态下进行的必要动作,了解什么条件会导致状态切换。
GIC的中断状态模型在14.2节提及。
(4)软件触发中断
Candidates should be aware that the SGI mechanism exists within the GIC and what it might be used for.
考生应该了解GIC中存在软件触发中断SGI机制及其用途。
SGI可以通过写软件触发中断控制器(ICDSGIR)来产生,它主要用于做处理器间通信。
2.软件存储和上传
(1)Flash
Candidates must know what types of code and/or data are typically stored in Flash memory, and what the advantages and disadvantages of Flash memory are over other types of storage. They should also have a basic (high-level) understanding of how code and/or data are uploaded to Flash memory (e.g. that a specific algorithm is required to program it and that this is usually achieved by running a dedicated programming routine on the target hardware).
考生必须知道什么类型的代码和/或数据通常存储在Flash,以及使用Flash来存储而非其他存储器的优缺点,还应该对代码和/或数据如何加载进Flash存储器(如对Flash进行编程需要特殊的算法且通常需要在目标硬件上运行一段特殊的代码流)有一定的了解。
Flash存储器是非易失性存储器,可以电可擦写以及重复写入。Flash的擦写次数是有限的,重写Flash需要特殊的软件算法。
有两种主要类型的Flash存储器,名字来源于所使用的NAND和NOR逻辑门。NAND Flash的位在擦除后变为1,而NOR Flash的位在擦除后变为0。
NAND Flash可以在一个页范围(小于整个存储器空间)内进行读写,这与磁盘的读写类似。页的大小通常为512~4096 B。存储器可以支持每个块的擦除,一个块通常包含32到128个页。Flash设备通常有一些ECC校验机制。NOR Flash支持随机读操作并且可以支持代码直接在此设备上运行,而对于NAND设备则只能把代码从NAND复制到内部RAM来执行。NOR Flash要比NAND成本高,通常用来存储诸如启动代码,而NAND Flash则多用于USB“闪存盘”或存储卡。
(2)可移除
Candidates should know the common types of removable storage, and what types of code and/or data are typically stored in them. They should know what the advantages and disadvantages of removable storage are over other types of storage. They should also have a basic (high-level) understanding of how code and/or data are uploaded to removable storage.
考生应该了解可移除存储器的常用类型,以及通常用来存储哪些代码和/或数据,应该知道使用可移除存储器相比其他类型存储器的优缺点,还应该对如何将代码和/或数据存储到可移除设备有基本的认识。
计算机系统通常有许多可移除存储媒介,常用的包括CD或DVD,软盘以及存储卡。这些媒介相比系统内存来说提供了大容量的存储空间,但需要更长的读取时间。
(3)网络存储
Candidates should know the common types of network storage, and what types of code and/or data are typically stored in them. They should know what the advantages and disadvantages of network storage are over other types of storage. They should also have a basic (high-level) understanding of how code and/or data is uploaded to network storage.
考生应该了解网络存储的几种通常的类型,以及哪些类型的代码和/或数据可以存储在上面,应该知道网络存储相比其他类型存储的优缺点,应该对如何将代码和/或数据存储到网络设备上有基本的认识。
网络存储是指计算机系统可以将代码和/或数据(通常是文件级别)存储到通过网络连接的外部设备上。这些设备可能是一个或多个的硬盘驱动器(通常采用纠错冗余方式来组织),这些文件典型地都是通过诸如NFS或SMB的协议来访问。
3.电源管理
Candidates must be aware of the four basic power modes support by ARM cores (Run, Standby, Dormant, and Shutdown), of the comparative power saving available in each mode and of when these states might be used in a typical system. They should be aware of what system state is preserved in each state and of the comparative complexity and cost of entering and exiting each state. Detailed knowledge of entry/exit sequences is not required, nor is knowledge of any external PMC support circuitry.
考生必须了解ARM内核所支持的4种基本电源模式(运行、待机、休眠、关机),了解每种模式的省电级别以及何时运用于一个典型的系统中,应该了解在每种状态下保存了哪些系统状态,以及进入和退出每种状态的复杂性和消耗的比较。关于进入和退出状态的详细步骤不做要求,任何外部PMC所需的电路知识也不做要求。
请参考第26章。
4.内存系统层级
(1)集成和非集成缓存(POC和POU)
Candidates are not expected to demonstrate knowledge of this subject.
对这部分内容不做要求。
(2)缓存层级
Candidates should be aware that systems frequently have more than one level of cache and the differences between unified and Harvard caches. The terminologies and topologies of simple example architectures should be known. They should know the cache topologies of some common systems, for example, the Cortex-A8 processor.
考生应该了解系统由多个缓存级别以及统一和哈弗结构缓存的区别,还应该知道简单例程的架构的名称和拓扑结构,应该了解一些常用系统的缓存拓扑结构,如Cortex -A8处理器。
请参考第10章。
(3)内存映射
Candidates should be aware of the constraints of memory map structures and be able to distinguish between common/desirable physical memory maps for ARM-based systems and those that are uncommon/undesirable.
考生应该了解内存映射结构的限制,并能够区分普通/特定的ARM系统物理内存映射与非常规/非特定的物理内存映射。
通常,Cortex-A系列处理器的物理内存映射不是由架构固定的,因此主要考虑的是确保复位异常的向量在启动时位于0地址(或者0xFFFF 0000),也许还需确保矢量表位于RAM中,以保证相比位于Flash和ROM更快速的执行。这些在访问诸如GIC、定时器之类的私有内存空间的位置时需要仔细考虑。
Cortex-R系列和Cortex-M系列处理器有典型的缺省内存映射。Cortex-R系列处理器(以及ARM11和ARM9系列处理器)会包含紧密耦合内存(TCM)。一些系统要求快速的、确定性的访问含有关键代码和数据的内存。TCM用来提供低延迟访问内存,位于处理器的局部总线(属于L1内存系统),不会有由缓存造成的不可预知访问时间。通常处理器有典型的2个分立的TCM模块提供给指令通道和数据通道,在一些特定的处理器中,每个TCM还被分为2个独立访问的块。
TCM可以用来保存关键代码,如中断处理函数或者实时任务,对于这些部分来说不建议采用具有不确定性的缓存,它还可以用来保存不适合保存在缓存的临时数据,以及诸如中断堆栈的关键数据结构。
不像缓存空间,TCM构成处理器的物理存储空间映射,TCM的状态和控制可以通过特定的CP15寄存器。这些寄存器可以配置TCM的基地址,还可以让代码读取它的容量。
1.3.6 软件优化
这一部分介绍软件优化。
1.综述
(1)PMU
Candidates should be aware that ARMv7-AR cores implement a set of hardware performance counters. They should be aware of the types of event which can be counted, of combinations of counts which can provide useful information and of the use of interrupts to extend the range of the counters. They should know that use of the performance counters is non-intrusive.
Example: Candidates must be aware of the PMU and its basic purpose. More advanced candidates will be aware of some of the events which can be counted and the kind of information which they can be used to derive.
考生应该了解ARMv7-AR内核配备了一套硬件性能计数器,了解可以被计数的事件类型,可以提供有用信息的计数组合,以及使用中断进行计数扩展,应知道使用性能计数是非侵入式的。
例如,考生必须了解PMU和它的基本目的。更高级别的考试要了解可以用来计数的事件以及这些事件可以提供的信息。
Cortex-R和Cortex-A处理器包含有一个性能监控单元(PMU),用于进行标准性能测试和代码性能分析。这让代码分析可以提供有用的统计信息,如循环和指令计数等。PMU有一个循环计数器,可以配置成每个处理器循环或者每64个循环增加一个计数。它还包含一些可配置的事件计数器,可以用来计算所选定的事件次数(如指令执行、数据缓存缺失、分支预测失败等)。不同的处理器所配备的计数器的个数以及可计算的事件范围都各不相同。
软件或调试工具可以通过访问CP15来进行配置和访问性能计数器。因此,应该在进行性能标准测试后检查性能计数器是否溢出。有必要通过软件技术来使能计数更多数量的事件。例如,有可能让处理器在计数值溢出后自动触发中断从而通过软件来增加计数变量并复位PMU计数器。
(2)低功耗的代码编程技术
Candidates should be aware of simple coding techniques to minimize external memory accesses, minimize instruction count and make use of available power modes. They should be aware that these are all techniques which may be used to reduce power consumption.
考生应该了解用以减小外部内存访问的简单代码技术、减小指令数量的技术以及使用电源模式的技术,了解这些是可以用以减小系统功耗的技术。
减少需要执行的代码数量来实现任务,以及减少访问外部存储器都可以用来降低系统功耗,尤其是访问片外内存需要更大的功耗。第20章介绍这部分知识。
(3)高性能代码编程技术
Candidates should be aware of simple coding techniques which may be used to improve performance. For example, using integers for data processing operations, passing no more than four parameters, writing decrementing loops to zero, naturally aligning data.
考生应该了解用来提高系统性能的简单代码技术,例如,使用整型数据做数据处理操作,尽量不要传递4个以上参数,使用递减到0的循环,自然保持数据对齐。
请参考第20章。
(4)紧凑代码尺寸的编程技术
Candidates should be aware of simple coding techniques which may be used to reduce memory footprint of code and data. For example, use of _packed to reduce padding in structures, configuring the compiler to optimize for code size, using Thumb code.
考生应该了解用来减少代码和数据尺寸的简单代码技术,例如,使用_packed来减少结构中的空缺填补,配置编译器来优化代码大小,使用Thumb指令。
请参考第20章,应该了解“-0space”的命令行选项可以用来告诉编译器来为减小内存使用进行优化。应该理解16位的Thumb指令集让Thumb代码可以相比同级别的ARM指令显著降低代码大小。17.3.2节描述了结构、填补以及_packed属性的知识。
(5)对缓存敏感的编程
对这部分内容不做要求。
2.识别性能瓶颈的技术
(1)概要分析
Candidates must know what profiling is and, given a description of an application performance problem, the candidate should know what can be learned and what cannot be learned from profiling the application.
考生必须了解概要分析是什么,以及对于一个应用性能的问题,知道对应用的概要分析可以获得以及不能获得哪些信息。
请参考第19章。
(2)CPU变频
Given a description of an application performance problem, the candidate should know what can be learned and what cannot be learned from changing the CPU frequency.
对于一个应用性能问题的描述,考生应该知道通过改变CPU频率可以获得什么以及不能获得什么。
在许多系统中,处理器的时钟频率都是性能的瓶颈,因此,提高处理器时钟速度可以增强系统的性能。相反地,如果提高处理器的时钟速度不能增强系统的性能,就说明处理器的时钟速度并不是系统性能的限制因素,从而需要检查系统给的其他部分。例如,可能是访问某特定外设的延迟,或者不足的系统内存带宽影响了系统性能。
(3)任务执行时间
Given a description of an application performance problem, the candidate should know what can be learned and what cannot be learned from measuring the wall clock time elapsed for different parts of the application. They should know when this method is not suitable (e.g. when using a model).
对于一个应用性能方面的问题,考生应该知道测量应用中不同部分的任务执行时间可以获得什么信息以及无法获得什么信息,知道何时不应该使用这种方法(如使用模型时)。
测量“真实”的时间消耗通常仅对在真实硬件上运行的软件有意义。一个处理器的仿真模型可能运行低于1 MHz的时钟,而且速度可能被主机上的其他不相关部分所影响。