ARM+Linux系统启动流程分析----ARM处理器的启动流程


 开发环境如下:

                                        PC操作系统:RetHat Enterprise Linux6.3版本,内核版本:linux-2.6.39

                                        交叉工具链:arm-linux-xxx 4.3.2

                                        开发板:Friendly Mini2440 :arm9内核,64M SDRAM,256M NAND FLASH

                                        bootloader:u-boot-2009.08

                                        开发板内核版本:linux-2.6.32


        在前一篇文章中,笔者简单介绍了 ARM+Linux 系统的软件组成部分,其中分析到第一个得到运行的软件是Bootloader。本来接下来应该直接介绍bootloader 的执行过程的,但是笔者细想一下,如果不介绍ARM处理器的启动流程,将会对介绍bootloader的工作过程产生很大的负面影响,于是决定开这篇文章详细介绍ARM处理器的启动流程。

        这里要介绍S3C2440 处理器的启动流程,这款处理器采用了ARM9 架构,其他ARM架构如arm11、cortex-a8 的启动流程大同小异。

        要介绍S3C2440处理器的启动流程,首先要了解S3C2440 的地址空间分布:

ARM+Linux系统启动流程分析----ARM处理器的启动流程_第1张图片


        事实上,S3C2440处理器支持两种启动方式:NANDflash 启动和NORflash启动,因此,它就会有两种不同的地址空间分布。我们介绍的是上图右边的NAND flash 启动的地址分布。

        从上图的右半部分可以看出,S3C2440 的外部寻址空间是128M*8=1G。为什么要这样算?笔者认为:S3C2440 对外的地址总线只有27根,即寻址只有128M,这显然太小了,于是设计师就想出一个办法扩大寻址空间:用几个引脚的信号代表目前这27根地址线的地址区间,当信号改变时,地址线的地址区间就代表另外的区间,这样即使地址线上的数据相同,由于那几个引脚的信号不同,因此所代表的地址也就不同,这样就达到了扩大地址空间的目的。这几个引脚其实就是所谓的片选信号。每个片选信号代表一个地址区间,加上地址线的信号就可以确定一个唯一的地址,即(地址=片选信号+地址线信号)。值得一提的是笔者的内存SDRAM是是挂在nGCS6的,所以内存地址基本都是0x30000000 往后64M区间。

        从图右半部还可以看出,第一个片选信号nGCS0 是不存在的,取而代之的是一块4KB 的SRAM,这个块内存区可了不得,它是整个ARM处理器启动流程的关键硬件。它还有个学名叫”stepping stone“,垫脚石。从名字就可以看出这是系统启动的垫脚石,作为一个"跳板”,让系统能够顺利启动。

        说到这基本就可以分析系统启动的流程了。先明确一点:系统一上电,硬件就将NAND FLASH 的前面4K内容自动拷贝到”垫脚石“中,而此时cpu 的pc指针是指向0X00的,即指向“垫脚石'的起始位置。由前一篇文章介绍可知,NAND FLASH 的第一部分内容是Bootloader的代码。这样就很明确了:系统一上电,bootloader 的前4K 内容就被自动拷贝到”垫脚石“中并且被执行。接着bootloader 就开始工作,前4K的内容一般会将nand flash 做一个初始化,然后将剩余的代码拷贝到内存中,然后bootloader 跳转到内存中接着执行剩下的bootloader的代码。

         到这里,ARM处理器的启动流程就介绍完毕,内容很少但是却很重要,我们从硬件支持的角度找到了系统的入口点。

        本章完,下一章:《ARM+Linux系统启动流程分析----bootloader》

你可能感兴趣的:(ARM,处理器架构,Linux,操作系统原理)