嵌入式linux内核:Linux 2.6 内核的嵌入式系统应用


刘 伟, 童 敏
(华中科技大学 信息与系统技术研究所,湖北 武汉 430074) 
 
  摘 要:在分析Linux2.6内核新特性基础上,在S3C2410开发板上移植了2.6内核和新文件系统,并成功地对H.264编解码多媒体系统提供了支持 
  关键词:Linux 内核 嵌入式系统 S3C2410 

  随着多媒体技术与通讯技术相结合信息技术快速发展和互联网广泛应用,PC 时代也过渡到了后PC时代在数字信息技术和网络技术高速发展后PC时代,嵌入式技术越来越与人们生活紧密结合 
  操作系统为用户使用计算机及其外部设备提供最基本接口,管理计算机上资源随着应用领域扩大,为了适应不同应用场合,考虑到系统灵活性、可伸缩性以及可裁剪性,种以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗要求严格专用计算机系统——嵌入式操作系统随之延生 
  Linux 操作系统是种性能优良、源码公开且被广泛应用免费操作系统,由于其体积小、可裁减、运行速度高、良好网络性能等优点,可以作为嵌入式操作系统随着2.6内核发布,Linux向现有主流RTOS提供商在嵌入式系统市场提出了巨大挑战,例如VxWorks和WinCE,具有许多新特性,将成为更优秀嵌入式操作系统 
  Linux低成本和开放性,为其在嵌入式系统领域应用营造了肥沃土壤本文着重介绍Linux 2.6内核新特性及其嵌入式应用中优势,并将其移植到嵌入式平台中,成功支持H.264编解码多媒体系统 
1 Linux 2.6内核针对嵌入式开发显著特点 
  实时可靠性是嵌入式应用较为普遍要求,尽管Linux 2.6 并不是个真正实时操作系统,但其改进特性能够满足响应需求Linux 2.6 已经在内核主体中加入了提高中断性能和调度响应时间改进,其中有三个最显著改进:采用可抢占内核、更加有效调度算法以及同步性提高[4]在企业服务器以及嵌入式系统应用领域,Linux 2.6 都是个巨大进步在嵌入式领域,Linux 2.6 除了提高其实时性能,系统移植更加方便,同时添加了新体系结构和处理器类型——包括对没有硬件控制内存管理方案 MMU-less系统支持,可以支持大容量内存模型、微控制器,同时还改善了I/O子系统,增添更多多媒体应用功能[4] 
1.1 可抢占内核 
  在先前内核版本中(包括2.4内核)不允许抢占以核心态运行任务(包括通过系统进入内核模式用户任务),只能等待它们自己主动释放CPU这样必然导致些重要任务延时以等待系统结束 
  个内核任务可以被抢占,为是让重要用户应用可以继续运行这样做最主要优势是极大地增强系统用户交互性 
  2.6内核并不是真正RTOS(Real Time Operation ),其在内核代码中插入了抢占点,允许调度中止当前进程而更高优先级进程,通过对抢占点测试避免不合理系统延时2.6内核在定程度上是可抢占,比2.4内核具备更好响应性但也不是所有内核代码段都可以被抢占,可以锁定内核代码关键部分,确保CPU数据结构和状态始终受到保护而不被抢占 
  软件需要满足最终时间限制与虚拟内存请求页面调度之间是相互矛盾慢速处理将会破坏系统实时响应性,而2.6内核可以编译无虚拟内存系统避免这个问题,这是解决问题关键,但要求软件设计者有足够内存来保证任务执行 
1.2 有效调度 
  2.6版本 Linux内核使用了由 Ingo Molnar开发调度器算法,称为O(1)算法,如图1所示它在高负载情况下执行得极其出色,并且当有很多处理器并行时也可以很好地扩展[2]过去调度需要查找整个ready task队列,并且计算它们重要性以决定下task,需要时间随task数量而改变O(1)算法则不再每次扫描所有任务,当task就绪时被放入个活动队列中,调度每次从中调度适合task,因而每次调度都是个固定时间任务运行时分配个时间片,当时间片结束,该任务将放弃处理器并根据其优先级转到过期队列中活动队列中任务全部调度结束后,两个队列指针互换,过期队列成为当前队列,调度继续以简单算法调度当前队列中任务这在多处理器情况更能提高SMP效率,平衡处理器负载,避免进程在处理器间跳跃  
 [ 相关贴图 ]

1.3 同步原型与共享内存 
  多进程应用需要共享内存和外设资源,为避免竞争采用了互斥方法保证资源在同时刻只被个任务访问Linux内核用个系统来决定个线程阻塞或是继续执行来实现互斥,在线程继续执行时,这个费时系统就没有必要了Linux2.6所支持Fast User-Space Mutexes 可以从用户空间检测是不是需要阻塞线程,只在需要时执行系统终止线程它同样采用调度优先级来确定将要执行进程[4] 多处理器嵌入式系统各处理器之间需要共享内存,对称多处理技术对内存访问采用同等优先级,在很大程度上限制了系统可量测性和处理效率Linux2.6则提供了新管理方法——NUMA(Non Unorm Memory Access)NUMA根据处理器和内存拓扑布局,在发生内存竞争时,给予不同处理器不同级别权限以解决内存抢占瓶颈,提高吞吐量 
1.4 POSIX线程及NPTL 
  新线程模型基于个1:1线程模型(个内核线程对应个用户线程),包括内核对新 NPTL(Native POSIX Threading Library)支持,这是对以前内核线程方法明显改进2.6内核同时还提供POSIX signals和POSIX high-resolution timersPOSIX signals不会丢失,并且可以携带线程间或处理器间通信信息嵌入式系统要求系统按时间表执行任务,POSIX timer可以提供1kHz触发器使这切变得简单,从而可以有效地控制进度 
1.5 微控制器支持 
  Linux2.6内核加入了多种微控制器支持无MMU处理器以前只能利用些改进分支版本,如uClinux,而2.6内核已经将其整合进了新内核中,开始支持多种流行无MMU微控制器,如Dragonball、ColdFire、Hitachi H8/300Linux在无MMU控制器上仍旧支持多任务处理,但没有内存保护功能同时也加入了许多流行控制器支持,如S3C2410等 
1.6 面向应用 
  嵌入式应用有用户定制特点,硬件设计都针对特定应用开发,这给系统带来对非标准化设计支持问题(如IRQ管理)为了更好地实现,可以采用部件化操作系统Linux2.6采用子系统架构将功能模块化,可以定制而对其他部分影响最小同时Linux2.6提供了多种新技术支持以实现各种应用开发,如Advanced Linux Sound Architecture(ALSA)和Video4Linux等,对多媒体信息处理更加方便;对USB2.0支持,提供更高速传输,增加蓝牙无线接口、音频数据链接和面向链接数据传输L2CAP,满足短距离无线连接需要;而且在2.6内核中还可以配置成无输入和显示纯粹无用户接口系统 
2 应用研究 
  在S3C2410开发板上移植嵌入式Linux 2.6.11.7内核系统,应用于构建H.264多媒体系统 
2.1 建立交叉编译环境 
  在RedHat9主机上进行内核移植开发,首先需要建立交叉编译环境由于2.6内核中采用了些新特性和指令,需要采用较新工具集,采用binutils-2.15、gcc-3.4.2、glibc-2.2.5、linux-2.6.8、glibc-linuxthreads-2.2.5来建立交叉编译工具链,建立之后将工具链路径加入系统路径$PATH中 
2.2 内核修改 
  Linux 2.6.11.7内核加入了对S3C2410芯片支持,不再需要任何补丁文件修改内核源码中Makefile交叉编译选项ARCH=arm,CROSS_COMPILE=arm-linux-针对硬件配置,需要在arch/arm/mach-s3c2410/devs.c或者smdk2410.c中添加FLASH分区信息s3c_nand_info,如表1 
表1 NAND FLASH分区表
分区名 起始地址 大 小  
Vivi 0x00000000 0x00020000 
Param 0x00020000 0x00010000 
Kernel 0x00030000 0x001c0000 
Root 0x00200000 0x00200000 
Usr 0x00400000 0x03c00000 

  然后在s3c_device_nand中增加.dev={.platform_data= &s3c_nand_info},在arch/arm/mach-s3c2410/mach-smdk2410.c中__initdata部分增加&s3c_device_nand,使内核在启动时化NAND FLASH信息 
2.3 内核编译加载 
  对内核进行适当配置是个量体裁衣过程由于2.6内核会根据本地系统配置进行设置,可以导入内核源码默认s3c2410配置文件,方便加载内核基本配置,然后再选择所需选项对MTD配置选择支持MTD设备驱动以及NAND FLASH驱动;选择支持要用到各类文件系统(DEVFS、TMPFS、CRAMFS、YAFFS、EXT2、NFS)以及网络设备和协议,本系统加载了网络芯片CS8900以及USB支持;在H.264多媒体系统中还需要加载Frame buffer以支持LCD显示功能使用交叉编译工具编译内核源码后, 会在arch/arm/boot/下生成名为zImage内核映像,在Boot loader命令提示模式下使用下载命令完成内核加载到开发板存储设备FLASH中编译过程(相对以前版本编译过程,2.6内核编译有所简化): 
  make mrproper 
  make menuconfig(界面,或者用make xconfig图形界面,但需要Qt库支持,而make gconfig则需要GTK库支持) 
  make 
  make bzImage 
2.4 文件系统 
  Linux采用文件系统组织系统中文件和设备,为设备和用户提供统接口Linux 支持多种文件系统,本系统使用CRAMFS格式只读根文件系统,而将FLASH中USER区使用支持可读写YA FFS文件系统格式,方便添加自己应用 
  在根文件系统中,为保护系统基本设置不被更改,采用CRAMFS格式采用DEVFS来实现基本设备建立挂载,同时使用BusyBox也是个缩小根文件系统办法,提供了系统基本指令;还需要建立些必备目录,添加所需配置文件,如fstab、inittab等;还有个重要工作就是添加系统应用必备动态使用生成工具mkcramfs 将整个根文件目录里内容制作成映像文件 
  mkcramfs rootfs rootfs.ramfs 
  YAFFS文件系统格式支持需要将驱动加入到内核代码树下fs/yaffs/,修改内核配置文件,就可以在内核编译中加载对该文件系统支持使用mkyaffs工具将NAND FLASH分区格式化为YAFFS分区,将mkyaffsimage生成应用镜像烧写进YAFFS分区,在启动时通过写入fstab自动加载YAFFS分区即可 
2.5 网络设备驱动 
  系统中采用CS8900A10M网络芯片,它使用S3C2410nGCS3和IRQ_EINT9,相应修改linux/arch/arm/mach-s3c2410/irq.c,并在mach-smdk2410.csmdk2410_iodesc中增加{SMDK2410_ETH_IO,S3C2410_CS2, SZ_1M, MT_DEVICE},内核源码中加入芯片驱动drivers/net/arm/cs8900.h和cs8900.c,并且配置网络设备驱动Makefile和Kconfig文件,加入CS8900A配置选项,这样可以在内核编译时加载网络设备驱动 
  在Linux2.6应用同时,也要看到其与以前版本内核比较存在些问题在内核编译时间、内核镜像大小、内核占用RAM空间大小、系统启动时间相对Linux2.4而言都存在不同程度不足,但在硬件条件日益进步现今可以接受,而且部分也是由于功能加强必然带来虽然Linux并非个真正实时操作系统,但2.6内核改进能够满足大部分应用需求,所以Linux2.6内核将会在嵌入式系统领域大展身手 
参考文献 
1 Alessandro Rubini,Jonathan Corbet著,魏永明,骆刚,姜 君译.Linux设备驱动[M].
  北京:中国电力出版社,2004 
2 Anand K Santhanam. 走向Linux2.6[EB/OL]. Dec. 2003.
  http://www-128.ibm.com/deve loperworks/cn/linux/ l-inside/index.html 
3 S3C2410X 32-Bit RISC Microprocessor User´s Manual[Z]. SAMSUNG Electronics. Revision 1.2 
4 Brandon White. Linux 2.6: A Breakthrough for Embedded 
  s[EB/OL].http://linuxdevices.com/articles/AT7751365763.html Sep.9,2003 
5 Karim Yaghmour. Building Embedded Linux s[M]. O’Reilly. April, 2003 
Tags:  linux2.6内核详解 linux2.6内核编译 linux2.6内核 嵌入式linux内核

延伸阅读

最新评论

发表评论