当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]嵌入式uCLinux内核启动过程分析

引言

  uCLinux是专门为无MMU处理器设计的嵌入式操作系统,已支持ARM、Motorola等微处理器。目前采用ARM+uCLinux作为嵌入式系统的一种开发模式非常普遍。

  一个基于uCLinux的完整的嵌入式系统由三个部分组成,即系统引导程序Bootloader、uCLinux操作系统内核和文件系统。嵌入式系统的启动引导技术是嵌入式系统开发的一个难点,系统启动引导的成功与否决定了应用程序的运行环境是否能正确建立,系统启动成功是应用正确运行的前提。而uCLinux内核的启动过程也是其中重要一环,分析uCLinux的启动过程,可以加快系统启动速度、正确建立应用环境。本文要研究的就是uCLinux操作系统内核的启动过程。
 

  1 系统简介

  本系统采用SamSung公司的Arm7TDMI内核的S3C4510B处理器,主要利用其强大的网络功能,与PC机进行网络通信。该系统的主要功能是利用串口监测一种智能电表,将获得的数据通过Internet传给PC机,由PC机再做进一步的处理,将最终结果呈现给用户。

  硬件平台包括一个以ARM为内核的处理器、存储器使用2MB的Flash和16MB的SDRAM,外部接口除了通信的串口,还外接了一个以太网接口,以支持S3C4510B的网络功能。软件平台由以下部分组成:系统引导程序Bootloader、嵌入式操作系统内核、文件系统。

  根据内核是否压缩以及内核是否在本地执行,uCLinux通常有两种启动方式:flash本地执行方式和压缩内核加载方式。本系统采用第二种启动方案,即内核的压缩映象固化到flash上,系统启动时在内存中解压,然后在内存中执行,这种启动方式相比第一种方式运行速度更快。

  2 uCLinux内核启动过程的实现

  可将ARM+uCLinux系统的启动过程总结为以下几个阶段:(1)PC指向复位地址入口处,即0x0H处的Bootloader代码。Bootloader完成一些基本的初始化,将系统的软硬件环境带到一个合适的状态;(2)Bootloader将控制权交给操作系统内核的引导程序后,开始uCLinux内核的加载;(3)uCLinux内核加载引导完成,启动init进程,完成系统的引导过程。

  本系统的启动方案采用uCLinux自带的引导程序加载内核。在内核启动过程中主要调用这几个文件:head.S(在linux-2.4.xarcharmnommubootcompressed目录下)、main.c(在linux-2.4.xinitinit目录下)、simpleinit.c(在userinit目录下)[1]。实际应用中应根据硬件平台和系统功能,修改相关文件,以正确地引导系统。

  当Bootloader将控制权交给内核的引导程序时,第一个执行的程序就是head.S,它完成了加载内核的大部分工作;misc.c则提供加载内核所需要的子程序,其中解压内核的子程序是head.S调用的重要程序,另外内核的加载还须知道系统的硬件信息,该硬件信息在hardware.h中定义并被head.S所引用。本系统中内核的启动流程如图1所示。

   [!--empirenews.page--]

 

  本系统中,head.S首先配置S3C4510B的系统寄存器SYSCFG、初始化系统的Flash、SDRAM以及总线控制寄存器,将Flash和SDRAM的地址范围分别设置为0x0-0x1fffff和0x1000000-0x1ffffff;根据本系统的功能特点,重新定义了中断优先级以及I/O口的配置;为了提高内核的运行速度,将2M的内核映像文件从Flash拷贝到SDRAM;通过操作一些系统寄存器,进行系统的存储器重映射,将Flash和SDRAM的地址区间分别重映射为0x1000000-0x11fffff和0x0-0xffffff;然后初始化系统堆栈;接着调用misc.c中的函数decompress_kernel,对拷贝到SDRAM的内核映像文件进行解压缩;最后跳转到执行调用内核函数call_kernel,调用call_kernel函数实际上是执行main.c中的start_kernel函数,该函数完成的功能包括处理器结构的初始化、中断的初始化、定时器的初始化、进程相关的初始化以及内存初始化等初始化工作;最后内核创建一个init线程,在该线程中调用init进程,完成系统的启动。

  值得再次注意的是,在内核启动过程中,调用了在文件hardware.h中定义的与硬件有关的信息。基于Linux的嵌入式系统的启动是严重依赖于硬件平台的,在内核启动引导前,必须根据硬件平台和系统功能,修改必要的文件[2]。本系统中就修改了hardware.h中的flash、SDRAM的控制寄存器ROMCON0、DRAMCON0和SYSCFG等。

  uCLinux启动时,运行一个叫做init的程序,它是由操作系统启动的用户级进程,由它来启动后面的任务,包括多用户环境、网络等。init进程的行为是在函数simpleinit.c中定义的,所以可根据系统的功能定制init进程的行为,如在本系统中加入了串口控制程序,还可以利用printk函数打印出必要的调试信息。当init进程启动时,它读取一个运行控制文件rc和一个配置文件inittab。在嵌入式应用中,一般需要在操作系统运行起来后立刻运行用户的特定程序,为此可考虑修改这两个文件。本系统中就是恰当地修改了inittab文件和rc文件,以使系统启动后即运行一些特定进程。在程序inittab.c中修改inittab文件,然后通过向init进程发送SIGHUP信号,即kill(1,SIGHUP),使init进程重新读取配置文件inittab[3]。

  inittab.c文件中的部分代码如下:

  FILE *pFile;

  if((pFile=fopen("/etc/inittab","w"))!=NULL){

  fprintf(pFile,"pollmeter:unknown:/bin/pollmeterrn");

  fprintf(pFile,"netcomm:unknown:/bin/netcommrn");

  ……

  }

  ......

  kill(1,SIGHUP); //init进程的ID等于1

  ……

  在启动过程中还有一个重要的链接脚本文件,在该文件中指明了内核的入口地址。

  总之,uCLinux的启动过程也较复杂,其中要调用许多文件,要能正确的启动uCLinux操作系统,就必须根据硬件平台和系统功能,修改相关的源代码文件。

  3 结束语

  本文分析了内核的启动引导过程,并根据应用系统的特点修改了启动代码以及必要的相关文件,完成了uCLinux内核的正确引导。实际应用表明,本系统的启动设计正确可靠。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭