基于Linux 系统的内核编译及实时RTAI 架构①
2012-07-09张静,宋珂,章桐
张 静, 宋 珂, 章 桐
(同济大学中德学院,上海201804)
0 引言
所谓实时系统(real-time system)是指其在计算和动作方面具有性能期限、对于外界的刺激都能由计算机给出及时响应的系统[1].全球许多科技公司和研究机构都对Linux的实时性进行了研究和改进.在众多改进方案中,实时应用接口(Real-TimeApplication Interface,RTAI)和实时 Linux(Real-time-Linux,RT-Linux)以其出色的性能,成为了目前主流Linux实时性改进方案.RTAI与RT-Linux相比,其结构更加灵活,代码修改量更小,研发周期更短[2].
RTAI项目是由意大利米兰理工学院航天工程系发起开发的遵循GPL的开源项目,RTAI在ARM平台上的移植,是从 3.2版本开始的,是基于Adeos实现的,它的硬件抽象层HAL使用Adeos提供的服务.也就是说,RTAI实现了Adeos中的一个域,通过Adeos实现RTAI域的初始化、中断的申请、中断服务程序的注册等[3].
RTAI在Adoes系统中的域优先级高于Linux域(也就是根域),每当中断到来之后,Adeos先调度RTAI对该中断进行处理、执行中断相关的实时任务,只有当RTAI没有实时任务和中断需要处理的时候,Adeos才会调度Linux运行,这就保证了RTAI的中断响应速度和实时任务不受Linux的影响,从而提供了实时系统的可确定性[4].
1 Linux操作系统的编译与实现
1.1 Linux系统的安装、内核及RTAI选型
我采用的是 Ubuntu 8.04.4 的 Wubi安装,8.04.4是Ubuntu系统的稳定版本,这样成功性较高.首先查看一下默认的内核版本,在终端内输入指令zj@zj-desktop:~$uname–r显示默认的内核版本是 2.6.24.26 - generic.那么接下来就要选择一款RTAI的版本,我选择了RTAI-3.7,进入RTAI-3.7 的/rtai-3.7/base/arch/i386/patches,可以查看此版本RTAI支持的内核版本.如图1所示.
图1 支持的内核版本
由此我们选择了 Linux -2.6.20.21.登录已安装完成的Ubuntu系统,在终端输入
进入/usr/src目录,解压文件此时会在/usr/src目录下出现两个文件夹linux-2.6.20.21 和 rtai-3.7
1.2 内核配置
接下来给内核打上相应的RTAI补丁,首先确保安装patch工具
配置Linux内核,内核两种编译模式:编译成内核与编译成模块.可以把相应部分编译到内核中,也可以把该部分编译成模块,动态调用.如果编译到内核中,在内核启动时就可以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,这部分功能同时启动;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在(这是Windows的做法).
如果编译成模块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,缺点是你得自己来调用这些模块.建议经常使用的部分直接编译到内核中,比如输入设备、网卡等.
在ubuntu下推荐使用图形化的配置菜单,可以先执行命令make mrproper,它将清除目录下所有配置文件和先前生成核心时产生的中间文件[5].
如图2←no
(2).Enable loadable module support→(允许可装载的模块支持)→ Module versioning support(模块支持的版本)=no不同的内核在使用同一模块时区别于塔原有的模块,此处不选.
Enable loadable module support→Module unloading(模块卸载)这个选项可以卸载不再使用的模块,如果不选将不能卸载任何模块.
(3).Processor type and features→(处理器的类型和特性)→Symmetric multi-processing support(对称多处理器支持)=no如果有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced Power Management"选项必须关闭
图2 内核配置界面
Processor type and features→Interrupt pipeline=yes
Processor type and features→Subarchitecture Type(子构架类型)=PC-compatible标准的PC或兼容机.
Processor type and features→Processor family(处理器系列)=core 2/newer xeon根据实际CPU选择,我的电脑是酷睿双核.
Processor type and features→Generic x86 support(通用x86支持)=no CPU能在上述”Processor family”中找到就可不选
Processor type and features→Multi-core scheduler support(针对多核CPU进行调度策略优化)=yes
Processor type and features→Preemption Model(内核抢占模式)→Preemptible Kernel(Low-Latency Desktop)(适合运行实时程序的主动内核抢占)→yes
(4).Power management options(ACPI,APM)→Power Management support(电源管理选项)=no电源管理有APM和ACPI两种标准且不能同时使用,即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态.
Power management options(ACPI,APM)→CPU Frequency scaling(CPU变频控制)→CPUF requency scaling Power management options=no CPU变频控制允许在运行中改变CPU主频,达到省电和降温的目的,但是这个驱动不会自动改变CPU的时钟速度,选择no.
注意主菜单最后有两项:
Load an Alternate Configuration File
Save an Alternate Configuration File
先选第一项的意思是,你也可以使用当前系统正在使用的配置文件来配置将要编译的内核,然后选第二项保存,最后退出配置界面.操作方法如下:
假如当前系统正在使用的内核版本号为Linux-<current version>,其正在使用中的内核配置为/usr/src/linux-headers-<current version>-generic/.config将其拷到/usr/src/linux- <new version>目录下.
然后选择Load An Alternate Configuration File读取配置文件,然后再此基础上进行修改最后保存退出.
图3 生成的镜像文件和头文件
1.3 编译及安装内核
当编译结束后,会在/usr/src目录下生成两个文件,分别是镜像文件和头文件,如下图-3所示,然后需要安装这两个文件.进入目录,安装镜像文件和头文件
安装后将得到了三个非常重要的文件,分别是System.map,config 和 vmlinuz,这三个文件应该已经被拷贝到/boot/路径下.重启系统,进入新配置的内核环境
root@zj-desktop:/usr/src#reboot
2 编译RTAI
如图-4编译RTAI
图4 RTAI配置界面
图5 RTAI运行结果
root@zj- desktop:/usr/src/rtai-3.7#make
安装RTAI
root@zj- desktop:/usr/src/rtai-3.7#make install测试Linux-RTAI
运行结果如图5所示
3 结论
(1)RTAI实现了Adeos内的一个域,这个域的优先级高于Linux内核所在的根域,可以保证所有的RTAI中断和实时任务都不会受Linux本身的影响,从而确保快速的中断响应和实时任务的按时完成.
(2)一个基于Linux和RTAI的实时操作系统.经过理论分析和实验结果证明:相关改进是正确、有效的,扩展后的RTAI能够依照所设定的调度算法对实时任务进行正确调度,RTAI的实时性能也得到了提升.
(3)实践证明 Ubuntu8.04.4 比较稳定,而 9.10版本在reboot之后,会提示“you need load the kern first”,结果添加启动项之后仍然不成功,这是因为本身9.10内核的Wubi安装的一个Bug.
[1] 阮鸿芳,钟家骐.Linux与硬实时扩展系统——RTAI的分析与研究[J].嵌入式操作系统应用,2007,23.
[2] 刘鑫,陆文娟,范海涛.基于RTAI嵌入式Linux硬实时性能研究与实现[J].嵌入式操作系统应用,2006.
[3] 范海涛,王树民.基于RTAI的uClinux硬实时性能的实现[J].电力自动化设备,2006,26(3).
[4] 甘玲,刘柄宏.基于ADEOS的RTAI/Linux的研究及其实时性测试[J].微计算机信息,2009,27(2).
[5] 张巍,李俊,潘金贵.基于RTAI的实时Linux系统构筑及其嵌入式程序移植[J].计算机科学,2007,34(11).