基于Linux的嵌入式GUI研究与应用
1.引言
嵌入式GUI指在嵌入式系统中为特定的硬件设备或者环境而设计的图形用户界面系统。它极大地方便了非专业用户的使用,人们不再需要死记硬背大量的命令,而可以通过窗口、菜单方便地操作。在实际应用中,嵌入式GUI应满足轻型、占用资源少、高性能、高可靠性、可配置等基本要求。
Linux作为一种可裁减的操作系统,兼容多种主流CPU且支持所有的文件系统和网络服务,并具备源代码公开、易于定制、稳定、功能强大和易开发等优点,是发展未来嵌入式设备的绝佳资源。
2.Linux在嵌入式系统上的实现
2.1系统引导
系统上电或者复位后,将对系统硬件设备进行自检,无错误则将硬盘0磁道的第一个扇区,即MBR中的BootLoader调至内存0x07C00处,并将控制权交给BootLoader[1]。BootLoader通常是一段汇编代码,存放在MBR中,作用是将系统启动代码读到内存中。目前可选用的引导工具主要有GRUB和LILO,这里我们选用主流的GRUB,由于选用的存储介质是CF卡,格式化CF卡后建立GRUB安装目录,按照提示安装GRUB后,在 /etc目录下新建grub.conf文件,内容如下:
default=0
timeout=5
titleLinux-2.4.34
root(hd0,0)
kernel/boot/vmlinuz-2.4.34roroot=/dev/hdc1
其中root(hd0,0)指定了/boot所在的分区,kernel一行用来指定Linux的内核,及/所在的分区。
2.2内核配置、编译及裁减
内核是Linux操作系统的核心,它负责管理系统进程和进程调度等大小事务,决定着系统的性能和稳定性,其它应用程序都必须通过它才可以使用系统资源,获取系统服务。由于嵌入式硬件资源的限制,我们需要对Linux内核进行定制,精简出符合实际需要的最小内核文件。
首先在www.kernel.org上获取相应的内核包,解压后进行配置,然后根据目标板的硬件特点和实际需求配置内核的编译选项。这里我们选用基于X86 架构的PC104主板,为了减低不必要的复杂性,内核中取消kernelmodule支持,将有关CPU类型、内存管理、doc驱动、ext2文件系统支持、串口支持等常用功能编译进内核,SCSI、Floppy之类的外设在我们的嵌入式系统中没有使用,编译时可去掉。这样实际编译出的内核只有 747.6KB。基本步骤如下[2]:
#cd/usr/src/linux//内核包所在目录,这里下载的内核包版本是2.4.34
#makemrproper//确保源代码目录下没有不正确的.o文件以及文件的相互倚赖关系
#makemenuconfig//图形界面下编译选项配置
#makedep//确保关键文件在正确位置
#makeclean//确保所有有关文件都处于最新版本状态
#makebzImage//编译内核
#cp/usr/src/linux/arch/i386/bzImage/mnt/cf/boot//将内核文件拷贝至boot
2.3根文件系统实现
Linux 的根文件系统以树的结构方式组织,主要由配置文件、设备文件、Linux基本命令、基本C语言库组成。后两者是主要的,也是占空间最大的,用 Busybox和uClibc的组合够建这两部分内容,可以大大节省空间。根据根文件系统的基本结构,我们建立各个对应的目录:
#mkdirprocdevbinbootboot/grubetcsrclib//由于是单用户系统,删除了root、home、sbin目录
#cp–r/dev/null/dev/mem…/mnt/cf/dev//拷贝所需设备文件
最后需要在etc目录下建立几个配置文件,分别是/etc/inittab、/etc/init.d/rcS、/etc/fstab,限于篇幅,仅介绍inittab文件,内容如下[4]:
::sysinit:/etc/init.s/rcS//指定初始化文件
::askfirst:/bin/sh//启动时执行的shell
::respawn:/bin/getty38400ttyS0//打开一个串口,波特率为38400
::restart:/bin/init//重启时执行进程init
::ctrlaltdel:/bin/reboot//捕捉特定按键动作
::shutdown:/bin/umount–a–r//关机时动作,卸载所有文件系统
3.嵌入式GUI研究
3.1基于嵌入式Linux的GUI系统底层实现基础
一个能够兼容多硬件平台的嵌入式GUI系统,应至少抽象出两类设备:基于图形显示设备(如VGA卡)的图形抽象层 GAL(GraphicAbstractLayer)和基于输入设备(如键盘,触摸屏等)的输入抽象层 IAL(InputAbstractLayer)[3]。抽象层的概念类似Linux内核虚拟文件系统的概念,它定义了一组不依赖于任何特殊硬件的抽象接口,所有顶层的图形操作和输入处理都建立在抽象接口上,而用于实现该抽象接口的底层代码称为“图形引擎”或“输入引擎”,类似操作系统中的驱动程序,这实际是一种面向对象的程序结构。利用该抽象接口,嵌入式GUI可以非常方便的移植到其他POSIX系统上,只需要根据抽象层接口实现新的引擎即可。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论