嵌入式系统Linux内核开发实战指南(ARM平台)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第8章 ARM处理器启动过程

8.1 ARM处理器上电/复位操作

ARM处理器上电与复位操作过程类似,都是从处理器的低端复位向量地址0位置读取第一条指令,由于ARM处理器的异常中断向量是连续排列的,所以异常中断入口指令一般都是一条跳转指令,至少跳过异常中断向量区,然后按照程序流程执行。

不同嵌入式处理器的启动模式有很大差别,相同架构的不同处理器型号或序列的启动模式也不一样,比如:MC68VZ328(MC68K)有4种启动模式;PPC405GP(PowerPC)有两种启动模式;PPC440EP(PowerPC)有8种启动模式;SB1250(MIPS)有两种启动模式;PNX1700(DSP)有4种启动模式,而大部分处理器只有一种启动模式,可通过芯片的数据手册了解芯片的启动模式。

ARM处理器中的大部分也只有一种启动模式,如S3C4510、S3C44B0、IXP425等,但有的也有两种或多种启动模式,如AT40800、CS89712等。

在ARM处理器中,不管是一种启动模式还是两种启动模式,每种启动模式都是从处理器的低端复位向量地址0位置读取第一条指令是不变的,不同的是,只有一种启动模式的处理器启动时都是从挂在CS0片选上的flash或ROM芯片的0地址处读取指令,而有两种启动模式的处理器的另一种启动模式是从片内的ROM或SRAM的0地址位置读取指令。

我们这里只列出AT40800系列芯片的启动模式,如表8-1所示:

表8-1 AT40800系列芯片启动模式

8.2 ARM处理器系统初始化过程

每次系统上电/复位启动时,处理器都处于一种最低性能即只有最基本功能的状态,此时它只能从复位向量地址处去读取指令,其他功能模块都处于禁止或者不可预知状态,而一旦处理器从复位向量地址位置读取到第一条指令开始执行,那么从软件的角度看,处理器和整个系统就开始进入了软件可控状态,系统下面的行为就由软件流程决定,软件要做的第一件事就是初始化整个系统。

系统初始化的一般顺序为:

1)禁止MMU,关闭中断,禁止cache;

2)根据硬件设计配制好处理器时钟、DRAM时钟、定时器时钟;

3)根据系统中所用的flash和DRAM芯片容量和电气参数设置它们的起始地址、容量、刷新频率等;

4)将固化在flash芯片中的程序搬移到DRAM内存中;

5)使能cache,使能MMU,跳转到DRAM内存中运行继续初始化,包括根据具体应用以及系统中的硬件配置初始化各个功能模块、安装好异常中断处理程序、使能中断等;

6)进行操作系统相关初始化。

8.3 ARM处理器系统初始化编程注意事项

在上述系统初始化过程中有以下两点需要注意,如果处理不好就可能出现程序跑飞的情况。

1)如果需要将程序从flash搬移到DRAM中运行

在现代嵌入式系统中,由于DRAM的速度比flash的速度快很多,所以除了极少数对性能要求不高但对成本要求很高的系统把程序放在flash中并一直在flash中运行外,大部分嵌入式系统都是将程序从flash芯片搬到DRAM芯片中运行,这样就会存在一个问题,因为我们编译链接程序都是将程序链接到程序最后运行的场所DRAM中的地址上,但是系统启动时只能从flash中读取指令,所以从系统启动读取的第一条指令到进入到DRAM运行前的程序代码是与地址无关的,如果要跳转到某个标号处运行,必须是基于pc的,不能是绝对跳转指令,因为此时程序存放的位置与其所链接到的位置不同,如果使用跳转指令,程序将跑飞。

2)如果要求程序在MMU使能状态下运行,即系统工作在虚拟地址模式

MMU使得系统能够更好地管理内存,因为MMU可以将同一段物理内存映射到多段虚拟地址空间上,而且可以将物理上不连续的内存映射到连续的虚拟内存空间(减少内存碎片),另外MMU还可以控制虚拟内存区段的缓冲特性和访问权限,所以MMU可以提高内存的使用效率,使程序仿佛能够使用比实际物理内存容量多得多的内存空间,提高系统性能,同时也增加了系统的安全性,所以在带有MMU功能的处理器系统中,一般都应该使能MMU,充分利用其功能。这样一来也会导致一个和上面相同的问题,因为在使用MMU的系统中,各种物理存储空间的实际物理地址与对应的虚拟地址设置得各不相同,包括flash和DRAM的物理地址与虚拟地址。系统启动时MMU被禁止,系统运行在实模式即物理地址模式,但程序却被编译链接到了虚拟地址上,这样在使能MMU之前,存放在flash或DRAM中的程序的实际地址(物理地址)与其链接到的地址是不相同的,所以从系统启动到MMU使能之间的程序代码也应该是与地址无关的,如果要跳转到某个标号处运行,必须是基于pc的,不能是绝对跳转指令,否则程序也将跑飞。