5.1.内存和IO的访问方式
(1)内存是程序的运行场所,内存和CPU之间通过总线连接,CPU通过一定的地址来访问具体内存单元。内存CPU的地址总线来寻址定位,然后通过CPU的数据总线来进行读写内存空间。CPU的地址总线的位数是CPU设计时确定的,因此一款CPU所能寻址的范围是一定的,而内存是需要占用CPU的寻址空间的。内存和CPU的总线式连接方式是直接连接,优点是效率高、访问速度快,缺点是资源有限、扩展性差。
(2)IO是输入输出接口,是CPU和其它外部设备(如串口、LCD、触摸屏、LED等)之间通信的道路,通常IO就是指CPU的各种内部或外部外设。CPU访问各种外设有2种方式:第1种是把外设的寄存器地址当做一个内存地址来读写,从而以访问内存相同的方式来操作外设,即IO与内存统一编址方式;第2种是使用专用的CPU指令来访问某种特定外设,即IO与内存独立编址方式。
(3)对比:由于内存访问频率高,因此采用总线式连接,直接地址访问,效率最高。IO与内存统一编址方式的优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源。IO与内存独立编址方式的优势是不占用CPU地址空间,缺点CPU的设计变复杂了。
5.2.程序和数据及CPU结构
(1)程序运行时两大核心元素:程序+数据。程序是我们写好的源代码经过编译、汇编之后得到的机器码,这些机器码可以拿给CPU去解码执行,CPU不会也不应该去修改程序,所以程序是只读的。数据是程序运行过程中定义和产生的变量的值,是可以读写的,程序运行实际就是为了改变数据的值。
(2)程序和数据都放在内存中而且彼此不分离的结构称为冯诺依曼结构,譬如Intel的CPU均采用冯诺依曼结构;程序和数据分开独立放在不同的内存块中,彼此完全分离的结构称为哈佛结构,譬如大部分的单片机(MCS51、ARM9等)均采用哈佛结构。
(3)对此:冯诺依曼结构中程序和数据不区分的放在一起,因此安全和稳定性是个问题,好处是处理起来简单;哈佛结构中程序(一般放在ROM、flash中)和数据(一般放在RAM中)独立分开存放,因此好处是安全和稳定性高,缺点是软件处理复杂一些(需要统一规划链接地址等)。
5.3.寄存器的本质
(1)寄存器属于CPU外设的硬件组成部分。CPU可以像访问内存一样去访问寄存器。寄存器是CPU的硬件设计者制定的,目的是留作外设被编程控制的”活动开关”。
(2)正如汇编指令集是CPU的编程接口API一样,寄存器是硬件外设的软件编程接口API,使用软件编程控制某一硬件,其实就是编程读写该硬件的寄存器。
(3)编程操作寄存器类似于访问内存;寄存器中每个bit位都有特定含义,因此编程操作时需要位操作;单个寄存器的位宽一般和CPU的位宽一样,以实现最佳的访问效率。
(4)SoC中有两类寄存器:通用寄存器和SFR特殊功能寄存器。通用寄存器(ARM中有37个)是CPU的组成部分,CPU的很多活动都需要通用寄存器的支持和参与。SFR不在CPU中,而存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设,这就是硬件编程控制的方法。
5.4.ARM体系结构要点总结
(1)ARM的CPU是RSIC架构,常用的汇编指令只有二三十条;ARM是低功耗CPU;ARM架构非常适合单片机、嵌入式,尤其是物联网领域;而服务器等高性能领域目前主导还是Intel。
(2)ARM是IO与内存统一编址的,大部分ARM(M3、M4、M7、M0、ARM9、ARM11、A8、A9)都是32位架构;32位的ARM的CPU支持的内存少于4G,内存通过CPU地址总线来访问。
(3)SoC中的各种内部外设通过各自的SFR编程访问,这些SFR的访问方式类似于访问普通内存,即IO与内存统一编址。
(4)ARM是哈佛结构,常见的ARM(除ARM7外)都是哈佛结构的;哈佛结构保证了ARM的CPU运行的安全性和稳定性,因此ARM适用于嵌入式领域;哈佛结构决定了ARM裸机程序(使用实地址即物理地址)的链接比较麻烦,必须使用复杂的链接脚本告知链接器如何组织程序,对于工作在OS上(即虚拟地址)的应用则不需要考虑那么多。