arm_arma - CSDN
arm 订阅
英国ARM公司是全球领先的半导体知识产权(IP)提供商。全世界超过95%的智能手机和平板电脑都采用ARM架构 [1]  。ARM设计了大量高性价比、耗能低的RISC处理器、相关技术及软件。2014年基于ARM技术的全年全球出货量是120亿颗,从诞生到现在为止基于ARM技术的芯片有600亿颗 [2]  。技术具有性能高、成本低和能耗省的特点。在智能机、平板电脑、嵌入控制、多媒体数字等处理器领域拥有主导地位。2016年7月18日消息,日本软银已经同意以234亿英镑(约合310亿美元)的价格收购英国芯片设计公司ARM。软银认为,凭借这笔收购,ARM将让软银成为下一个潜力巨大的科技市场(即物联网)的领导者。这笔交易将在周一早晨宣布。软银和ARM暂时都未对此发表评论。 [3] 展开全文
英国ARM公司是全球领先的半导体知识产权(IP)提供商。全世界超过95%的智能手机和平板电脑都采用ARM架构 [1]  。ARM设计了大量高性价比、耗能低的RISC处理器、相关技术及软件。2014年基于ARM技术的全年全球出货量是120亿颗,从诞生到现在为止基于ARM技术的芯片有600亿颗 [2]  。技术具有性能高、成本低和能耗省的特点。在智能机、平板电脑、嵌入控制、多媒体数字等处理器领域拥有主导地位。2016年7月18日消息,日本软银已经同意以234亿英镑(约合310亿美元)的价格收购英国芯片设计公司ARM。软银认为,凭借这笔收购,ARM将让软银成为下一个潜力巨大的科技市场(即物联网)的领导者。这笔交易将在周一早晨宣布。软银和ARM暂时都未对此发表评论。 [3]
信息
员工数
3300 (2014年)
CEO
沃伦·伊斯特
总部地点
英国剑桥
外文名称
Advanced RISC Machines
经营范围
电子半导体微处理器智能手机
公司名称
ARM
ARM企业简介
ARM Holdings 是全球领先的半导体知识产权(IP)提供商,并因此在数字电子产品的开发中处于核心地位。ARM 公司的总部位于英国剑桥,它拥有 1700 多名员工,在全球设立了多个办事处,其中包括比利时、法国、印度、瑞典和美国的设计中心。 [4] 
收起全文
精华内容
参与话题
  • ARM详细介绍

    千次阅读 2016-10-13 09:51:19
    计算机体系结构分类 两种典型的结构:  冯·诺依曼结构  哈佛体系结构 冯·诺依曼结构 ...冯·诺依曼机:将数据和指令都存储在存储器中的计算机。...计算系统由一个中央处理单元(CPU)和一个存储器组成。...

    计算机体系结构分类
    两种典型的结构 
    ·诺依曼结构
     
    哈佛体系结构

    ·诺依曼结构
    ·诺依曼机:将数据和指令都存储在存储器中的计算机。 
    计算系统由一个中央处理单元(CPU)和一个存储器组成。存储器拥有数据和指令,并且可以根据所给的地址对它进行读或写。因此程序指令和数据的宽度相同;如:Intel 8086ARM7MIPS处理器等

    哈佛体系结构 
    哈佛机:为数据和程序提供了各自独立的存储器。
     
    程序计数器只指向程序存储器而不指向数据存储器,这样做的后果是很难在哈佛机上编写出一个自修改的程序
     
    独立的程序存储器和数据存储器为数字信号处理提供了较高的性能。
     
    指令和数据可以有不同的数据宽度;具有较高的效率;如摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ARM10系列等
     
    ARM 7
    使用冯·诺依曼体系结构。
     
    ARM 9
    使用哈佛体系结构。

     

    ARM公司简介 
    ARM
    Advanced RISC Machines的缩写,它是一家微处理器行业的知名企业,该企业设计了大量高性能、廉价、耗能低的RISC (精简指令集)处理器。 1985年第一个ARM原型在英国剑桥诞生。
     
    公司的特点是只设计芯片,而不生产。它提供ARM技术知识产权(IP)核,将技术授权给世界上许多著名的半导体、软件和OEM厂商,并提供服务。有ARM7/ARM9等多个版本。除了一些Unix图形工作站外,大多数ARM核心的处理器都使用在嵌入领域。
     
    ARM
    ,既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。

    ARM处理器的应用 
    到目前为止,基于ARM技术的微处理器应用约占据了32位嵌入式微处理器75%以上的市场份额。
     
    全球80%GSM/3G手机、99%CDMA手机以及绝大多数PDA产品均采用ARM体系的嵌入式处理器。
     
    掌上计算相关的所有领域皆为其所主宰。
     
    主要应用:消费类电子,无线、图像应用开放平台、存储、自动化、智能卡、SIM卡等。
     
    ARM
    处理器的三大特点:耗电少功能强、16/32位双指令集、众多合作伙伴。

    ARM体系结构版本 
    ARM
    体系结构从最初开发到现在有了很大的改进,并仍在完善和发展。
     
    为了清楚地表达每个ARM应用实例所使用的指令集,ARM公司定义了6种主要的ARM指令集体系结构版本,以版本号V1V6表示
     

    ARM版本 V1版架构
     
    该版架构只在原型机ARM1出现过,只有26位的寻址空间,没有用于商业产品。
     
    其基本性能有

    基本的数据处理指令(无乘法);
     
    基于字节、半字和字的Load/Store指令

    转移指令,包括子程序调用及链接指令;
     
    供操作系统使用的软件中断指令SWI
     
    寻址空间:64MB226)。
     

    ARM版本 V2版架构

    该版架构对V1版进行了扩展,例如ARM2ARM3V2a)架构。包含了对32位乘法指令和协处理器指令的支持。 
    版本2a是版本2的变种,ARM3芯片采用了版本2a,是第一片采用片上CacheARM处理器。同样为26位寻址空间,现在已经废弃不再使用。
     
    V2
    版架构与版本V1相比,增加了以下功能:
     
    乘法和乘加指令;
     
    支持协处理器操作指令;
     
    快速中断模式;
     
    SWP/SWPB
    的最基本存储器与寄存器交换指令

    寻址空间:64MB
     

    ARM版本 V3版架构
     
    ARM
    作为独立的公司,在1990年设计的第一个微处理器采用的是版本3ARM6。它作为IP核、独立的处理器、具有片上高速缓存、MMU和写缓冲的集成CPU
     
    变种版本有3G3M。版本3G是不与版本2a向前兼容的版本3,版本3M引入了有符号和无符号数乘法和乘加指令,这些指令产生全部64位结果。
     
    V3
    版架构(目前已废弃)对ARM体系结构作了较大的改动:
     

    寻址空间增至32位(4GB);

    当前程序状态信息从原来的R15寄存器移到当前程序状态寄存器CPSR中(Current Program Status Register
    增加了程序状态保存寄存器SPSRSaved Program Status Register);
     
    增加了两种异常模式,使操作系统代码可方便地使用数据访问中止异常、指令预取中止异常和未定义指令异常。;
     
    增加了MRS/MSR指令,以访问新增的CPSR/SPSR寄存器;
     
    增加了从异常处理返回的指令功能。
     

    ARM版本 V4版架构

    V4版架构在V3版上作了进一步扩充,V4版架构是目前应用最广的ARM体系结构,ARM7ARM8ARM9StrongARM都采用该架构。 
    V4
    不再强制要求与26位地址空间兼容,而且还明确了哪些指令会引起未定义指令异常。
     
    指令集中增加了以下功能:
     
    符号化和非符号化半字及符号化字节的存/取指令;
     
    增加了T变种,处理器可工作在Thumb状态,增加了16Thumb指令集;
     
    完善了软件中断SWI指令的功能;
     
    处理器系统模式引进特权方式时使用用户寄存器操作

    把一些未使用的指令空间捕获为未定义指令
     

    ARM版本 V5版架构
     
    V5
    版架构是在V4版基础上增加了一些新的指令,ARM10Xscale都采用该版架构。
     
    这些新增命令有:
     
    带有链接和交换的转移BLX指令;
     
    计数前导零CLZ指令;
     
    BRK
    中断指令;
     
    增加了数字信号处理指令(V5TE版);为协处理器增加更多可选择的指令;
     
    改进了ARM/Thumb状态之间的切换效率;
     
    E---
    增强型DSP指令集,包括全部算法操作和16位乘法操作;
     
    J----
    支持新的JAVA,提供字节代码执行的硬件和优化软件加速功能。
     

    ARM版本 V6版架构
     
    V6
    版架构是2001年发布的,首先在2002年春季发布的ARM11处理器中使用。在降低耗电量地同时,还强化了图形处理性能。通过追加有效进行多媒体处理的SIMD(Single Instruction, Multiple Data,单指令多数据 )功能,将语音及图像的处理功能提高到了原型机的4倍。
     
    此架构在V5版基础上增加了以下功能:
     
    THUMBTM
    35%代码压缩;
     
    DSP
    扩充:高性能定点DSP功能;
     
    JazelleTM
    Java性能优化,可提高8倍;
     
    Media
    扩充:音/视频性能优化,可提高4
     

    ARM处理器系列
     
    ARM
    公司开发了很多系列的ARM处理器核,目前最新的系列已经是ARM11
     
    ARM7
    ARM9ARM9EARM104个通用处理器系列。
     
    每一个系列提供一套相对独特的性能来满足不同应用领域的需求。
     
    ARM7
    系列
     
    ARM9
    系列
     
    ARM9E
    系列
     
    ARM10E
    系列
     
    ARM11
    系列
     
    SecurCore
    系列
     
    Intel
    Xscale 
    Intel
    StrongARM

    ARM7微处理器系列 
    低功耗的32RISC处理器,冯·诺依曼结构。极低的功耗,适合便携式产品。
     
    具有嵌入式ICERT逻辑,调试开发方便。
     
    3
    级流水线结构。能够提供0.9MIPS的三级流水线结构
     
    代码密度高,兼容16位的Thumb指令集。
     
    对操作系统的支持广泛,包括Windows CELinuxPalm OS等。
     
    指令系统与ARM9系列、ARM9E系列和ARM10E系列兼容,便于用户的产品升级换代。
     
    主频最高可达130MIPS
     
    主要应用领域:工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用。
     
    ARM7TDMI微处理器
     
    4
    种类型:
     
    ARM7TDMI
    ARM7TDMI-SARM720TARM7EJ
     
    ARM7TMDI
    是目前使用最广泛的32位嵌入式RISC处理器,属低端ARM处理器核。
     
    注:“ARM并不是芯片,ARM核与其它部件如RAMROM、片内外设组合在一起才能构成现实的芯片。

    ARM7TDMI内部结构 
    组成:处理器核、用于边界扫描的TAP控制器、在线仿真器ICE
     
    双向数据总线D[310]被分割成单向输入和输出总线,以便于与外部存储器兼容。

    ARM7TDMI的模块和内核框图

    ARM7TDMI功能信号图

    ARM9微处理器系列
    ARM9系列微处理器在高性能和低功耗特性方面提供最佳的性能。 
    5
    级整数流水线,
     
    哈佛体系结构。
     
    支持32ARM指令集和16Thumb指令集。
     
    全性能的MMU,支持Windows CELinuxPalm OS等多种主流嵌入式操作系统。
     
    支持数据Cache和指令Cache,具有更高的指令和数据处理能力。
     
    主要应用:无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数码照相机和数码摄像机。
     
    3
    种类型:ARM920TARM922TARM940T
     

    ARM9E微处理器系列
     
    单一处理器内核提供微控制器、DSPJava应用系统的解决方案。
     
    支持DSP指令集。
     
    5
    级整数流水线,指令执行效率更高。
     
    支持32ARM指令集和16Thumb指令集。
     
    支持VFP9浮点处理协处理器。
     
    全性能的MMU,支持Windows CELinuxPalm OS等多种主流嵌入式操作系统。
     
    MPU
    支持实时操作系统。
     
    支持数据Cache和指令Cache
     
    主频最高可达300MIPS
     
    主要应用:下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。
     
    3
    种类型:ARM926EJ-SARM946E-SARM966E-S
     

    ARM10E微处理器系列

    与同等的ARM9比较,在同样的时钟频率下,性能提高了近50%,功耗极低。 
    支持DSP指令集。
     
    6
    级整数流水线,指令执行效率更高。
     
    支持32ARM指令集和16Thumb指令集。
     
    支持VFP10浮点处理协处理器。
     
    全性能的MMU,支持Windows CELinuxPalm OS等多种主流嵌入式操作系统。
     
    支持数据Cache和指令Cache
     
    主频最高可达400MIPS
     
    内嵌并行读/写操作部件。
     
    主要应用:下一代无线设备、数字消费品、成像设备、工业控制、通信和信息系统等领域。
     
    3
    种类型:ARM1020EARM1022EARM1026EJ-S
     

    SecurCore微处理器系列

    专为安全需要而设计,提供了完善的32RISC技术的安全解决方案。 
    灵活的保护单元,以确保操作系统和应用数据的安全。
     
    采用软内核技术,防止外部对其进行扫描探测。
     
    可集成用户自己的安全特性和其他协处理器。
     
    主要应用:对安全性要求较高的应用产品及应用系统,如电子商务、电子政务、电子银行业务、网络和认证系统等领域。
     
    4
    种类型:SecurCore SC100SecurCore SC110SecurCoreSC200SecurCore SC210
     

    Xscale处理器
     
    基于ARMv5TE体系结构的解决方案,是一款全性能、高性价比、低功耗的处理器。
     
    支持16位的Thumb指令和DSP指令集。
     
    已使用在数字移动电话、个人数字助理和网络产品等场合。
     
    Xscale
    处理器是Intel目前主要推广的一款ARM微处理器
     

    ARM系列流水线比较

    ARM系列性能比较

     

    ARM处理器结构 
    ARM
    Thumb状态
     
    RISC
    技术
     
    流水线技术
     
    超标量技术
     

    ARMThumb状态
     
    V4
    版以后有:
     
    132ARM指令集
     
    216Thumb指令集,功能是ARM指令集的功能子集。
     
    ARM7TDMI
    核以后,T变种的ARM微处理器有两种工作状态:
     
    1ARM状态
     
    2Thumb状态。
     
    ARM微处理器执行32位的ARM指令集时,工作在ARM状态;
     
    ARM微处理器执行16位的Thumb指令集时,工作在Thumb状态
     

    Thumb技术介绍
     
    ARM7
    体系结构被广泛应用的时候,嵌入式控制器的市场仍然由8位、16位处理器占领。这些产品不能满足高端应用。这些应用需要32RISC处理器的性能和更优于16CISC处理器的代码密度。
     
    为了解决代码密度的问题,ARM增加了T变种。
     
    Thumb
    32ARM指令集中抽出来的36条指令格式,可重新编成16位的操作码。
     
    在运行时,16位的Thumb指令又由处理器解压成32位指令。
     
    Thumb
    核有2套独立的指令集,它使设计者得到ARM32位指令性能的同时,又能享有Thumb指令集产生的代码方面的优势,在性能和代码大小之间取得平衡。
     
    ARM指令集相比,Thumb指令集具有以下的局限:
     
    完成相同的操作,Thumb指令通常需要更多的指令,因此在对系统运行时间要求苛刻的场合,ARM指令集更为合适。
     
    Thumb
    指令集没有包含进行异常处理时需要的一些指令,因此在异常中断时,还是需要使用ARM指令,这种限制决定了Thumb指令需要与ARM指令配合使用。
     

    ARMThumb状态转换
     
    在程序的执行过程中,微处理器可以随时在两种工作状态之间切换,并且该转变不影响处理器的工作模式和相应寄存器中的内容。
     
    进入Thumb状态:当操作数寄存器的状态位(位[0])为1时,执行BX指令。
     
    进入ARM状态:当操作数寄存器的状态位(位[0])为0时,执行BX指令。
     

    RISC技术
     
    嵌入式微处理器可以分为两类:CISCRISC
     
    CISC
    Complex Instruction Set Computer):复杂指令系统计算机;随着计算机技术的发展而不断引入新的复杂的指令集,计算机的体系结构会越来越复杂。
     
    大约有20%的指令会被反复使用,占整个程序代码的80%,而余下的80%的指令却不经常使用,在程序设计中只占20
     
    RISC
    Reduced Instruction Set Computer):精简指令系统计算机;-采用固定长度的指令格式
     
    使用单周期指令
     
    大量使用寄存器
     
    可用加载/存储指令批量传输数据
     
    在循环处理中使用地址的自动增减
     

    RISC技术与CISC技术比较

    RISC技术 
    ARM
    处理器采用加载/存储(Load/Store)体系结构是典型的RISC处理器,即只有Load/Store的存/取指令可以访问存储器,其余指令都不允许进行存储器操作。
     
    RISC
    体系结构基本特点:
     
    1)大多数指令只需要执行简单和基本的功能,其执行过程在一个机器周期内完成。
     
    2)只保留加载/存储指令。操作数由加载/存储指令从存储器取出放寄存器内操作。
     
    3)芯片逻辑不采用或少采用微码技术,而采用硬布线逻辑。
     
    4)减少指令数和寻址方式。
     
    5)指令格式固定,指令译码简化。
     
    6)优化编译。
     

    RISC技术
     
    ARM
    体系结构还采用了一些特别的技术:
     
    所有的指令都可根据前面的执行结果决定是否被执行,提高了指令的执行效率。
     
    可用Load/Store指令批量传输数据,以提高数据的传输效率。
     
    可在一条数据处理指令中同时完成逻辑处理和移位处理。
     
    RISC
    CISC各有优势,界限并不那么明显。
     
    现代的CPU往往采用CISC的外围,内部加入了RISC的特性,如超常指令集CPU就是融合了RISCCISC的优势,成为未来的CPU发展方向之一。
     

    流水线技术
     
    是一种将每条指令分解为多步,并让各步操作重叠,从而实现几条指令并行处理的技术;
     
    程序中的指令仍是一条条顺序执行,但可以预先取若干条指令,并在当前指令尚未执行完时,提前启动后续指令的另一些操作步骤,从而可加快程序的运行速度;

     

    开发和设计嵌入式系统的过程中,CPU的性能是一个非常重要的考虑因素。 
    流水线技术是在本质上影响程序执行速度的因素。
     
    由于计算机中一条指令的各个执行阶段相对独立,因此,现代CPU大多设计成流水线型的机器,在这种类型机器中几个指令可以并行执行。采用流水线的重叠技术大大提高了CPU的运行效率。
     
    当流水线内部的信息通畅流动时,CPU流水线能够工作得最好。
     
    但实际应用中,指令各执行阶段的操作时间长短不同,有一些指令序列可能会打断流水线内的信息流,所以有时流水线操作不十分通畅,会暂时降低CPU的执行速度。
     

    单周期指令的执行过程

    ARM3级流水线 
    ARM7
    架构采用了一个3段的流水线:
     
    1)取指:将指令从内存中取出来。
     
    2)译码:操作码和操作数被译码以决定执行什么功能。为下一周期准备数据路径需要的控制信号。这一级指令占有译码逻辑,而不是占有数据路径
     
    3)执行:执行已译码的指令。指令占有数据路径,寄存器堆栈被读取,操作数在桶行移位器中被移位。ALU产生运算结果并回写到目的寄存器中,ALU结果根据指令需求更改状态寄存器的条件位。
     

    流水线模式下PC的更改过程

    多周期ARM指令的3级流水线操作
    数据路径涉及到所有执行周期、地址计算和数据传送。译码逻辑总是产生数据路径在下一个周期使用的控制信号,因此除译码周期以外,在STR地址计算周期也产生数据传送所需的控制信号。 
    取指的存储器访问和执行的数据路径占用都是不可同时共享的资源,对于多周期指令来说,如果指令复杂以至于不能在单个时钟周期内完成执行阶段,就会产生流水线阻塞。


    ARM5级流水线 
    ARM9
    StrongARM架构都采用了5级流水线

    增加了I-CacheD-Cache,把存储器的取指与数据存取分开;
     
    增加了数据写回的专门通路和寄存器;
     
    把指令的执行过程分割为5部分

    取指:将指令从指令存储器中取出,放入指令流水线中。
     
    指令译码:对指令进行译码,从寄存器堆中读取寄存器操作数。
     
    执行:把一个操作数移位,产生ALU结果。如果指令是LoadStore,在ALU中计算存储器的地址。
     
    数据缓存:如果需要,访问数据存储器;否则,ALU的结果只是简单地缓冲一个时钟周期,以便使所有指令具有同样地流水线流程。
     
    写回:将指令产生地结果写回到寄存器堆。
     

    流水线对比

     

     

     

     

    存储系统机制 
    存储器就是用来存储信息的部件,存储器是嵌入式系统硬件中的重要组成部分。
     
    设计嵌入式系统的存储器时需要考虑:是否需要扩展;
     
    整个嵌入式系统的存储器是由片内和片外两部分组成。
     
    为了解决速度和内存容量的问题,在系统中采用虚拟地址空间和高速缓存来提高内存的平均性能。
     
    存储管理单元(MMU)进行地址转换,它在一个小的物理内存中提供相对较大的虚拟存储空间。
     

    存储器部件的分类
     
    按在系统中的地位分类:
     
    1)主存储器(Main Memory, 简称内存或主存

    2)辅助存储器(Auxiliary Memory,Secondary Memory,简称辅存或外存

    按存储介质分类:
     
    1)磁存储器(Magnetic Memory)
     
    2)半导体集成电路存储器(通常称为半导体存储器)
     
    3)光存储器(Optical Memory)
     
    4)激光光盘存储器
    (Laser Optical Disk) 
    按信息存取方式分类:
     
    1)随机存取存储器
    RAM 
    2)只读存储器
    ROM 

    存储器的组织和结构
     
    嵌入式存储器一般采用存储密度较大的存储器芯片,典型的嵌入式存储器系统由ROMRAMEPROM等组成。

    常用的存储器
    随机存储器(RAM 
    1)静态随机存储器(SRAM
     
    2)动态随机存储器(DRAM
     
    只读存储器(ROM),它在嵌入式系统中非常有用,因为许多代码或数据不随时间改变。
     
    1)工厂编程的只读存储器
     
    2)现场可编程只读存储器
     


    存储体系的形式
     
    存储层次结构的组成原则:
     
    每位价格从上往下依次减少。
     
    存储容量从上往下依次增加。
     
    存取速度从上往下依次减慢。
     
     CPU的访问频度从上往下依次减少。

    总线协议 
    总线是CPU与存储器和设备通信的机制。
     
    总线的一个主要作用是提供到存储器的接口。
     
    大部分总线协议的基本构件是四周期握手协议

    总线读写 
    总线的基本操作是读和写。
     
    Clock 
    提供总线组件各部分同步。
     
    当总线读时,R/W’1。当总线写时,R/W’0
     
    Address
    是一个a位信号束,为访问提供地址。
     
    Data
    是一个n位信号束,它可从CPU得到数据或向CPU传送数据。
     
    Data ready’
    当数据束上值合法时发信号。

    总线的时序图 
    总线行为以时序图说明。
     
    时序图表示总线上的信号如何随时间变化。

    直接内存访问(DMA 
    多数情况下,数据的传输需要CPU的介入。
     
    但是,有时候某些数据传输类型无须CPU加入。
     
    直接存储器访问(DMA)是允许读写不由CPU控制的总线操作

    系统总线配置 
    一个微处理器系统可能含有多条总线。高速设备可连到高速总线上,低速设备连到别的总线上。
     
    桥:使总线可以互连的逻辑电路。
     
    高速总线通常要更昂贵的电路和连接器,可通过使用较慢、较便宜的总线来降低低速设备成本。
     
    桥允许总线独立操作,在I/O操作中可提供某些并行性。
     
    桥不仅是高速总线的受控器,而且是低速总线的主控器。
     
    桥从高速总线上获取指令而将它们传到低速总线,它还将结果从低速总线传到高速总线上。
     
    桥还可以作为两桥之间的协议翻译器。

    ARM存储数据类型

    六种数据类型: 
    1 8位有符号和无符号字节。
     
    216位有符号和无符号半字。
     
    332位有符号和无符号字。
     
    ARM
    指令都是32位的字,必须以字(4字节)为单位边界对齐。
     
    Thumb
    指令是16位半字,必须以2字节位单位边界对齐。
     
    在内部,所有ARM操作都是面向32位的操作数;只有数据传送指令支持较短的字节和半字的数据类型。当从存储器调入一个字节和半字时,根据指令对数据的操作类型,将其无符号0或有符号符号位扩展为32位,进而作为32位数据在内部进行处理。
     
    ARM
    体系结构所支持的最大寻址空间为4GB232字节)
     
    ARM
    体系结构将存储器看作是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字数据,从第四个字节到第七个字节放置第二个存储的字数据,依次排列。
     
    ARM
    体系结构可以用两种方法存储字数据,称之为大端格式和小端格式
     

    ARM存储格式

    数据存储格式有两种: 
    1)大端模式:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
     
    2)小端模式:较高的有效字节存放在较高的存储器地址,较低的有效字节存放在较低的存储器地址。

    ARM存储周期 
    4
    种基本类型:
     
    空闲周期。
     
    非顺序周期。
     
    顺序周期。
     
    协处理器寄存器传送周期。
     

    ARM总线接口信号分类

    ARM7TDMI的总线接口信号分成4
    时钟和时钟控制信号:MCLKECLKnRESETnWAIT
     
    地址类信号:A[31:0]nRWMAS[1:0]nOPCnTRANSLOCKTBIT
     
    存储器请求信号:nMREQSEQ
     
    数据时序信号:D[31:0]DIN[31:0]DOUT[31:0]ABORTBL[3:0]
     

    ARM总线接口可以实现的总线周期

    总线周期使用nMREQSEQ信号编码。 
    4
    种不同类型的总线周期。
     
    N
    周期:非顺序周期,最简单的总线周期;存储控制器必须启动存储器访问来满足这个请求;该方式存储系统常需要长的访问时间。
     
    S
    周期:顺序周期,实现总线上的突发传送;第一个周期,地址可与前一个内部周期相同;与非顺序访问相比响应更快,访问时间更短。
     
    I
    周期:内部周期,不要求存储器访问;可广播下一次访问的地址以便开始译码,但存储控制器不允许进行存储器访问。
     
    C
    周期:协处理器寄存器传递周期,通过数据总线向或从协处理器传送数据;不需存储周期,存储控制器不启动事务;传送期间,存储系统不允许驱动数据总线。
     

    高速缓存(Cache)的分类
     
    1
    )统一Cache和独立的数据/程序
    Cache 
    统一Cache:一个存储系统中指令预取时使用的Cache和数据读写时使用的Cache是同一个Cache
     
    独立的Cache:一个存储系统中指令预取时使用的Cache和数据读写时使用的Cache是各自独立的。
     
    用于指令预取的Cache称为指令Cache
     
    用于数据读写的Cache称为数据Cache
     
    使用独立的数据Cache和指令Cache,可以在同一个时钟周期中读取指令和数据,而不需要双端口的Cache。但此时要注意保证指令和数据的一致性。
     
    2)写通Cache和写回
    Cache 
    CPU更新了Cache的内容时,要将结果写回到主存中。
     
    写通法: write-throught,指CPU在执行写操作时,必须把数据同时写入Cache和主存。
     
    写回法: write-back,指CPU在执行写操作时,被写的数据只写入Cache,不写入主存。仅当需要替换时,才把已经修改的Cache块写回到主存中。
     
    3)读操作分配Cache和写操作分配
    Cache 
    当进行数据写操作时,可能Cache未命中,这时根据Cache执行的操作不同。
     
    读操作分配Cache:当进行数据写操作时,如果Cache未命中,只是简单地将数据写入主存中。主要在数据读取时,才进行Cache内容预取。
     
    写操作分配Cache:当进行数据写操作时,如果Cache未命中,Cache系统将会进行Cache内容预取,从主存中将相应的块读取到Cache中相应的位置,并执行写操作,把数据写入到Cache中。
     
    对于写通类型的Cache,数据将会同时被写入到主存中,对于写回类型的Cache数据将在合适的时候写回到主存中。
     

    Cache的工作原理
     
    Cache存储系统当中,把主存储器和Cache都划分成相同大小的块。
     
    主存地址可以由块号M和块内地址N两部分组成。

    同样,Cache的地址也由块号m和块内地址n组成。

    Cache地址映像和变换方式 
    1
    )直接映像
     
    快,造价低。
     
    但由于映射策略简单,所以有一定的局限性。
     
    如果访问频繁的块正好被映射到同一个块,就不能充分利用高速缓存的好处。
     
    2)组相联映像
     
    组相联映像由组的个数来标识,每个组被实现为一个直接映射高速缓存。
     
    高速缓存请求同时广播到所有的组。如果某组中有这个单元,该高速缓存便报告命中。
     
    比直接映射慢,命中率较高。
     
    3)全相联映像
     
    主存中任意一个块都可以映射到Cache中的任意一个块的位置上。
     
    不同的ARM有不同大小的高速缓存和组织结构。
     

    Cache的替换算法
     
    1)轮转法
     
    维护一个逻辑计数器,利用该计数器依次选择将要被替换出去的Cache块。
     
    这种算法容易预测最坏情况下Cache的性能。
     
    缺点:在程序发生很小的变化时,可能造成Cache平均性能急剧的变化。
     
    2)随机替换算法
     
    通过一个伪随机数发生器产生一个伪随机数,用新块将编号为该伪随机数的Cache块替换掉。
     
    算法简单,易于实现。
     
    没有考虑程序的局部性特点,也没有利用以前块地址分布情况,因而效果较差。
     
    不易预测最坏情况下Cache的性能。
     

    存储管理单元MMU 

    存储管理单元在CPU和物理内存之间进行地址转换。 
    由于是将地址从逻辑空间映射到物理空间,因此这个转换过程一般称为内存映射。
     
    ARM系统中,存储管理单元MMU主要工作:
     
    1)虚拟存储空间到物理存储空间的映射。在ARM中采用了页式虚拟存储管理。
     
    2)存储器访问权限的控制。
     
    3)设置虚拟存储空间的缓冲的特性
     

    MMU的页表

    页表是实现上述功能的一个重要手段,它实际上是位于内存中的一个对照表。 
    为了实现不同层次的管理,系统提供了基于段或页的存储器访问方式
     
    1. 
    段(section):由1MB 的存储器块构成
     
    2. 
    大页(large page):由64KB 的存储器块构成
     
    3. 
    小页(small page):由4KB 的存储器块构成
     
    4. 
    极小页(tiny page):由1KB 的存储器块构成
     

    MMU的页表续
     
    地址变换条目:页表的每一行对应与虚拟地址空间的一个页,该行同时包含了该虚拟内存页对应的物理内存页的地址、该页的访问权限以及缓冲特性等。我们将页表中的一行称为地址变换条目。
     
    页表:存放在内存中,系统通常有一个寄存器来保存页表的基地址。ARM系统中使用的就是CP15的寄存器C2
     
    快表:从虚拟地址到物理地址的转换实际上就是查询页表的过程。由于程序在执行过程中具有局部性,即在一段时间内只是局限在少数几个单元,为了加快页表的查询速度,在系统中通常使用一个容量更小、速度更快的存储器件来保存当前需要访问的地址变换条目,这个容量小的页表又称作快表(TLB)。
     

    快表的使用
     
    更新:当CPU需要访问内存时,首先在TLB中查找需要的地址变换条目。若不存在则在内存页表中查询,并把查询的结果添加到TLB中。
     
    清除:当内存中页表的内容改变或者使用新的页表时,TLB中的内容需要清空。CP15的寄存器8用于完成该功能。
     
    锁定:可以将一个地址变换条目锁定在TLB中,以加快访问速度,CP15的寄存器10用于完成该功能。
     

    MMU的存储访问过程
     
    使能MMU时存储访问过程。
     
    C
    控制位:CachableB控制位Bufferable

    禁止MMU时存储访问过程 
    先要确定芯片是否支持cachewrite buffer
     
    如果芯片规定当禁止MMU时禁止cachewrite buffer,则存储访问将不考虑CB控制位。
     
    如果芯片规定当禁止MMU时可以使能cachewrite buffer,则数据访问时,C=0,B=0;指令读取时,如果使用分开的TLB,那么C=1,如果使用统一的TLB,那么C=0
     
    存储访问不进行权限控制,MMU也不会产生存储访问中止信号。
     
     
    所有的物理地址和虚拟地址相等,即使用平板存储模式。
     

    MMU中的地址变换过程
     
    通过两级页表实现。
     
    一级页表:包含以段为单位的地址变换条目,以及指向二级页表的指针。
     
    一级页表实现的地址映射粒度较大。
     
    以段为单位的地址变换过程只需要一级页表。
     
    二级页表:包含以大页和小页为单位的地址变换条目。
     
    以页为单位的地址变换过程需要二级页表。
     
    ARM
    支持的存储块大小有4种:
     
    1)段(Section):大小为1MB的存储块。
     
    2)大页(Large Pages):大小为64KB的存储块。
     
    3)小页(Small Pages):大小为4KB的存储块。
     
    4)极小页(Tiny Pages):大小为1KB的存储块。
     

    一级页表地址变换过程

    CP15的寄存器C2中存放的是内存中页表的基地址。 
    形成一个32位的索引值,使用该32位索引值从页表中找出相应的地址变换条目。该条目或者包含一个一级描述符,或者包含一个指向二级页表的指针。

    一级描述符 
    一级描述符:从页表中得到的相应地址变换条目。
     
    它定义了与之相应的1M存储空间是如何映射的。
     
    一级描述符类型: 4种格式的一级描述符,由位[1:0]定义。

    粗粒度页表描述符 
    粗粒度页表描述符:一级描述符的位[1:0]0b010b代表二进制),包含了粗粒度的二级页表的物理地址。

    粗粒度页表描述符获取二级描述符过程


    段描述符 
    段描述符:一级描述符的位[1:0]0b10

    段的地址变换过程


    细粒度页表描述符 
    细粒度页表描述符:一级描述符的位[1:0]0b11,包含了细粒度的二级页表的物理地址。

    细粒度页表描述符获取二级描述符过程

    MMU中的存储访问权限控制 
    MMU中,寄存器C1RS控制位和页表中地址转换条目中的访问权限控制位(AP)联合作用控制存储访问的权限。
     
    MMU
    存储访问权限控制的具体规则如下:

    MMU中的域(Domain
    域:一些段、大页或者小页的集合。 
    ARM
    支持最多16个域。
     
    每个域的访问控制特性由CP15中的寄存器C3中的两位控制。
     
    因此能很容易地将某个域的地址空间包含在虚拟存储空间中,或是排除在虚拟存储空间之外。
     
    CP15
    中寄存器C3中的每两位控制一个域的访问控制特性,字段编码和含义如下:

    快速上下文切换技术

    快速上下文切换技术FCSEFast Context Switch Extension):通过修改系统中不同进程的虚拟地址,避免在进行进程间切换时造成的虚拟地址到物理地址的重映射。

     

    如果两个进程占用的虚拟地址空间有重叠,则系统在这两个进程之间进行切换时,必须进行虚拟地址到物理地址的重映射,包括重建TLB、清除Cache,整个工作需要巨大的系统开销,而快速上下文切换技术的引入避免了这种开销。

     

    FCSE位于CPUMMU之间,其功能就是将不同进程使用的相同虚拟地址映射为不同的虚拟空间,使得在上下文切换时无须重建TLB等。



    存储器映射的输入/输出

    ARM系统中,I/O操作通常被映射成存储器操作,即输入/输出是通过存储器映射的可寻址外围寄存器和中断输入的组合来实现的。

     

    ARM中,I/O的输出操作可通过存储器写入操作实现;I/O的输入操作可通过存储器读取操作实现。这样I/O空间就被映射成存储空间。

     

    但是,对于存储器映射的I/O空间的操作,不能使用Cache技术。

    展开全文
  • ARM 学习笔记整理(一)

    千次阅读 2019-03-26 16:52:11
    ARM 学习笔记整理,主要用于将来的研究开发参考。 一、ARM体系结构的版本 处理器的体系结构就是其使用的指令集,而通常我们说的Soc结构的处理器可以理解为一个实现机器指令集的硬件内核,在这个内核周围集成各种...

    ARM 学习笔记整理,主要用于将来的研究开发参考。

    一、ARM体系结构的版本

            处理器的体系结构就是其使用的指令集,而通常我们说的Soc结构的处理器可以理解为一个实现机器指令集的硬件内核,在这个内核周围集成各种功能模块,比如:图像处理、通信处理等模块,然后将这些全部封装在一起,并将各个功能模块和内核通过引脚从芯片封装中引出来供人们使用。我的理解是Soc结构基本上是内核+通信+人机交互所组成。比如S3C2440A就是有ARM920T核心处理器+外部存储控制器+LCD控制器+各种控制和通信接口组成,通过查询ARM920T的技术手册就可以知道ARM920T使用的是ARMv4T版本的指令集。

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     二、ARM处理器系列

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
             ARM9系列微处理器有ARM920T和ARM922T两种类型。

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     通过一、二两点的学习,对ARM的整体有了一个总体理解:首先ARM公司根据生活中的各种应用需求设计了各种版本的指令集(即ARM的体系结构),不同系列的ARM内核实现了不同版本的指令集,而各个厂家(比如三星公司、intel公司)使用不同的ARM内核加上各种外围应用模块设计出自家的Soc芯片,进而设计出各种产品满足社会生活的各种需要。

    三、程序运行地址和加载地址-为什么使用位置无关指令 

            在嵌入式编程中,我们经常讲程序保存在 nand flash中。但是我们知道,nand flash的接口设计和 RAM 的接口设计是不一样的。他的数据线通常都是复用的,所以通常存取都是以块为单位(nor flash带有RAM接口,有足够的地址线来寻址,

    所以可以访问内存中每一个字节)  ,这导致了nand flash不可以片内执行程序(nor flash可以,因为他能存取内存每一个字节)。

            对于 s3c2440 来说,当使用 nand flash 启动时,为了解决 nand flash 不能片内执行程序的问题(片内不能执行,那么程序烧进去不是不能运行嘛) 于是 s3c2440 在内部有一个 叫 Stepping Stone(垫脚石?)的东西,其实他就是一块 4KB 的RAM,当我们以 nand flash启动想运行烧写在上面的程序时,s3c2440会自动将 nand flash 前面 4KB 的内容拷贝到这个叫Stepping Stone的片内内存中, 然后 pc指针为0 从这个片内内存0地址开始运行(通常这个0地址是复位向量,即跳到复位中断处理函数执行一些初始化设置,比如设置一般的栈指针,中断处理模式中的栈指针,系统处理模式的栈指针等)。但是这个片内内存只有 4Kb 大小,如果我们烧到 nand falsh中的程序大于 4KB 那么只有一部分被拷贝到了片内内存中去执行。剩下的就不能执行了。但是我们不是可以接外设吗, s3c2440的BANK6 和 BANK7都可以接最大 128M的SDRAM。SDRAM是一个RAM(内存) 那么当程序大于 4k 的时候,当我们以 nand flash启动后,前面的4Kb 被拷贝到 片内RAM中去执行(自动完成)。 我们在这前4K的程序中初始化SDRAM(SDRAM 使用前需要初始化) ,然后将剩下的程序拷贝到 SDRAM中(不是只有4kb 被拷贝到片内RAM中执行了嘛) 然后跳转到 SDRAM中去执行剩下的程序。

            那么也就是说通常当程序大于 4kb的 时候,我们就需要把程序拷贝到SDRAM中去运行(程序小于4KB 那么也就可以不用拷贝了,以nand flash方式 启动后,程序全被拷贝到 片内4kb的 RAM中去运行)。那么也就是说 通常当程序大于 4kb的时候,我们就需要把程序拷贝到SDRAM中去运行(程序小于4KB 那么也就可以不用拷贝了,以nand flash方式启动后,程序全被拷贝到片内4kb的RAM中去运行,以nor flash方式启动不需要拷贝,因为nor flash可以寻址到字节)。那么,既然程序大于4kb的时候需要从nand flash中拷贝到 SDRAM中去运行。自然可以想到烧到nand flash中的程序前面一部分代码应该是初始化SDRAM(程序最终需要拷贝到SDRAM中去运行)和将NAND flash中的剩余的程序拷贝到SDRAM中去(全考过去也行,方便点),然后跳转到SDRAM中执行。

            下面我们就要详细说明,前面这一段跳转到 SDRAM去执行前在片内内存中运行的初始化代码的要点和细节。也就是 关于程序运行地址和加载地址以及位置无关指令的 一些注意点和细节先来看下程序运行地址和加载地址看个 随便写的简单的示例,这是一个连接脚本中的一段  first 0x30000000 : AT(0){main.o}我们只注意 0x30000000 和 AT(0) 这两处。

    如果程序是烧到nand flash中,这句话里面的意思就是a.o烧到nand flash 中从0地址(当然也可以是其他数)开始的地方,但他的运行地址是在从0x30000000地址开始的地方(为什么是0x30000000,因为 s3c2440的 bank6 和bank7 可以接sdram,bank6从地址0x30000000开始,我们的程序最终是要在SDRAM中运行的)。烧到 nand flash中从地址0 开始的地方应该比较好理解,就是说我程序是存储在nand flash中最开始的地方。那么运行地址呢怎么理解呢, 看一下汇编 :

      1 .text

      2 .global _start

      3 _start:

      4         mov     r0, #2

      5 loop:

      6         ldr     pc,=loop

    上面这段汇编,我们将 他的运行地址分别设为 0x0 和0x30000000来看看反汇编后的情况,先将运行地址设为0x0:

      all: test.c head.s

      2         arm-linux-gcc -c -Wall -o head.o head.s

      3         arm-linux-ld -Ttext 0x0 -o main_elf  head.o

      4         arm-linux-objdump -D -m arm main_elf > main.dis

      5 

      6 clean:

      7         rm -rf *.o main.dis main_elf

    反汇编 main.dis如下:

      6    00000000 <_start>:

      7    0:   e3a00002        mov     r0, #2  ; 0x2

      8 

      9     00000004 <loop>:

     10    4:   e51ff004        ldr     pc, [pc, #-4]   ; 8 <.text+0x8>

     11    8:   00000004        andeq   r0, r0, r4

    将arm-linux-ld -Ttext 0x0 -o main_elf  head.o 改为 arm-linux-ld -Ttext 0x30000000 -o main_elf  head.o 也就是将运行地址设定为0x30000000 再看看它的反汇编

      6   30000000 <_start>:

      7   30000000:       e3a00002        mov     r0, #2  ; 0x2

      8 

      9   30000004 <loop>:

     10  30000004:       e51ff004        ldr     pc, [pc, #-4]   ; 30000008 <.text+0x8>

     11  30000008:       30000004        andcc   r0, r0, r4

    注意最左边的数字,这就代表程序的运行时地址。也就是说程序的代码的地址是以运行地址为基址来标示的。什么意思呢, 看 head.s中的  ldr     pc,=loop  这段,这是想让 程序调回到 loop处(死循环) 当运行地址设定为 0x0 时从汇编代码我们看到 loop标号代表的地址为0000004 也就是说  ldr     pc,=loop 反汇编为 ldr     pc, [pc, #-4] 即pc值为pc-4地址里面放的值(4),就是跳转到 00000004 地址去。 那么把运行地址设定为0x30000000时, 从反汇编代码中我们看到这时 loop表号代表的地址是0x30000000 那么 ldr     pc,=loop 就是跳转到 地址 0x30000000。

            简单的理解就是程序运行地址就是计算机认为程序运行时应该处于的地址。所以运行地址设置为0 时,程序中的所有代码中的标号都是以0x0为基址的。计算机认为他运行的时候的地址是从 0x0开始的。运行地址设置为0x30000000 时,程序中的所有代码中的标号都是以0x30000000为基址的,计算机认为他运行的时候的地址是从0x30000000开始的。

            明白了运行地址 的概念后,我们来看看程序的启动过程:假设现在程序的加载地址(生成的映象文件中的偏移地址,因为映象文件是烧入到nand flash中的,也即烧到nand flash中的位置)为0 运行地址为0x30000000,前面说过程序是烧写在 nand flash中从 0地址开始的地方,那么以nand flash方式启动后,该程序被拷贝到片内ram中。这时候pc为0,并开始运行程序,也就是说,计算机现在从 片内内存地址0开始运行程序进行一些初始化操作并将sdram初始化后再跳转到sdram中去运行。但是我们上面不是说,程序运行地址被设置成了 0x30000000(SDRAM的起始地址)吗。但是程序在跳转到sdram之前却是在0x0地址开始运行。这就造成了前面这段还未跳转到sdram(从0x30000000开始)的程序的实际程序运行地址和设定的运行地址不符合。如果程序中没有用到地址有关代码,和全局变量静态变量之类地址有关变量,那么这段 在初始化SDRAM之前 的程序 其实还是可以运行下去的并在初始化SDRAM后,跳转到SDRAM中去运行,一切正常,这是因为上电初始化后pc寄存器的值为0,cpu从0地址处取指令开始运行程序,如果是32位cpu则后续pc寄存器的值分别为4、8、16等地址值,只要没有用到0x30000000为基地址的指令都可以正常运行,但是如果程序中用了这些代码,就不会运行成功了。

            原因很简单,因为现在我们设定的运行地址为 0x30000000,那么当我们执行地址有关代码 如 ldr pc,=A (A是个标号或函数名)就是使用了 绝对地址,那么 pc = 0x3000000+x (x为标号A相对于起始也就是前面设定的运行地址的偏移) 。那么这条指令执行之后,pc 指针将跳转到 0x30000000后的某处(SDRAM中)。但是 sdram 现在 还未初始化! 这就 造成了错误。同样如果有全局变量或静态变量也是。所以我们需要使用 b bl类的位置无关指令。如  b  A 、b bl跳转是基于 pc的 跳转。即相对跳转 ,比如执行 b A 这条指令时,假设现在pc =5, A标号相对当前的位置为2(在之后)那么 b A 后 pc =pc +2    即计算机不管当前pc指针是多少,他执行的是相对于当前位置的跳转。也就避免了 向上面的那样跳转到了0x30000000之后的未初始化的地址中去。

            通过第三点这个具体的实例说明弄清楚了多年来一直没有搞清楚的cpu上电处理过程,运行地址与加载地址的概念,位置无关指令与位置相关指令的概念。

           各种ARM内核的启动过程各不相同,上面举例的S3C2440是用的ARM9内核,像LPC1111系列用的是Cortex-M0系列,M0系列的上电启动过程就没有这么复杂,下图是LPC1111的内存映射图:

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     从图中我们可以看到M0处理器内部自带了16K的boot ROM,上电复位的时候就是直接跳转到这个boot Rom执行,通过System memory remap register寄存器将地址重定向到用户flash模式,就可以执行烧入到内部flash中的用户代码。其boot Rom的处理流程图如下:

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客 

    四、使用存储控制器访问外设原理

    ①S3C2410/S3C2440的地址空间

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客 ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

    通过这点我们可以明白一个概念:通常说的8/16/32/64位处理器是指内部指令和数据寄存器宽度有8/16/32/64位,有8/16/32/64位的数据处理能力和寻址能力,但在寻址能力上肯定是不能超过内部寄存器的数据位宽的,但可以小于,比如上面说的S3C2440的外部地址线有27根,有128M的直接寻址能力,远小于4G的寻址能力;但可以通过不同的bank对不同的地址空间进行访问。而绝大多数的单片机基本不提供对外的地址接口,直接就封装在芯片内部,全部就是直接寻址。
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

    ②存储控制器与外设的关系
             从S3C2410/S3C2440的地址空间划分我们可以看出,ARM CPU在设计上就已经对地址空间按功能做了各自的划分,即各种外设占用一段地址空间,寄存器占用一段地址空间,在程序设计中通过对这些地址空间进行访问就可以对不同的外设和内部寄存器进行读写操作。而对这些外设和寄存器进行访问的地址译码、读写时序的产生都是由存储控制器进行管理和控制的。

            比如在S3C2440上电从nand flash启动的过程中,首先由SteppingStone控制器将nand flash的前面4kB数据加载到4kB的SRAM中,这个4kB的SRAM称为SteppingStone;接着初始化sdram,这个需要sdram控制器的参与;最后还要将nand flash中4k后面的部分也要拷贝到sdram中,这就需要nand flash控制器和sdram控制器的参与。

    五、内存管理单元MMU

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客 ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

                                                                                通用的转换过程

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客                                                   S3C2410/S3C2440的地址转换图

    图中的TTB Base代表一级页表的地址,将它写入协处理器CP15的寄存器C2(称为页表基址寄存器)即可,一级页表的地址必须是16K对齐的(位[13:0]为0)。为什么必须是16K对齐,这是因为32位CPU的虚拟地址空间为4G,一级页表使用4096个描述符来表示这4G空间,每个描述符占4个字节,所以一级页表需要16K的存储空间。

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

                                                               Translation table base register

    S3C2410/S3C2440的地址转换图明确的表示出了以段的方式进行地址转换时只用到了一级页表,而以页的方式进行地址转换时用到了二级页表。 

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     一级页表描述符格式如下:

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

             从一级页表描述符可以看出,段描述符提供了1M内存块的基地址[31:20];页表描述符提供了包含二级描述符页表的基地址,有两种大小的页表:

            ■粗页表基地址为[31:10],粗页表可寻址空间为[9:0]共1K的空间,按照32位CPU每个页表项占4个字节,粗页表包含256项,而由一级页表项决定了后续的页表能寻址的空间为1M,因此粗页表中每个页表描述符项可寻址的空间为4K;

            ■细页表基地址为[31:12],细页表可寻址空间为[11:0]共4K的空间,按照32位CPU每个页表项占4个字节,细页表包含1K个页表项,而由一级页表项决定了后续的页表能寻址的空间为1M,因此细页表中每个页表描述符项可寻址空间为1K。

            以段的方式进行映射时,虚拟地址MVA到物理地址PA的转换过程如下:

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     页表基址寄存器位[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到段描述符。从段描述符中取出段基地址[31:20],它和MVA[19:0]组成一个32位物理地址,这就是MVA对应的PA。

            如果一级页表的访问返回粗页表或者细页表描述符,那么返回的描述符中就包含了二级页表的基地址,通过访问二级页表就得到二级页表描述符,下图所示为二级页表描述符格式:

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     二级页表描述符项定义了大页64K、小页4K、极小页1K的基地址。位[31:16]为大页基地址,[15:0]为大页64K的寻址空间,由前面的分析可知一级页表中的粗页表描述符决定了一个粗页表有256项,每项寻址4K的地址空间,如果大页描述符保存在粗页表中,要能寻址大页64k的地址空间,那么粗页表中连续16个条目都应该保存同一个大页描述符。同理,如果小页描述符保存在粗页表中,位[31:12]为基址,[11:0]为小页4K寻址空间,则粗页表中一个条目保存一个小页描述符。如果小页描述符保存在细页表中,由前面的分析可知一级页表中的细页表描述符决定了一个细页表有1K项,每项寻址1K的地址空间,那么细页表中连续的4个条目应该保存同一个小页描述符。如果大页描述符保存在细页表中,那么细页表中连续64个条目应该保存同一个大页描述符。如果是极小页描述符保存在细页表中,刚好一个细页表条目保存一个极小页描述符。

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
                                        上图为大页的地址转换过程(大页描述符保存在粗页表中)

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客  ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

             上图为小页的地址转换过程(小页描述符保存在粗页表中)

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

                  上图为极小页的地址转换过程(极小页描述符保存在细页表中)

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

    内存的访问权限检查:

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     关于CP15协处理器的详细描述可以参考ARM920T内核技术手册。

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客 ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     I/O地址空间的概念很重要,上面做了详细的说明。

    TLB与cache的异同:

    TLB:基于页表访问的特点,采用一种容量小(8~16个字),访问速度快(和通用寄存器访问速度相当)的存储器来存放页表中的地址变换条目.

    cache:数据从主存到CPU之间传送的数据缓存,以块为单位(一个块大小为几个字).

    无论从数据搜索方式,更新方式,分类方式,以及替换的形式,一开始很可能把这两种东西当做一样东西.

    但是,他们确实是两种不同的机制:

    1:控制寄存器并不相同.TLB用的是CP15的C2,C8,C10. cache用的是CP15的C1,C7,C9.

    2:写入的单位大小不同.TLB只是单个的地址变换条目写入(4字节). cache是根据块的大小复制块大小的数据(有点像memcpy).虽然两者都是从内存写入各自的位置.

    3:替换方式不同.虽然容量满的时候,都会发生替换,但是算法有点不同.TLB:p178(ARM体系结构与编程)根据一定的淘汰算法进行替换(既然有算法,那么应该是软件决定). cache:算法比较简单,随机替换法和轮转替换法.这两种效率都比较低下,我想主要原因是cache用的是纯硬件实现.但是还是有改进的空间,最好是根据时间戳或者使用频率决定(不能单纯地利用使用次数),要是硬件能实现,那么内存的利用率将会有大大的提高(因为是有目的的筛选). 这一点可能是TLB和cache不能融合的一个关键.

    4:存储速度不同.因为用的两种不同机制,所以速度肯定会有不同.到底谁更快,没有确定结论.根据我的推测应该是TLB,首先TLB的使用更频繁,其次TLB的算法更具有优势. (要是能多出不少类似TLB的积存器,那么cache就可以被淘汰了,呵呵!)

    5:数据过度方式不同. TLB:并不一定要与他打交道,可以先读取主存,然后在更新TLB,先斩后奏! cache:是主存和CPU通信的必经之路。

      一个MMU内存使用实例:

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

    ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客
     ARM 学习笔记整理 - 北极星 - xiebingsuccess的博客

    展开全文
  • ARM 架构简介

    万次阅读 2018-04-01 20:17:28
    一小时教你学会 ARM 架构原创 2017年10月31日 00:00:002499本文来自作者 刘盼 在 GitChat 上分享,「阅读原文」查看交流实录「文末高能」编辑 | 奕迅架构的演变历史我们首先介绍 ARM Ltd,这里先说的是公司而...

    一小时教你学会 ARM 架构

    原创 2017年10月31日 00:00:00
    • 2499

    640.gif?wxfrom=5&wx_lazy=1

    本文来自作者 刘盼 在 GitChat 上分享,阅读原文」查看交流实录

    文末高能

    编辑 | 奕迅

    架构的演变历史

    我们首先介绍 ARM Ltd,这里先说的是公司而不是架构。ARM 的发展历史非常久远,超乎许多人的想象。

    首先,我们提供一些背景信息,ARM 成立于20世纪90年代末,从另一家位于剑桥的公司分拆而来,那家公司叫做 Acorn Computers,曾经是英国教育市场的著名个人台式计算机供应商,现已不复存在。

    80年代中期时,Acorn 一个小团队接受了一个挑战,为他们的下一代计算机挑选合适的处理器,他们起草了一个技术需求说明书,经过相当长的摸索后得出一个结论:无法找到与之相符的产品,于是 Acorn 决定自己设计处理器,一个小团队只用了18个月就完成了设计并实现了这款处理器。

    1985年4月26日,第一台原型机在 Acorn 的剑桥办公室中开始运行代码,那时它被称为”Acorn RISC Machine”,随着 Acorn 公司转向衰落,处理器设计部门被分了出来,组成了一家新公司,最初叫做 Advanced RSIC Machines Ltd。现在公司和处理器都简称为ARM。

    ARM 以其各种 RISC 处理器内核而著称,但也出品大量的支持技术满足芯片设计师和软件开发者的需要,这包括物理IP,软件模型和开发工具,图形处理器,以及外围设备,注意,但是 ARM 并不生产芯片,ARM是半导体知识产权业务中的开拓先锋,目前市面上大量 ARM 设备都是由ARM分布于世界各地的授权商制造的。

    下面说下 ARM 产品在哪些领域通过通用数字产品发挥用武之地,ARM 提供:在系统芯片(SoC)上的系统级IP,以及物理IP,确保其可制造性开发工具,帮助设计和制造系统架构和软件,当然生产出成品还需要许多其他投入,如工业设计,封装,环境调查,操作系统,外围IP等,这些都不是 ARM 的产品,但 ARM 有很多合作伙伴,制造出了成千上万的设备,从下图中你会发现许许多多部署了基于 ARM 解决方案的应用。

    0?wx_fmt=png

    从硬盘驱动器到打印机,从游戏设备到智能量表,从洗衣机到电视机,可谓包罗万象,即便如此,还没有终点,时刻都在增长,到目前为止,以ARM架构的芯片出货量总共达到500亿片,每年还以大约80亿的数字在增长,到2020年,总量有望达到1000亿。

    ARM 内核现在广受欢迎的一个原因是支持一系列的性能和功能点。我相信许多人听说 ARM 是从 ARM7TDMI 处理器内核的成功开始的,从上世纪90年代起这一内核在手机行业得到了广泛采用,也是ARM早期成功的奠基石。

    虽然现在依然受到广泛使用,也可以购买到包含这一内核的大量部件,但不再提供 ARM7TDMI 的授权许可,现在已经从这一内核发展出以实时嵌入式空间为目标的整个产品路线图,现在有两大产品系列,Cortex-M系列主要用于注重成本节约的微控制器;

    Cortex-R系列,提供非常高的性能和吞吐量,同时保持精准的时序属性和可预测的中断延时,通常用于时序关键的应用中,如引擎管理系统和硬盘驱动器控制器。

    后来发展了整个系列的应用处理器,从产品线最初的ARM926EJ-S开始,发展到了 ARM11MP,现在包含了 Cortex-A 系列,这些处理器设计为可在要求 linux 等平台操作系统的应用中提供可缩放的高性能。

    它们融合了精密的内存管理功能,以及多媒体处理扩展指令集,从 ARM11MP 开始加入了针对多核系统的支持,Cortex-A 系列的最新核心现在以多核配置提供,这使得它们能够真正涵盖广阔的功率和性能点范围。

    我们现在已经对公司渊源和架构有了些了解,现在让我们进入 ARM 芯片的内部吧。

    内核的工作原理

    0?wx_fmt=png

    经典的ARM系统级芯片或所谓的SocC包含许多组件,其中只有一些直接源自ARM。首先,核心本身通常深度嵌入在设备内部,在设备范畴内通常不直接可见,而调试端口通常是唯一和核心本身相连的外露部分,有一些粘合逻辑,如时钟和复位集成电路。

    由于 ARM 核心只有两个中断输入,最常见的外设就是某种中断控制器,在外设内部,各组件通过芯片上互联总线架构相互连接,对于极大多数基于ARM的设备而言,这就是标准的 AMBA 互联。

    AMBA 指定了两个总线,称为AXI的高性能系统总线,和称为APB的低功耗外设总线,APB通常用于连接所有外设,AXI则用于存储器和其他发高速设备,大多数设备都有一定数量的芯片上存储以及连接外设存储器设备的接口,但是注意,与设备的外部连接并不是AMBA总线,这仅在设备内部使用,并不外露。

    下面看看这个Soc的工作原理——编程器模型(programmer’s model)。谨记,A系列和R系列配置在编程器模型上非常相似,但M系列配置在许多非常重要的方面都有很大不同,这在接下来的讲解中会指出这些差别。

    从根本上说,ARM是RISC架构,你可能会否认现在的ARM内核其实不属于RISC平台,但它们与RISC有很大的渊源,也保留了传统上与RISC架构相关的许多特性,例如大多数指令在一个周期内执行,寄存器集基本上是正交的,而且指令集实施加载存储式架构,也就意味着能够直接处理内存中内容的指令只有加载和存储指令,如果需要对内存中的值执行任何处理,程序必须将这些值加载到寄存器中,执行所需的处理,然后将结果存回到内存中,其他常见架构则能够直接操控或修改内存中的内容。

    所有的内部寄存器除了一些受到NEON架构的矢量处理功能支持外都是32位宽的,它们的内部由32位ALU处理,内存则通常在32位元中予以处理,这就是ARM的字长。

    谈到指令集时,你会发现 ARM 核心不只有一个指令集,所有 ARMv7-A 和 ARMv7-R 核心都支持32位原生 ARM 指令集和 Thumb 指令集,后者中的指令可以是32位或者16位的。

    ARM 指令集释放了内核的完整性能潜力,而Thumb指令集则提供了更出色的代码密度,我们把ARM和Thumb指令间切换这一过程称为“交互工作”,不要担心,编译器和链接器会处理它们。一些较旧的内核支持Thumb指令集的早期版本,其中所有的指令都是16位指令,比如 ARMv7-M 内核仅就支持Thumb指令集。

    如果你之前接触过处理器架构,相信你会熟悉运行模式的概念以及特权的概念。许多架构通常支持两种模式,分别为“Supervisor”和“User”,其中一个模式拥有特权,另一个则没有。

    在无特权模式下代码可能无法直接执行某些特定的操作,比如,禁用中断,重新配置内存保护,或访问特定的内存区域,这是大多数操作系统的基本要求,允许系统从用户任务中保护自己。ARM内核通常支持七种基本运行模式,每种模式有权访问自己的堆栈空间,以及一组不同的寄存器子集,除一个外其余都是由特权的模式,如下:

    0?wx_fmt=png

    其中6种是特权模式,User 模式是没有特权的模式,作为唯一的无特权模式,User 模式供操作系统用于用户任务和处理器。

    此外,有5种模式称为“异常模式”,每一种都与处理特定种类的异常或中断相关,例如,当内核开始处理外部中断时会自动进入 IRQ 模式,而 Supervisor 模式则用于处理 SVC 指令和硬件复位,这些模式分别拥有专属的堆栈空间,以及一小组专用寄存器,我们把这一功能叫做寄存器编组,只是这些异常属于不同的类型。

    注意,上图仅适用于 Cortex-A 和 Cortex-R 处理器,Cortex-M 微控制器的模式结构则全然不同。ARMv7-M 架构配置仅定义了两种模式,如下图,分别是 Thread 模式和 Handler 模式,Thread 模式没有特权,用于应用程序代码, Handler 模式有特权,用于异常处理程序,当系统复位时在 Thread 模式中开始执行,遇到异常时自动变为 Handler 模式,处理程序完成后再回到 Thread 模式。

    0?wx_fmt=png

    下面我们重点讲下这些模式是如何与寄存器组交互工作的:

    0?wx_fmt=png

    比如我们来看看核心切换到IRQ模式以处理外部异常时会发生什么,从图中你可以看到User模式的r13和r14切换为IRQ模式中与它们对应的寄存器,由于r13用作堆栈指针,所以这表示IRQ中断在独立的堆栈中进行处理。

    此外也可以看到另一个寄存器也加入到集合中来,它是 Saved Program Status Register 即 SPSR,用于保留模式更改发生时处理器状态的快照,才能使得在处理中断事件后返回到 User 模式并恢复程序变得非常容易,当中断处理结束后,就回到User模式,重新获取原先的寄存器。

    在以上描述的寄存器集合和组织适用于 Cotex-M 之外的所有ARM内核,Cotex-M 内核具有不同的寄存器集合和组织,见下图。

    之前一直强调Cotex-M寄存器是不同的,差别就在这里,只有18个寄存器没有我们在其他内核上看到的编组方案。

    首先,有13个通用寄存器,其中r0到r7是低位寄存器,r8 到 r12 是高位寄存器,还有3个特殊寄存器:Stack Pointer,Link Register 和 Program Counter,最后一个寄存器是程序状态寄存器 xPSR。

    注意,Contex-M 内核有两种处理器模式:Thread 模式和 Handler 模式,只有一个寄存器在这两种模式之间编组,它就是 Stack Pointer。

    0?wx_fmt=png

    这里扩展下状态寄存器 Program status register:

    0?wx_fmt=png

    左边28到31位是ALU条件代码,由数据处理指令进行可选设置,并由条件指令进行测试,还有4个额外的状态位GE位,用于记录来自SIMD指令的多个结果。只有这些ALU状态位可以在处于User模式时进行修改。

    最右边的5位显示当前的处理器模式,它们在响应异常中出现模式更改时自动设置,也可以手动修改以便在程序控制下更改模式。

    J和T这两个位记录处理器的当前状态,告诉内核当前正在执行哪一行指令集,可能是ARM状态,即正在执行ARM指令;Thumb状态,即正在执行Thumb指令;或者Jazelle状态,即正在执行Java字节代码。

    I位和F位可启用或禁用IRQ和FIQ中断。A位允许禁用或暂时停用异步数据中止。E位允许在程序控制下动态更改数据接口的字节序(Little或Big字节序),简化了混合字节序数据的处理。剩余的位被“保留”或者用于和特定指令的内部系统状态,不可由程序修改。

    下面来讲一下 Cortex-M 内核中可用的状态寄存器:

    0?wx_fmt=png

    你会发现它比前面讲的状态寄存器简单的多,这也说明了Cortex-M内核的简洁性。有一个T位,因为 Cortex-M 内核仅支持 Thumb 指令集,所以此位始终是1。最后又一个字段,它在核心执行异常处理程序时包含当前活动的异常编号。

    初学者可能会问异常时会发生什么,在ARM架构中,异常是某种类型的事件,导致任何内容正常的程序流中出现中断,异常可以是内部的,如内存转译错误;也可以是外部的,如来自外设的中断;也可以是同步的,如SVC指令;或者是异步的,如计时器中断。无论原因如何,核心对所有异常的处理方式基本上相同。

    当一个应用程序在逐一执行各个指令时,异常来时内核要做的第一件事就是确保它能够在异常之后回到这一点上,为此我们必须对当前状态抓取一个快照,所以内核复制 CPSR 并保存在 SPSR 中,再复制PC并保存在LR中,然后内核切换到相应的异常模式禁用进一步的中断,确保它处于正确的状态,接着使用矢量表确定可以找到异常处理程序的位置,每一个异常类型分别有一个条目,每一条目是一个指令,分出相关的处理程序代码,所以核心就是从正确的矢量表条目加载 Program Counter 执行异常处理程序。

    当处理程序完成时,要返回到中断的程序就简单了,只要从SPSR中保留的副本还原CPSR,再从链接寄存器还原 Program Counter。当然Cortex-M在处理异常时完全是另一回事,这里就不详讲了。

    现在相信你已经了解了寄存器,模式和状态的所有信息,现在我们来谈谈ARM内核提供的指令集。目前市场上的大多数ARM内核至少支持两种指令集:原生的32位 ARM 指令集,以及混合了16位和32位的Thumb指令集,我们先看看ARM指令集。

    虽然这次chat不是ARM汇编语言的课程,但也能让你有足够的了解。ARM指令集中的所有指令都是32位长,乍一看ARM指令的语法似乎非常复杂,不过一旦你了解运算符和可能的运算对象的基本结构,其实还是非常简单的,毕竟它是RISC架构。下面举例说明,第一个真的很简单:

    1. SUB r0, r1, #5
      它显然是个减法指令,有3个参数。第一个参数是寄存器,指定减法结果的目的地;另外两个参数指定输入参数,可以理解为从左到右为”r0 = r1 - 5”。

    2. ADD r2, r3, r3, LSL #2
      这是一个加法指令,提供一个作为第二输入运算对象的寄存器,再指定内联移动或循环运算应用到运算对象上,作为指令的一部分,这个指令可以理解为”r2等于r3加上r3向左移动两个位置”。

    3. ANDS r4, r4, #0x20
      这是一个逻辑AND指令,注意这个AND有个后缀’S’,这指定将CPSR中的ALU条件代码设为反映该结果,ARM数据处理运算默认情况下不影响条件代码,所以使用这个’S’后缀来指定需要这么做的运算。

    4. ADDEQ r5, r5, r6
      这又是一个ADD,它是有条件指令,该助记符带有“EQ”后缀,表明只有在达到EQ条件为真时才会执行这一指令,如果该条件不为真,指令将表现为NOP。

    5. LDR r0, [r1]
      这是一个加载指令,将r1中指定地址的值加载到r0中。在指定内存访问指令的地址时,我们使用方括号来表达。

    6. STRNEB r2, [r3, r4]
      这是存储指令,只有在NE条件有效时才会执行操作,其次它是一个字节层面的存储,它将r2中最不重要的字节存储到r3加r4得到的内存位置上。

    目前为止,我们只是谈了 ARM 指令集,众所周知所有 ARM 指令都是32位的,为了提供更好的代码密度,ARM在很久之前推出了第二指令编码,叫做 Thumb, Thumb 所有指令都是16位的。

    Thumb 代码通常在代码密度上可以改善大约35%,大多数C和C++代码都针对具备 Thumb 功能的核心上的 Thumb 进行编译。

    既然 Thumb 这么好,我们为何要把真么多精力放在ARM指令集上呢?这是因为 Thumb 是编译代码的最佳目标,如果你直接在汇编程序中编写代码,ARM相对是更好的选择。下面让我们进一步地剖析ARM的实现原理。

    ARM 的技术实现

    要想深入理解ARM的实现原理是个很大的学习工程,这里一样希望读者读后能对ARM起到一个总体的认识,后续可以进一步的深入学习。我们先以 ARM 汇编基础来展开这一章的 chat。

    汇编语言是机器代码上的一个薄的语法层,它由以二进制编码的指令组成,这是我们的计算机所理解。那么为什么我们不写代码呢?可想而知以二进制来进行 coding 的话是多么的痛苦,因此我们将编写ARM程序集。

    但是计算机本身只识别机器码是不能运行汇编代码的,这就需要将汇编代码装到机器代码中的工具 GNU Binutils 项目中的 GNU Assembler。一旦用扩展名*.s编写程序就需要把它与其进行组合并与ld链接起来:

    $ as program.s -o program.o$ ld program.o -o program

    0?wx_fmt=gif

    我们从最底层来看下,在最底层,电路上有电信号,信号是将电压切换为两个电平来形成的,例如0伏(关)或5伏(开)。

    因为只是我们不能轻易的告诉电路电压,只能选择使用1/0来写入开/关的模式,然后我们对0和1的顺序进行分组,以形成机器码指令,该指令是计算机处理器的最小工作单元,以下是机器语言的示例:

       1110 0001 1010 0000 0010 0000 0000 0001

    我们知道ARM处理器只能对寄存器执行数据处理,所以与存储器的交互有两种:从存储器加载到寄存器,并将值从寄存器存储到存储器,即ARM使用加载/存储(LDR和STR)模型进行内存访问。

    通常 LDR 用于将内存中的内容加载到寄存器中,STR用于存储寄存器中的内容到存储器地址。我们来举一个基本例子:

    0?wx_fmt=png

    第一看的小伙伴或许会一头雾水,下面以一张动态图来解释下 ARM 是如何和存储器交互的:

    0?wx_fmt=gif

    参考

    正如刚开始所说的,本次 chat 不是所有 ARM 架构和技术的详尽概览,而是通向 ARM 世界的一扇大门,ARM 网站上有丰富的文档等你去查阅,探索。

    比如(http://infocenter.arm.com)可以找到架构参考手册,知识库文章,常见问题解答,处理器文档,以及开发者指南等。

    ARM 还有一个不断壮大的全球大学计划,为你提供大量的教学和培训资源,软件工具,以及硬件开发板。

    展开全文
  • ARM汇编程序开发入门

    千人学习 2018-10-22 21:38:04
    本课程主要讲解ARM处理器的arm指令,thumb指令,ADS伪指令,汇编程序设计。
  • ARM处理器体系结构

    千人学习 2018-10-22 21:38:04
    本课程主要的内容是介绍ARM处理器的体系结构发展历史,工作模式,存储器组织基本知识。
  • 由于考试我把课后答案整理一下,现在拿出来给大家分享一下。希望对学习的,和考试的都有帮助。
  • 我是本科就开始学习Linux,参考了很多资料,其中一直在更新的目前看也只有韦东山老师了,当然还不得不提就是原子哥开始做Linux开发板,还是一样的配方(卖板子,资料全部免费,简单粗暴的模式),感觉韦东山老师的...

    我是本科就开始学习Linux,参考了很多资料,其中一直在更新的目前看也只有韦东山老师了,当然还不得不提就是原子哥开始做Linux开发板,还是一样的配方(卖板子,资料全部免费,简单粗暴的模式),感觉韦东山老师的压力估计又大了些。补充:火哥也开始做Linux开发板了,火哥也是我学习STM32路上的榜样,之前还经常在论坛互动,不过工作后由于方向的转换也是很久没去论坛了。

    下边分享的是我从之前买的韦东山老师的教程翻出来的,讲的很好(虽然我完全没有照做。。。)
    在这里插入图片描述


    ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标:
    (1) 掌握主流嵌入式微处理器的结构与原理(初步定为arm9)
    (2) 必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定)
    (3) 必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。

    从事嵌入式软件开发的好处是:
    (1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。
    (2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。
    (3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。
    (4)兴趣所在,这是最主要的。

    从事嵌入式软件开发的缺点是:
    (1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。
    (2)这方面的企业数量要远少于企业计算类企业。
    (3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。
    (4)平台依托强,换平台比较辛苦。

    兴趣的由来:
    1、成功观念不同,不虚度此生,就是我的成功。
    2、喜欢思考,挑战逻辑思维。
    3、喜欢C
    C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下:
    相信程序员。
    不要阻止程序员做那些需要去做的。
    保持语言短小精干。
    一种方法做一个操作。
    使得它运行的够快,尽管它并不能保证将是可移植的。
    4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。
    5、发展前景好,适合创业,不想自己要死了的时候还是一个工程师。

    方法步骤:
    1、基础知识:
    目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件,那将是我的优势。
    科目:数字电路、计算机组成原理、嵌入式微处理器结构。
    汇编语言、C/C++、编译原理、离散数学。
    数据结构和算法、操作系统、软件工程、网络、数据库。
    方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可根据需要选修。
    主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。

    2、学习linux:
    目的:深入掌握linux系统。
    方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。
    主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。

    3、学习嵌入式linux:
    目的:掌握嵌入式处理器其及系统。
    方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。
    (2)嵌入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。
    (3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。
    主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。

    4、深入学习:
    A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。
    B、通信协议及编程技术:TCP/IP协议、802.11,Bluetooth,GPRS、GSM、CDMA等。
    C、网络与信息安全技术:如加密技术,数字证书CA等。
    D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。
    说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一 种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。
    注意: 要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。
    不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻电影。还有一些不愿意做但必须要做的!
    技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。

    嵌入式书籍推荐
    Linux基础
    1、《Linux与Unix Shell 编程指南》
    C语言基础
    1、《C Primer Plus,5th Edition》【美】Stephen Prata着
    2、《The C Programming Language, 2nd Edition》【美】Brian W. Kernighan David M. Rithie(K & R)着
    3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
    4、《嵌入式Linux应用程序开发详解》
    Linux内核
    1、《深入理解Linux内核》(第三版)
    2、《Linux内核源代码情景分析》毛德操 胡希明著
    研发方向
    1、《UNIX Network Programming》(UNP)
    2、《TCP/IP详解》
    3、《Linux内核编程》
    4、《Linux设备驱动开发》(LDD)
    5、《Linux高级程序设计》 杨宗德著
    硬件基础
    1、《ARM体系结构与编程》杜春雷着
    2、S3C2410 Datasheet
    英语基础
    1、《计算机与通信专业英语》
    系统教程
    1、《嵌入式系统――体系结构、编程与设计》
    2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明着
    3、《Building Embedded Linux Systems》
    4、《嵌入式ARM系统原理与实例开发》 杨宗德著
    理论基础
    1、《算法导论》
    2、《数据结构(C语言版)》
    3、《计算机组织与体系结构?性能分析》
    4、《深入理解计算机系统》【美】Randal E. Bryant David O’'Hallaron着
    5、《操作系统:精髓与设计原理》
    6、《编译原理》
    7、《数据通信与计算机网络》
    8、《数据压缩原理与应用》

    C语言书籍推荐

    1. The C programming language 《C程序设计语言》
    2. Pointers on C 《C和指针》
    3. C traps and pitfalls 《C陷阱与缺陷》
    4. Expert C Lanuage 《专家C编程》
    5. Writing Clean Code -----Microsoft Techiniques for Developing Bug-free C Programs
      《编程精粹–Microsoft 编写优质无错C程序秘诀》
    6. Programming Embedded Systems in C and C++ 《嵌入式系统编程》
      7.《C语言嵌入式系统编程修炼》
      8.《高质量C++/C编程指南》林锐
      尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要。

    之前也总结了一一些书单,也一起分享下
    C语言推荐书籍从入门到进阶带你走上大牛之路(珍藏版)
    C++推荐书籍从入门到进阶带你走上大牛之路(珍藏版)
    算法与数据结构从入门到进阶带你走上大牛之路(珍藏版)

    展开全文
  • 韦东山的教程比较全面,一时作为入门,第一步想实现的就是在交叉开发环境中编译生成可执行的hello word,然后下载到开发板运行。如下为个人学习后整理的一个大体步骤,具体操作步骤需要参考韦东山的资料。...
  • 北邮用 或者其他高校也可用 arm&linux嵌入式系统教程第二版课件全
  • 嵌入式Linux系统移植的四大步骤

    千次阅读 多人点赞 2018-12-28 09:46:57
    最近在学习系统移植的相关知识,在学习和调试过程中,发现了很多问题,也解决了很多问题,但总是对于我们的开发结果有一种莫名其妙的感觉,纠其原因,主要对于我们的开发环境没有一个深刻的认识,有时候几个简单的...
  • 安装这个交叉编译器的基本上都是嵌入式行业的兄dei吧。。。 目前网上搜索发现,最多人安装的是4.4.3版本的: arm-linux-gcc-4.4.3.tar.gz ...但是很多人安装之后发现不能用,会遇到“arm-none-linux-gnueabi-g...
  • 一文看懂arm架构和x86架构有什么区别

    万次阅读 多人点赞 2019-05-11 20:28:30
    本文主要介绍的是arm架构和x86架构的区别,首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能、扩展能力、操作系统的兼容性、软件开发的方便性及可使用工具的多样性及功耗这五个方面详细的对比了arm架构和x86...
  • ARM和x86比较

    万次阅读 多人点赞 2017-10-26 09:17:07
    信不信,随便逮住一个人问他知不知道CPU,我想他的答案一定会是肯定的,但是如果你再问他知道ARM和X86架构么?这两者的区别又是什么?绝大多数的人肯定是一脸懵逼。今天小编就带你深入了解CPU的这两大架构:ARM和X86。...
  • ARM架构和Cortex 三大系列关系小结

    万次阅读 多人点赞 2018-03-08 16:32:09
    一、ARM介绍1、ARM在1990年成立,当初的名字是“Advanced RISC Machines Ltd.,”二、Cortex处理器家族三大方向发展进程三、ARM处理器与架构对应表四、ARM核对应的时间表致谢1、ARM_architecture维基百科2、List_of_...
  • 本文讲解使用apt-get 自动下载安装arm-linux-gcc
  • 查看android手机arm版本

    万次阅读 2017-04-07 15:38:22
    在android studio终端Terminal下执行 E:\pad\xypad>adb shell getprop ro.product.cpu.abi arm64-v8a
  • Genymotion-ARM-Translation.zip各安卓版本合集

    万次阅读 多人点赞 2018-10-27 00:20:19
    Genymotion-ARM-Translation GApps 8.0 – 8.1 Oreo奥利奥 ARM_Translation_Oreo.zip 7.0 – 7.1.2 Nougat牛轧糖 6.0 – 6.0.1 Marshmallow棉花糖 ARM_Translation_Marshmallow.zip ...
  • ARM LINUX与普通LINUX区别

    万次阅读 2018-06-07 09:34:25
    相对于ARM linux,我们说的普通linux指的是X86 linux,他们都是linux系统,但是由于ARM和X86是不同的CPU架构,他们的指令集不同,所以软件编译环境不同,软件代码一般不能互用,一般需要进行兼容性移植。  X86是...
  • 其实很简单,只需要一个命令即可。 在cmd命令窗中输入systeminfo即可,如下图:
  • 使用命令$ arch即可查看linux的内核版本。 标题中几种版本的区别课参考:参考链接
1 2 3 4 5 ... 20
收藏数 324,272
精华内容 129,708
关键字:

arm