定制嵌入式Linux系统的启动程序

发 布 时 间 : 2008-11-18 来 源 : 来自网络 作 者 : 匿名 浏 览 :

摘 要 嵌入式系统的特点决定了它具有功能的专用性,而不能作为一种通用的计算机系统。基于Linux操作系统开发嵌入式产品,必须对它的启动程序进行定制。本文研究了Linux操作系统的启动过程,并给出了如何为嵌入式Linux系统添加用户自己的启动服务,以及指定开机后运行的主功能程序的方法。
关键词 嵌入式 Linux 启动程序

一、嵌入式系统的概念及特点[1]
引用电气工程师协会IEE给嵌入式系统下的一个定义:嵌入式系统是用来控制或监视机器、装置或工厂等大规模系统的设备。但是后来随着嵌入式系统的发展,这个定义就变得不是很准确。比如说像手机、PDA及电子词典之类的小型设备,它们均由内部的嵌入式系统控制,但是却不可称之为大规模的系统。
有些文献这样下定义我觉得比较确切:嵌入式系统是电脑软件与硬件的综合体,它是以应用为中心,以计算机技术为基础,软硬件均可裁剪,能够适应实际应用中对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。
嵌入式系统具有以下几个特点:
1、 嵌入式系统是先进的计算机技术、半导体技术以及电子技术与各个行业的具体应用相结合的产物。也就是说嵌入式系统并不像通用计算机那样通用,而是与各待业的特定应用相关联的,每行每业的嵌入式系统要实现的功能也不一样。因此,在嵌入式系统上没有哪个公司的操作系统和处理器能够垄断市场。
2、 嵌入式系统实现的功能单一,通常是面向用户、面向产品、面向特定应用的,一般只实现某行业的特定功能。
3、 成本低、体积小、功耗低及可靠性高,在运行速度及存储容量上有一定的限制。
4、 嵌入式系统本身不具备在其上进一步开发的能力,必须要在相关的开发平台上开发。
5、 全自动操作循环,一直重复地执行一个特定的程序
嵌入式系统的灵魂应该说是它的嵌入式操作系统,本文使用的是嵌入式Linux,硬件基础是基于x86的嵌入式主板。由上述嵌入式系统的特点可知,为了让嵌入式系统具有一个产品或仪器的特性,不能让像通用计算机那样开机后进入桌面系统,而是要运行指定服务和一个特定的用户应用程序。本文将如何让Linux开机后执行指定服务和运行一特定的用户程序进行探讨。

二、Linux系统的启动过程
让我们先了解一下Linux系统启动的过程。当引导程序(如LILO)加载Linux内核映象启动时,它先进行内核的初始化工作,主要是检测整个硬件环境。内核初始化完成后,系统就启动init进程,它是系统的第一个用户级进程。Linux系统具有许多运行级别,它由文件/etc/inittab文件决定,各级别的功能如下:
0:终止或停止系统的运行
1:单用户模式
2:多用户模式,但无网络功能
3:多用户模式且有网络功能
4:保留,用户可以定义自己的启动模式
5:图形界面登陆模式
6:重新启动系统
init进程运行后,它会访问/etc/inittab文件,该文件确定系统运行于上面的哪个级别。由于嵌入式系统的特性,我们要让系统运行于级别1上,即单用户模式,这只要在/etc/inittab文件的id:3:initdefault行,将3改为0即可。同时每个级别还对应了一个启动各种服务的脚本目录,一般在/etc/rc.d/下面。
接着init进程又分别启动/etc/rc.d/rc.sysinit和与等级n相对应的/etc/rc.d/rcn.d目录里的初始化进程,最后init会运行用户登陆程序,这时在终端上就会显示login:的登录信息,用户登录成功后会启动shell程序,shell启动后,它会读取并执行文件/etc/profile,/etc/bashrc,和用户主目录下的文件.bashrc,这些文件负责建立用户自己的环境。

三、设置特定服务及开机启动程序
如前所述,添加指定服务,定制特定的启动程序,就从配置文件/etc/rc.d/rcn.d和/etc/profile入手。
1、添加指定的服务:是指在系统启动时进行一些用户所需要的操作,如初始化用户应用程序或用户开发的新硬件等等。可以增加自己的脚本程序来完成这些工作,主要步骤如下:
(1) 仿照系统目录/etc/rc.d/init.d里的任何一个脚本文件的格式自己编写一个启动服务脚本文件。
(2) 将写好的脚本文件拷贝到/etc/rc.d/init.d目录下。因为/etc/rc.d/rcn.d只是/etc/rc.d/init.d的一个链接,故要将真实的文件先拷到后者的目录下。
(3) 在相应的运行级别n的/etc/rc.d/rcn.d下建立该脚本文件的链接。如运行级别为2,则n=2,目录即为/etc/rc.d/rc2.d。假如该脚本名为initform,链接名定为my_initform,则键入如下命令即可:ln –s /etc/rc.d/init.d/initform /etc/rc.d/rc2.d/my_initform。
完成以上几步后,系统开机后就会自动执行脚本initform里的服务。
2、运行特定用户应用程序:这里主要是指GUI应用程序,如果原系统启动后直接进入桌面系统,则要将桌面程序在相应脚本中屏蔽,然后修改/etc/profile脚本定制用户自己的程序。步骤如下:
(1) 在startx脚本中将运行相应的桌面系统程序屏蔽。例如桌面系统程序名为qvwm(红旗嵌入式Linux的桌面系统),则修改内容如下:
……
# xinit /usr/bin/qvwm
#加个“#”表示将这行脚本屏蔽掉
(2) 修改/etc/profile,启动用户应用程序。如用户应用程序名为start_initform,且在目录/root/ 下,则在它的末尾加上如下几行内容:
……
export LC_ALL=zh_CN.GB2312
#设置中文化环境
cd /root/
#切换到应用程序当前目录
xinit ./start_initform
#运行指定的用户应用程序
修改完成后,重新启动系统,则当系统初始化完后,会执行用户指定的服务,且最后运行用户应用程序,达到嵌入式系统的要求。

参考文献
1 李善平,刘文峰,王焕龙. Linux与嵌入式系统. 清华大学出版社,2002
2 邹思轶. 嵌入式Linux设计与应用. 清华大学出版社,2002
3 王学龙. 嵌入式Linux系统设计与应用. 清华大学出版社,2001
4 于明俭,陈向明,方汉. Linux程序设计权威指南. 机械工业出版社,2001
5 联想软件超星空工作室. 精通Linux系统管理与应用开发技术. 清华大学出版社,2001
6 李主琛. Linux面向对象窗口高级编程. 科学出版社,2001
7 徐千洋. Linux 函数库参考手册. 中国青年出版社,2002



上一篇:嵌入式系统中LCD驱动的实现原理 下一篇:基于Linux的USB设备