您好,  [请登录] [QQ登录]  [支付宝登录[免费注册]

商品分类

分享到: 百度搜藏 搜狐微博 新浪微博 腾讯微博 QQ收藏 人人网 Facebook Twitter

基于ARM-μCLinux嵌入式体系启动引导的实现

发布日期:2011-04-16

   择要:先容了ARM-μCLinux嵌入式体系的布局构成,重点阐发了ARM--μCLinux嵌入式体系启动引导的进程实现该体系启动引导的技能难点,提出了一种有效的启动引导方案。

   关键词:嵌入式体系 引导 ARM μCLinux

32位ARM嵌入式处理惩罚处罚用具有高性能、低轼耗的特性,已被广泛应用于斲丧电子产品、无线通讯和网络通讯等范畴。ΜCLinux是专门为无MMU处理惩罚处罚器筹划的嵌入式利用体系,支持ARM、Motorola等微处理惩罚处罚器。如今国表里采取ARM-μCLinux作为嵌入式体系非常遍及。而嵌入式体系的启动引导技能是嵌入式体系开辟的一个难点。体系启动引导的告成与拦截定了应用步调的运行环境是否能正确构建,即体系启动告成是应用正确运行的条件。

常用的嵌入式体系启动要领是先通过JTAG将嵌入式利用体系内核与进Flash,再由其带的引导步调bootloader完成嵌放式体系的启动引导变乱。这种要领要借助昂贵的JTAG配置完成利用体系内核 的烧写变乱,并且不克不及方便地更新嵌入式体系中的软件平台。本文提出一种基于ARM-μCLinux嵌入式体系的启动引导方案,不但可以通过浅近的串口方便地更新嵌入式体系内的软件平台,并且告成办理了这种架构的嵌入式体系的启动、初始化、利用体系内核的固化和引导等标题。本文大抵阐发ARM-μCLinux嵌入式体系的硬件平台和软件平台;形貌体系引导步调bootloader的筹划,叙述筹划时思量的因素和需办理的技能难点,给出一套可行的引导步调流程;针对μCLinux内核的引导步调,阐发μCLinux内核的加载和初始化进程。

1 体系构成

典范的ARM嵌入式体系硬件平台一样通常包括一个以ARM为内核的处理惩罚处罚器、存储器和须要的外部接口与配置。在本体系中,采取内嵌ARM7TDMI的Samsung公司的S3C4510处理惩罚处罚器,存储器利用2MB的Flash和16MB的SDRAM,外部接口除了用于下载和通讯的串口,还配备了一个以太网接口,以支持S3C4510的网络结果。

软件平台由以下部分构成:体系引导步调、嵌入式利用体系内核、文件体系。体系引导步调通常也称为bootloader,代码量虽少,但是作用非常大,相称于PC上的BIOS,认真将利用体系内核固化到Flash中和体系初始化变乱,然后将体系控制权交给利用体系。嵌入式利用体系内核是嵌入式体系加电运行后的办理平台,认真及时性任务和多任务的办理。ARM7TDMI是一款没有MMU的处理惩罚处罚器,因此采取μCLinux作为本体系的利用体系内核。ΜCLinux是Linux是一个分支,专为无MMU的处理惩罚处罚器筹划,它承继了Linux强大的网络结果和多任务办理结果,并对内存办理和进程办理举行了改写,餍足无MMU处理惩罚处罚器的开辟恳求。文件体系是嵌入式体系软件平台占用存储量最大的一部分,也是与用户开辟最干系的一部分。它存储了体系配置文件、体系步调、用户应用步调和必须的驱动步调。

软件平台固化在Flash中。通常根据软件平台的内容 对Flash的地点空间举行分区,一样通常分三个区,分别丰放bootloader、μCLinux内核和文件体系。分区的要领一样通常有两种:一种是根据三个部分预定的存储空量,容许bootloader、内核和文件体系拥有本身牢固的分区和首地点;另一种便是根据这三部分的实际分派区间,一个部分紧随着另一个部分后存储,没有牢固的分区和首地点。通常采取第一种要领,固然大概会浪费一部分Flash空间,但是方便内核的加载和文件体系的挂载,同时也利于体系的调试和开辟。而要是充分利用Flash的存储区间,节流资源,那么可采取第二种要领。

2 体系引导步调的筹划

体系引导步调bootloader是嵌入式体系加电后实行的第一个步调,举行结果筹划时起紧张思量以下标题:

(1)将μCLinux内核和文件体系固化在Flash中

目地μCLinux内核和文件体系固化在Flash的本领很多。主机可以通过JTAG口,将内核和文件体系的映像文件烧写到指定的Flash位置上;也可以通过以太网接口,将映像文件下载到Flash中;别的还可以通过串口烧写到Flash。前两种要领的下载速率比后一种要领快得多。在本体系中,采取串口烧写Flash。这是由于一方面配置一个串口方便临时制,而JTAG烧写还要配置昂贵的JTAG仿真器和干系的驱动步调以及协议转换步调,网口下载还要有以太网支持;另一方面μCLinux默认通过串口打印其运行的信息,那么串口不但可以提供烧写Flash的结果,还可作为调试μCLinux内核的通道。

在本体系中,Flash在刚开始时,只存储了bootloader,还没有存储μCLinux内核和文件体系。因此bootloader在体系加电完成初始化变乱后,要初始化一条链接主机和目标机的串口通道,并提供串口下载结果。

体系启动引导流程图

(2)体系初始化

由于体系刚加电时,利用体系的内核还没有被加载,体系的初始化事来由bootloader完成。它紧张是将体系、初始化存储体系、配置ARM种种模式下的数据栈、使能屏常克制、根据须要切换处理惩罚处罚器模式和状态。

(3)μCLinux内核加载要领

固化在Flash中的μCLinux内核有两种运行要领:一种要领是直接在Flash中运行μCLinux自带的引导步调;另一种要领是将固化在Flash中的内核先拷贝到SDRAM的某一段地点区间,再从该段地点区间的首地点运行uCLinux内核。

第一种要领是bootloader举行体系初始化变乱后,跳到内核固化在Flash中的首地点处,将控制权交给μCLinux,开始在Flash中逐句实行内核自带的引导步调,由该引导步调完成内核的加载变乱。这种要领是如今很多嵌入式体系启动内核所采取的要领,也是本体系采取的内核加载要领。

第二种要领是bootloader完成体系初始化变乱后,把内核的映像文件由Flash拷贝到SDRAM中,再从SDRAM中实行μCLinux内核的引导步调,加载μCLinux内核。

第二种加载要领在SDRAM中运行步调,因此实行速率比第一种要领快一些,并且可以通过RAM快速引导技能实现这种加载要领。其紧张是针对NAND型Flash的环境。与NOR型Flash最大的差别点是:NOR型Flash利用内存随机读取技能,与SDRAM一样,可以直接实行存储在Flash中的步调;而NAND一样,可以直接内存随机读取技能,它是一次读取一整块内存,因此不克不及直接实行存储在NAND型Flash中的步调,必须把NAND型Flash中的步调先拷贝到SDRAM,再在SDRAM中实行该步调。但是NAND型Flash价格比NOR型Flash自制,以是很多嵌入式体系还是采取NOR型Flash(几百K字节)+NAND型Flash(几兆字节)的存储模式。此中NOR型Flash存放可实行的且代码量小的bootloader和一些须要的数据,而NAND型Flash生存存储量较大的内核和文件体系。

在本体系中,由于采取NOR型Flash存储bootloader、内核和文件体系,以是可以直接访问内核地点地点区间的首地点,实行内核本身的引导步调,并且内核自带的引导步调结果强大,可以方便地内核的加载,向内核转达有关的硬件参数。本体系采取第一种加载要领。

(4)自举模式和内核启动模式的切换

Bootloader一样通常要实现两种启动模式:自举模式和内核启动模式。自举模式也称为bootstrap模式,该模式的紧张作用是目标机通过串口与主机通讯,可以汲取主机发送过来的映像文件,比喻内核、文件体系和应用步调,并将其固化在Flash中,也可以将Flash中的映像文件上传到主机。内核启动模式容许嵌入式体系加电启动后加载μCLinux内核,将体系交由μCLinux利用体系办理。

在本体系中,采取一个开关实现两种模式的切抽象。在体系的Flash中只有bootloader时,起首将开关拔上去,提示体系进入自举模式,加电启动后,bootloader根据开关的状态,进入自举模式,汲取主机发送过来的内核和文件体系的映像文件。接着将开关拔下来,提示体系进入内核启动模式,再按链,bootloader根据此时的开关状态进入内核启动模式,加载内核和文件体系,由利用体系承继体系。以后也可以根据须要,设置开关的状态,以提示体系进入差别的启动模式。

(5)地点映射表的配置和重映射

地点映射表的配置包括设置Flash地点空间、SDRAM地点空间、外部I/O地点范畴和处理惩罚处罚器寄存器地点范畴。ARM处理惩罚处罚器加电后实行在地点0x0处的代码,因此在加电启动时,起首将存储了bootlader的Flash地点空间设置为0x0-0x200000,将SDRAM的地点空间设置为0x1000000-0x2000000,当内核引导步调将内核拷贝到SDRAM后,再设置SDRAM的地点空间为0x00x1000000,而Flash的地点空间为0x1800000-0x1A00000。这须要在内核引导步调中对Flash和SDRAM的地点空间举行重映射。

本文采取的体系启动引导方案流程图如图1。

3 μCLinux内核的加载和初始化

本启动方案中采取μCLinux自带的引导步调加载内核。该引导步调代码在linux/arch/armnommu/boot/compressed目次,此中Head.s的作用最关键,它完成了加载内核的大部分变乱;Misc.c则提供加载内核所须要的子步调,此中解压内核的子步调是Head.s调用的告急步调,别的内核的加载还必须知道体系须要的硬件信息,该硬件信息在hardware.h中并被Head.s所引用。

当bootloader将控制权交给内核的引导步调时,第一个实行的步调便是Head.s。下面基于本体系先容Head.s加载内核的紧张进程。Head.s起首配置S3C4510的体系寄存器;再初始化S3C4510的ROM、RAM以及总线等控制寄存器,将Flash和SDRAM的地点范畴分别设置为0x0-0x200000和0x1000000-0x2000000;接着将内核的映像文件从Flash拷贝到SDRAM,并将Flash和SDRAM的地点区间分别重映射为0x1800000-0x1A00000和0x0-0x1000000;然后调用Misc.c中的解压内核函数(decompress_kernel),对拷贝到SDRAM的内核映像文件举行解压缩;着末跳转到实行调用内核函数(call_kernel),将控制权交给解压后的μCLinux体系。

实行Call_kernel函数实际上是实行linux/init/main.c中的start_kernel函数,中包括处理惩罚处罚器布局的初始化、克制的初始化、进程干系的初始化以及内存初始化等告急变乱。

该启动引导方案实现了自举模式和内核启动模式以及两种模式的切换,使得开职员既可以采取自举模式方便地烧写Flash,更新嵌入式体系中的软件平台,又可以大概切换到内核启动模式,主动沉寂地启动体系;其次,本方案采取浅近的串口通道作业主机与目标体系的通讯渠道,既可以方便地将利用体系内核、文件体系和其他应用下载到目标体系中,又可以作为调试μCLinux内核和应用步调通道;别的针对ARM7TDMI的无MMU特性,采取修改后的μCLinux内核引导步调加载利用体系和初始化利用体系环境,办理内核加载的地点重映射标题和利用体系的内存办理标题。