启动过程
linux系统在2440上的启动过程分为三个阶段:
启动u-boot
启动linux内核
挂载根文件系统
bootloader介绍
bootloader的本质是一个裸机程序 。
bootlood专门是为了能够正确地启动linux操作系统,在系统初上电时需要对系统做一些硬件的初始化操作 。例如初始化内存,初始化时钟 等等。最终bootloader会将linux内核(kernel)加载到ram 中,并引导系统去执行linux代码,完成linux的启动。所以不难看出,bootloader在这里起到一个承上启下的作用。
bootloader的任务
很明显,bootloader是系统上电 或者重新启动所执行的第一个程序,那么它主要完成了哪些任务呢?
初始化异常向量表;
初始化工作模式;
初始化栈指针寄存器;
初始化时钟;
初始化串口等必要的外设。
这些设置都是裸机程序所必须的。 除了上述耳熟能详的工作外,bootloader为了能够正确启动linux操作系统,还做了以下几个工作:
关闭MMU;
关闭DCache;
初始化sdram;
初始化nand flash;
初始化网卡并集成一些必要的协议,如tcp,tftp等;
提供一个类似于linux那样的终端,方便与操作人员互动;
能够设置并保存一些参数;
能够复制linux内核程序到指定的内存空间,并引导系统运行;
bootloader的分类
几乎所有运行大型操作系统的硬件平台在启动操作系统前都需要一个定制化的bootloader 。行业中电脑系统使用的bootloader是cmos 。而嵌入式系统中使用最为广泛的是u-boot 。所以可以简单的理解为u-boot是一种专门为嵌入式系统打造的bootloader 。而接下来我们将着重学习如何移植、下载和使用u-boot。
u-boot的启动
在进入移植u-boot之前,我们还需要搞清楚一个问题,那就是u-boot作为系统上电和复位之后运行的第一个程序,2440是在哪里找到并执行它的?为了搞清除这个问题,我们必须先弄明白行业中所说的存储器的分类。
存储器的分类
存储器是指保存数组的硬件单元 。广义的分类可简单的分为易失性存储器和非易失性存储器两类 :
易失性存储器 是指掉电后数据就丢失了的存储器,最常见的就是ram ;
非易失性存储器 是指掉电后数组不会丢失的存储器,最常见的就是rom;
ram的分类
1.sram (static ram)用晶体管存储0、1。速度快,成本高 ,存储密度低。
2.dram (dynamic ram)动态存储,用电容充放电存储0,1。功耗大,需要外接刷新电路,读写速度低于sram 。成本低,存储密度大。
3.sdram (synchronous dram)增加了同步电路,提高dram的数据读写速度 。
4.ddr ram (全称ddr sdram即double data rate sdram),为sdram的下一代。目前已发展到ddr5。
5.iram (internal ram)注意iram并非是真正意义上的某种ram,通常iram就是sram ,它通常存在于Soc内部,所以被称为iram。
rom的分类
1.rom 非易失性存储器,最早的rom在出场时写入数据,之后无法更改 。
2.prom (programmable rom)可编程rom。出场后能够让用户写入一次数据 ,例如cdrom
3.eprom (erasable prom)可擦写prom ,出场后可以擦除数据再次写入,但需要特殊的设备。如紫外光 等。
4.eeprom (electically eprom)电可擦写可编程rom,无需专用设备就可以擦写 ,编程。
5.flash 闪存,新一代非易失性存储器。分为:
nor flash :可以被寻址,价格贵;nand flash
启动流程
无论哪种程序都不能存放在ram中,sdram不行,iram也不行。程序必须提前保存在rom中 ,对于Mini2440来说,就只能是nor-flash或者是nand-flash 中了。
2440配置:
64MB sdram;
256MB nand-flash;
2MB nor-flash;
s3c2440内部还有4KB iram;
因此对于2440来说,启动过程要分两种情况 ,用nor-flash启动或者用nand-flash启动。在实际项目中,可能二者都有,或者只有其中一种,取决于成本、性能的考量。而启动选择开关本质上是对2440芯片的两个引脚的电平进行的配置。对应引脚OM[1:0]。
图中所示左右两个部分代表当用OM[1:0]选择了不同的启动方式时,从2440角度看到的地址分布,关键是看左右两张图的最下面,即地址0x00000000出在选择不同方式启动时的差别:
- 如果选择的是nor-flash启动 (左图),那么此时nor-flash的首字节地址就是0x00000000,也就是说第一条指令从nor-flash取;
- 如果选择的是nand-flash启动 (右图),那么此时内部iram的首字节地址就是0x00000000 ,也就是说第一条指令要从内部iram取。如果是这种情况的话,2440在运行iram中的程序之前,它会自动把nand-flash中的前4KB数据拷贝到iram去 ,这段程序是2440固化好的,称之为**"垫脚石"。
总结一下,那就是如果我们把 u-boot写入到nor-flash中**,并设置开发板以nor-flash启动,那么自然系统一上电就运行我们写入在nor-flash中的u-boot了 。
如果程序在nand-flash中,并设置开发板以nand-flash启动,2440就会把nand-flash中最前面的4KB程序拷贝到iram中执行。而这4KB程序一把都是做搬移工作的,因为u-boot可能会大于4KB。
u-boot的移植
由于u-boot在设计时考虑到要在各种不同平台上以及不同平台搭建的不同板子上运行 ,因此在获得了u-boot源码之后只能按照实际使用的平台和硬件设置做出正确的配置,才能够编译出一个符合我们自己的u-boot程序。
u-boot的下载
下载过程比较简单,按照并启动j-flash ,打开已经创建好的工程文件s3c2440.jflash 。之后分别连接设备、下载编程即可。注意一定要把启动选择开关拨到nor-flash。
所需要的资源已经上传至资源中。
首先进行连接:
连接成功:
按下F7:
此时就已经下载成功了: