刘 伟, 童 敏
(华中科技大学 信息与系统技术研究所,湖北 武汉 430074)
摘 要:在分析Linux2.6内核新特性
![](/icons/23030de.gif)
基础上,在S3C2410开发板上移植了2.6内核和新
![](/icons/23030de.gif)
文件系统,并成功地对H.264编解码多媒体系统提供了支持
关键词:Linux 内核 嵌入式系统 S3C2410
随着多媒体技术与通讯技术相结合
![](/icons/23030de.gif)
信息技术
![](/icons/23030de.gif)
快速发展和互联网
![](/icons/23030de.gif)
广泛应用,PC 时代也过渡到了后PC时代
![](/icons/23030dou2.gif)
在数字信息技术和网络技术高速发展
![](/icons/23030de.gif)
后PC时代,嵌入式技术越来越与人们
![](/icons/23030de.gif)
生活紧密结合
操作系统为用户使用计算机及其外部设备提供最基本
![](/icons/23030de.gif)
接口
![](/icons/23030chengxu.gif)
,管理计算机上
![](/icons/23030de.gif)
资源
![](/icons/23030dou2.gif)
随着应用领域
![](/icons/23030de.gif)
扩大,为了适应不同
![](/icons/23030de.gif)
应用场合,考虑到系统
![](/icons/23030de.gif)
灵活性、可伸缩性以及可裁剪性,
![](/icons/23030yi.gif)
种以应用为中心、以计算机技术为基础、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗要求严格
![](/icons/23030de.gif)
专用计算机系统——嵌入式操作系统随之延生
Linux 操作系统是
![](/icons/23030yi.gif)
种性能优良、源码公开且被广泛应用
![](/icons/23030de.gif)
免费操作系统,由于其体积小、可裁减、运行速度高、良好
![](/icons/23030de.gif)
网络性能等优点,可以作为嵌入式操作系统
![](/icons/23030dou2.gif)
随着2.6内核
![](/icons/23030de.gif)
发布,Linux向现有主流
![](/icons/23030de.gif)
RTOS提供商在嵌入式系统市场提出了巨大挑战,例如VxWorks和WinCE,具有许多新特性,将成为更优秀
![](/icons/23030de.gif)
嵌入式操作系统
Linux
![](/icons/23030de.gif)
低成本和开放性,为其在嵌入式系统领域
![](/icons/23030de.gif)
应用营造了肥沃
![](/icons/23030de.gif)
土壤
![](/icons/23030dou2.gif)
本文着重介绍Linux 2.6内核
![](/icons/23030de.gif)
新特性及其嵌入式应用中
![](/icons/23030de.gif)
优势,并将其移植到嵌入式平台中,成功支持H.264编解码多媒体系统
1 Linux 2.6内核针对嵌入式开发显著特点
实时可靠性是嵌入式应用较为普遍
![](/icons/23030de.gif)
要求,尽管Linux 2.6 并不是
![](/icons/23030yi.gif)
个真正
![](/icons/23030de.gif)
实时操作系统,但其改进
![](/icons/23030de.gif)
特性能够满足响应需求
![](/icons/23030dou2.gif)
Linux 2.6 已经在内核主体中加入了提高中断性能和调度响应时间
![](/icons/23030de.gif)
改进,其中有三个最显著
![](/icons/23030de.gif)
改进:采用可抢占内核、更加有效
![](/icons/23030de.gif)
调度算法以及同步性
![](/icons/23030de.gif)
提高[4]
![](/icons/23030dou2.gif)
在企业服务器以及嵌入式系统应用领域,Linux 2.6 都是
![](/icons/23030yi.gif)
个巨大
![](/icons/23030de.gif)
进步
![](/icons/23030dou2.gif)
在嵌入式领域,Linux 2.6 除了提高其实时性能,系统
![](/icons/23030de.gif)
移植更加方便,同时添加了新
![](/icons/23030de.gif)
体系结构和处理器类型——包括对没有硬件控制内存管理方案
![](/icons/23030de.gif)
MMU-less系统
![](/icons/23030de.gif)
支持,可以支持大容量内存模型、微控制器,同时还改善了I/O子系统,增添更多
![](/icons/23030de.gif)
多媒体应用功能[4]
1.1 可抢占内核
在先前
![](/icons/23030de.gif)
内核版本中(包括2.4内核)不允许抢占以核心态运行
![](/icons/23030de.gif)
任务(包括通过系统
![](/icons/23030diaoyong.gif)
进入内核模式
![](/icons/23030de.gif)
用户任务),只能等待它们自己主动释放CPU
![](/icons/23030dou2.gif)
这样必然导致
![](/icons/23030yi.gif)
些重要任务延时以等待系统
![](/icons/23030diaoyong.gif)
结束
![](/icons/23030yi.gif)
个内核任务可以被抢占,为
![](/icons/23030de.gif)
是让重要
![](/icons/23030de.gif)
用户应用
![](/icons/23030chengxu.gif)
可以继续运行
![](/icons/23030dou2.gif)
这样做最主要
![](/icons/23030de.gif)
优势是极大地增强系统
![](/icons/23030de.gif)
用户交互性
2.6内核并不是真正
![](/icons/23030de.gif)
RTOS(Real Time Operation
![](/icons/23030System.gif)
),其在内核代码中插入了抢占点,允许调度
![](/icons/23030chengxu.gif)
中止当前进程而
![](/icons/23030diaoyong.gif)
更高优先级
![](/icons/23030de.gif)
进程,通过对抢占点
![](/icons/23030de.gif)
测试避免不合理
![](/icons/23030de.gif)
系统
![](/icons/23030diaoyong.gif)
延时
![](/icons/23030dou2.gif)
2.6内核在
![](/icons/23030yi.gif)
定程度上是可抢占
![](/icons/23030de.gif)
,比2.4内核具备更好
![](/icons/23030de.gif)
响应性
![](/icons/23030dou2.gif)
但也不是所有
![](/icons/23030de.gif)
内核代码段都可以被抢占,可以锁定内核代码
![](/icons/23030de.gif)
关键部分,确保CPU
![](/icons/23030de.gif)
数据结构和状态始终受到保护而不被抢占
软件需要满足最终时间限制与虚拟内存请求页面调度之间是相互矛盾
![](/icons/23030de.gif)
![](/icons/23030dou2.gif)
慢速
![](/icons/23030de.gif)
页
![](/icons/23030cuowu.gif)
处理将会破坏系统
![](/icons/23030de.gif)
实时响应性,而2.6内核可以编译无虚拟内存系统避免这个问题,这是解决问题
![](/icons/23030de.gif)
关键,但要求软件设计者有足够
![](/icons/23030de.gif)
内存来保证任务
![](/icons/23030de.gif)
执行
1.2 有效
![](/icons/23030de.gif)
调度
2.6版本
![](/icons/23030de.gif)
Linux内核使用了由 Ingo Molnar开发
![](/icons/23030de.gif)
新
![](/icons/23030de.gif)
调度器算法,称为O(1)算法,如图1所示
![](/icons/23030dou2.gif)
它在高负载情况下执行得极其出色,并且当有很多处理器并行时也可以很好地扩展[2]
![](/icons/23030dou2.gif)
过去
![](/icons/23030de.gif)
调度
![](/icons/23030chengxu.gif)
需要查找整个ready task队列,并且计算它们
![](/icons/23030de.gif)
重要性以决定下
![](/icons/23030yi.gif)
步
![](/icons/23030diaoyong.gif)
![](/icons/23030de.gif)
task,需要
![](/icons/23030de.gif)
时间随task数量而改变
![](/icons/23030dou2.gif)
O(1)算法则不再每次扫描所有
![](/icons/23030de.gif)
任务,当task就绪时被放入
![](/icons/23030yi.gif)
个活动队列中,调度
![](/icons/23030chengxu.gif)
每次从中调度适合
![](/icons/23030de.gif)
task,因而每次调度都是
![](/icons/23030yi.gif)
个固定
![](/icons/23030de.gif)
时间
![](/icons/23030dou2.gif)
任务运行时分配
![](/icons/23030yi.gif)
个时间片,当时间片结束,该任务将放弃处理器并根据其优先级转到过期队列中
![](/icons/23030dou2.gif)
活动队列中任务全部调度结束后,两个队列指针互换,过期队列成为当前队列,调度
![](/icons/23030chengxu.gif)
继续以简单
![](/icons/23030de.gif)
算法调度当前队列中
![](/icons/23030de.gif)
任务
![](/icons/23030dou2.gif)
这在多处理器
![](/icons/23030de.gif)
情况更能提高SMP
![](/icons/23030de.gif)
效率,平衡处理器
![](/icons/23030de.gif)
负载,避免进程在处理器间
![](/icons/23030de.gif)
跳跃
[ 相关贴图 ]
1.3 同步原型与共享内存
多进程应用
![](/icons/23030chengxu.gif)
需要共享内存和外设资源,为避免竞争采用了互斥
![](/icons/23030de.gif)
方法保证资源在同
![](/icons/23030yi.gif)
时刻只被
![](/icons/23030yi.gif)
个任务访问
![](/icons/23030dou2.gif)
Linux内核用
![](/icons/23030yi.gif)
个系统
![](/icons/23030diaoyong.gif)
来决定
![](/icons/23030yi.gif)
个线程阻塞或是继续执行来实现互斥,在线程继续执行时,这个费时
![](/icons/23030de.gif)
系统
![](/icons/23030diaoyong.gif)
就没有必要了
![](/icons/23030dou2.gif)
Linux2.6所支持
![](/icons/23030de.gif)
Fast User-Space Mutexes 可以从用户空间检测是不是需要阻塞线程,只在需要时执行系统
![](/icons/23030diaoyong.gif)
终止线程
![](/icons/23030dou2.gif)
它同样采用调度优先级来确定将要执行
![](/icons/23030de.gif)
进程[4]
![](/icons/23030dou2.gif)
多处理器嵌入式系统各处理器之间需要共享内存,对称多处理技术对内存访问采用同等优先级,在很大程度上限制了系统
![](/icons/23030de.gif)
可量测性和处理效率
![](/icons/23030dou2.gif)
Linux2.6则提供了新
![](/icons/23030de.gif)
管理方法——NUMA(Non Un
![](/icons/23030if.gif)
orm Memory Access)
![](/icons/23030dou2.gif)
NUMA根据处理器和内存
![](/icons/23030de.gif)
拓扑布局,在发生内存竞争时,给予不同处理器不同级别权限以解决内存抢占瓶颈,提高吞吐量
1.4 POSIX线程及NPTL
新
![](/icons/23030de.gif)
线程模型基于
![](/icons/23030yi.gif)
个1:1
![](/icons/23030de.gif)
线程模型(
![](/icons/23030yi.gif)
个内核线程对应
![](/icons/23030yi.gif)
个用户线程),包括内核对新
![](/icons/23030de.gif)
NPTL(Native POSIX Threading Library)
![](/icons/23030de.gif)
支持,这是对以前内核线程方法
![](/icons/23030de.gif)
明显改进
![](/icons/23030dou2.gif)
2.6内核同时还提供POSIX signals和POSIX high-resolution timers
![](/icons/23030dou2.gif)
POSIX signals不会丢失,并且可以携带线程间或处理器间
![](/icons/23030de.gif)
通信信息
![](/icons/23030dou2.gif)
嵌入式系统要求系统按时间表执行任务,POSIX timer可以提供1kHz
![](/icons/23030de.gif)
触发器使这
![](/icons/23030yi.gif)
切变得简单,从而可以有效地控制进度
1.5 微控制器
![](/icons/23030de.gif)
支持
Linux2.6内核加入了多种微控制器
![](/icons/23030de.gif)
支持
![](/icons/23030dou2.gif)
无MMU
![](/icons/23030de.gif)
处理器以前只能利用
![](/icons/23030yi.gif)
些改进
![](/icons/23030de.gif)
分支版本,如uClinux,而2.6内核已经将其整合进了新
![](/icons/23030de.gif)
内核中,开始支持多种流行
![](/icons/23030de.gif)
无MMU微控制器,如Dragonball、ColdFire、Hitachi H8/300
![](/icons/23030dou2.gif)
Linux在无MMU控制器上仍旧支持多任务处理,但没有内存保护功能
![](/icons/23030dou2.gif)
同时也加入了许多流行
![](/icons/23030de.gif)
控制器
![](/icons/23030de.gif)
支持,如S3C2410等
1.6 面向应用
嵌入式应用有用户定制
![](/icons/23030de.gif)
特点,硬件设计都针对特定应用开发,这给系统带来对非标准化设计支持
![](/icons/23030de.gif)
问题(如IRQ
![](/icons/23030de.gif)
管理)
![](/icons/23030dou2.gif)
为了更好地实现,可以采用部件化
![](/icons/23030de.gif)
操作系统
![](/icons/23030dou2.gif)
Linux2.6采用
![](/icons/23030de.gif)
子系统架构将功能模块化,可以定制而对其他部分影响最小
![](/icons/23030dou2.gif)
同时Linux2.6提供了多种新技术
![](/icons/23030de.gif)
支持以实现各种应用开发,如Advanced Linux Sound Architecture(ALSA)和Video4Linux等,对多媒体信息处理更加方便;对USB2.0
![](/icons/23030de.gif)
支持,提供更高速
![](/icons/23030de.gif)
传输,增加蓝牙无线接口、音频数据链接和面向链接
![](/icons/23030de.gif)
数据传输L2CAP,满足短距离
![](/icons/23030de.gif)
无线连接
![](/icons/23030de.gif)
需要;而且在2.6内核中还可以配置成无输入和显示
![](/icons/23030de.gif)
纯粹无用户接口系统
2 应用研究
在S3C2410开发板上移植嵌入式Linux 2.6.11.7内核系统,应用于构建H.264多媒体系统
2.1 建立交叉编译环境
在RedHat9
![](/icons/23030de.gif)
主机上进行内核移植开发,首先需要建立交叉编译环境
![](/icons/23030dou2.gif)
由于2.6内核中采用了
![](/icons/23030yi.gif)
些新
![](/icons/23030de.gif)
特性和指令,需要采用较新
![](/icons/23030de.gif)
工具集,采用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芯片
![](/icons/23030de.gif)
支持,不再需要任何补丁文件
![](/icons/23030dou2.gif)
修改内核源码中Makefile
![](/icons/23030de.gif)
交叉编译选项ARCH=arm,CROSS_COMPILE=arm-linux-
![](/icons/23030dou2.gif)
针对硬件配置,需要在arch/arm/mach-s3c2410/devs.c或者smdk2410.c中添加FLASH
![](/icons/23030de.gif)
分区信息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中
![](/icons/23030de.gif)
__initdata部分增加&s3c_device_nand,使内核在启动时
![](/icons/23030chushi.gif)
化NAND FLASH信息
2.3 内核编译加载
对内核进行适当
![](/icons/23030de.gif)
配置是
![](/icons/23030yi.gif)
个量体裁衣
![](/icons/23030de.gif)
过程
![](/icons/23030dou2.gif)
由于2.6内核会根据本地系统配置进行
![](/icons/23030chushi.gif)
设置,可以导入内核源码默认s3c2410
![](/icons/23030de.gif)
配置文件,方便加载内核基本配置,然后再选择所需选项
![](/icons/23030dou2.gif)
对MTD配置选择支持MTD设备驱动以及NAND FLASH驱动;选择支持要用到
![](/icons/23030de.gif)
各类文件系统(DEVFS、TMPFS、CRAMFS、YAFFS、EXT2、NFS)以及网络设备和协议,本系统加载了网络芯片CS8900以及USB支持;在H.264多媒体系统中还需要加载Frame buffer以支持LCD显示功能
![](/icons/23030dou2.gif)
使用交叉编译工具编译内核源码后, 会在arch/arm/boot/下生成名为zImage
![](/icons/23030de.gif)
内核映像,在Boot loader
![](/icons/23030de.gif)
命令提示模式下使用下载命令完成内核加载到开发板
![](/icons/23030de.gif)
存储设备FLASH中
![](/icons/23030dou2.gif)
编译过程(相对以前版本
![](/icons/23030de.gif)
编译过程,2.6内核编译有所简化):
make mrproper
make menuconfig(
![](/icons/23030zifu.gif)
界面,或者用make xconfig图形界面,但需要Qt库
![](/icons/23030de.gif)
支持,而make gconfig则需要GTK库
![](/icons/23030de.gif)
支持)
make
make bzImage
2.4 文件系统
Linux采用文件系统组织系统中
![](/icons/23030de.gif)
文件和设备,为设备和用户
![](/icons/23030chengxu.gif)
提供统
![](/icons/23030yi.gif)
接口
![](/icons/23030dou2.gif)
Linux 支持多种文件系统,本系统使用CRAMFS格式
![](/icons/23030de.gif)
只读根文件系统,而将FLASH中
![](/icons/23030de.gif)
USER区使用支持可读写
![](/icons/23030de.gif)
YA FFS文件系统格式,方便添加自己
![](/icons/23030de.gif)
应用
![](/icons/23030chengxu.gif)
在根文件系统中,为保护系统
![](/icons/23030de.gif)
基本设置不被更改,采用CRAMFS格式
![](/icons/23030dou2.gif)
采用DEVFS来实现基本设备
![](/icons/23030de.gif)
建立挂载,同时使用BusyBox也是
![](/icons/23030yi.gif)
个缩小根文件系统
![](/icons/23030de.gif)
办法,提供了系统
![](/icons/23030de.gif)
基本指令;还需要建立
![](/icons/23030yi.gif)
些必备
![](/icons/23030de.gif)
目录,添加所需配置文件,如fstab、inittab等;还有
![](/icons/23030yi.gif)
个重要
![](/icons/23030de.gif)
工作就是添加系统应用必备
![](/icons/23030de.gif)
动态
![](/icons/23030hanshu.gif)
库
![](/icons/23030dou2.gif)
使用生成工具mkcramfs 将整个根文件目录里
![](/icons/23030de.gif)
内容制作成映像文件
mkcramfs rootfs rootfs.ramfs
YAFFS文件系统格式
![](/icons/23030de.gif)
支持需要将驱动加入到内核代码树下fs/yaffs/,修改内核配置文件,就可以在内核编译中加载对该文件系统
![](/icons/23030de.gif)
支持
![](/icons/23030dou2.gif)
使用mkyaffs工具将NAND FLASH分区格式化为YAFFS分区,将mkyaffsimage生成
![](/icons/23030de.gif)
应用
![](/icons/23030chengxu.gif)
镜像烧写进YAFFS分区,在启动时通过写入fstab自动加载YAFFS分区即可
2.5 网络设备驱动
系统中采用CS8900A
![](/icons/23030de.gif)
10M网络芯片,它使用S3C2410
![](/icons/23030de.gif)
nGCS3和IRQ_EINT9,相应修改linux/arch/arm/mach-s3c2410/irq.c,并在mach-smdk2410.c
![](/icons/23030de.gif)
smdk2410_iodesc
![](/icons/23030zhk2.gif)
中增加{SMDK2410_ETH_IO,S3C2410_CS2, SZ_1M, MT_DEVICE},内核源码中加入芯片
![](/icons/23030de.gif)
驱动
![](/icons/23030chengxu.gif)
drivers/net/arm/cs8900.h和cs8900.c,并且配置网络设备驱动
![](/icons/23030de.gif)
Makefile和Kconfig文件,加入CS8900A
![](/icons/23030de.gif)
配置选项,这样可以在内核编译时加载网络设备
![](/icons/23030de.gif)
驱动
在Linux2.6应用
![](/icons/23030de.gif)
同时,也要看到其与以前版本内核比较存在
![](/icons/23030de.gif)
![](/icons/23030yi.gif)
些问题
![](/icons/23030dou2.gif)
在内核
![](/icons/23030de.gif)
编译时间、内核镜像大小、内核占用RAM空间大小、系统启动时间相对Linux2.4而言都存在不同程度
![](/icons/23030de.gif)
不足,但在硬件条件日益进步
![](/icons/23030de.gif)
现今可以接受,而且
![](/icons/23030yi.gif)
部分也是由于功能加强必然带来
![](/icons/23030de.gif)
![](/icons/23030dou2.gif)
虽然Linux并非
![](/icons/23030yi.gif)
个真正
![](/icons/23030de.gif)
实时操作系统,但2.6内核
![](/icons/23030de.gif)
改进能够满足大部分
![](/icons/23030de.gif)
应用需求,所以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
![](/icons/23030System.gif)
s[EB/OL].
http://linuxdevices.com/articles/AT7751365763.html Sep.9,2003
5 Karim Yaghmour. Building Embedded Linux
![](/icons/23030System.gif)
s[M]. O’Reilly. April, 2003
延伸阅读
最新评论