摘 要:分析了开放源码的Java虚拟机Kaffe的结构、运行机制,并针对DVB(Digital Video Broadcast)数字机顶盒软件架构中对基于Java虚拟机的MHP(Multimedia Home Platform)中间件研发的需求,研究了将Kaffe移植到Sti5516处理器和其专用OS20操作系统的关键技术,给出了相应的移植方案。对深入了解MHP在数字机顶盒中的应用给出了研究方向和基本思路。
关键词:嵌入式系统;Java虚拟机;DVB;中间件
1 引言
随着现代信息技术的迅猛发展,电视数字化步伐加快了。从一开始的模拟电视到现在的数字电视,不仅大大提高了电视节目的质量,也推动了电视数字化的进一步发展。在各种数字视频广播标准中,欧洲的DVB(Digital Video Broadcast)标准使用比较广泛,它为在同一信道中传输视频、音频、数据提供了一种灵活、高效的方式,可以通过卫星、电缆和地面信道传输高质量的电视节目。同时基于DVB的数据广播标准也能满足人们对于宽带数据业务的要求,如证券信息服务、电子节目、MP3音乐下载、电子邮件、网页浏览等,在现代信息技术领域应用极为广泛。
图一 数字机顶盒架构
从图一我们可以看到, 一个完整的数字机顶盒由硬件平台和软件系统组成,可以将其分为4层,从底向上分别为硬件、底层软件、中间件、应用软件。硬件提供机顶盒的硬件平台;底层软件提供操作系统内核以及各种硬件驱动程序;应用软件包括本机存储的应用和可下载的应用;中间件是一种将应用程序与底层的操作系统、硬件细节隔离开来,使应用不依赖于具体的硬件平台的软件环境。这样用户可以在任何厂家的硬件平台上进行应用软件开发,和应用软件下载。而不必介意任何底层的有关信息,保证了机顶盒的开发专业化。这种分层的思想在现代系统设计中十分常见,如大名鼎鼎的TCP/IP协议。中间件通常由各种虚拟机来构成,如HTML虚拟机、JavaScript虚拟机、Java虚拟机[1]等。
现在广电行业倾向于DVB-MHP(多媒体家庭平台)中间件标准。DVB-MHP基于开放性的Java程序语言,具有软硬件兼容性好、可移植成本低、二次再开发功能强等优点,是一种很有发展前途的中间件技术标准。可以相信,Java在数字视频广播中的应用将越来越多,我们有必要研究Java技术核心—虚拟机,包括其结构、运行机制及虚拟机移植到数字机顶盒平台的关键技术。本文面向采用ST(意法半导体公司)Sti5516芯片的数字机顶盒平台,将基于数字电视播放(Digital Video Broadcast,DVB)的多媒体家庭平台(Multimedia Home Platform,MHP)规范[2]进行中间件平台分析,重点研究开放源码的Java虚拟机---Kaffe在其中的作用和相关的移植技术。
2 平台介绍
2.1 硬件平台
数字机顶盒硬件平台基于ST公司的芯片Sti5516[3],Sti5516芯片集成了CPU内核ST20-C2、音/视频MPEG-2解码器、PAL/NTSC/SECAM编码器等。开发板上有8MB的共享内存和16MB的外部内存,4MB的Flash,并采用实时处理的嵌入式操作系统OS20。
2.2 软件平台
一个典型的适用于嵌入式的Java运行环境包括以下组件:
1.一个Java虚拟机。用来将独立于平台的Java字节码解释成目标机本地机器码,并执行动态类加载。这可以采取解释执行或实时编译执行(JIT)的形式。两者的不同点就在于字节码的执行速度;因为JIT避免了重复解释以前执行过的程序块。
2.一个标准Java类库集,以字节码的形式存在。如果应用程序并不引用任何类库,那这些类库就并不一定要求存在。
3.任何类库或虚拟机所需的本地方法(JNI)。这些函数是由其它高级语言所写,并和Java虚拟机一起预编译,链接。这些函数被用来执行处理器相关或Java无法直接实现的功能。
4.一个多任务操作系统,用来提供Java线程及线程同步机制的底层实现。
5.一个垃圾回收线程。垃圾回收周期运行或当动态内存池不能满足分配请求时运行,用来申明那些已经被分配但不再被应用程序所使用的内存。
图二 Kaffe架构
如图二虚线所示,Kaffe是一个完整的Java实现,它由3部分组成:遵从 Personal Java1.1规范的 Java类库[4],Java1.1虚拟机和本地动态或静态链接库。Kaffe虚拟机源码按以下子目录组织:
kaffe---包括了解释器与JIT平台无关部分,以及垃圾回收,动态类加载和Java runtime environment其它模块的源代码。
config---包括了解释器与JIT平台相关部分。它按所支持的处理器来划分子目录,里面存放系统相关代码。
package---Java类库以及任何它所依赖的本地方法。
include---在子目录中提供的本地方法的接口定义。这些接口被平台独立文件所需要。
3 Kaffe移植的关键技术及方案
经过对Kaffe深入分析和研究,笔者已在Sti5516平台上成功地移植了Kaffe[5],并依据DVB-MHP规范,结合机顶盒特定软硬件环境要求,建立了能运行Kaffe虚拟机的Java应用程序运行平台。下面将移植工作及相应步骤总结如下:
3.1字节码解释器
由于Kaffe源码中没有映射Java字节码到处理器相关的汇编代码块,而是使用C实现了每个字节码。这样就导致字节码解释器的源代码没有一行是处理器相关的。这意味着移植最简虚拟机(无JIT)将非常简单:只需要使用交叉编译器来编译kaffe/kaffevm子目录下的文件即可。
3.2内部线程
Kaffe有它自己的内部线程包。换句话说,它维护自己的线程数据结构,并在适当的时候执行线程调度及上下文切换。为了使内部线程包能运行在ST20处理器架构上, 需要在config/os20子目录中创建一个threads.h文件。这个文件定义了两个常量和四个宏。这些常量和宏被内部线程包里处理器无关的部分代码所使用。
Ø USE_INTERNAL_THREADS定义为ENABLE。
Ø THREADSTACKSIZE是一个常量,定义为每个线程堆栈的大小,单位bytes。
Ø THREADINIT(ctx * pContex, void (*func)())执行新线程的上下文初始化。该线程的入口点被func指针所提供。
Ø THREADSWITCH(ctx * pNewContext, ctx * pOldContext)执行实际的上下文切换。
Ø THREADINFO(ctx * pContext)在Kaffe初始化期间重置整个任务控制块。
Ø THREADFRAMES(thread * taskId, int count)返回活动的堆栈桢个数。
3.3支持软件
和其它大多数用C写的程序一样,Kaffe依赖于标准C库里的例程。由于ST采用符合GNU规范的GCC编译器,如strcmp(),atoi(),sin()等标准C库函数被支持。除此之外OS20提供以下支持:
Ø 动态内存分配malloc()。尽管Java程序员不会直接调用malloc(),但Kaffe虚拟机需要从底层调用内存分配例程来请求大的内存池。
Ø 信号。Kaffe依赖于与POSIX兼容的信号实现机制来执行相应的软件中断。而这可以用来唤醒休眠线程和异常句柄。
Ø 非阻塞I/O接口。和select()相似。
3.4动态类加载器
为了在OS20操作系统中使用,须修改源代码中平台无关的部分---动态类加载器。它是Java运行时环境的一部分,被用来负责加载被调用的方法(methods)。在桌面环境中,与方法相关的字节码被放在类文件中,动态类加载器使用给定的方法名在类路径下的子目录和文件里搜索。但由于OS20操作系统没有文件系统,所以类加载器必须被修改成在内存(RAM或ROM)中搜索类文件。为此我们完全重写动态类加载器。
我们采用了静态查找表装载机制,建立了一个查找表。这个查找表的结构定义如下:
typedef struct
{
int index;
int size;
char name;
}classIndexTable;
这个查找表用来映射类名或方法名到它们在内存中的起始地址。这样就可以用查找表来替代类加载器。即将类型和路径组合为一个唯一的标识, 比如“java string”,组合起来就是“java_string”,然后再利用这个组合的结果检索查找表。
利用组合的结果与查找表中每一项的name字段进行字符串比较,直到完全匹配为止。如果没有任何匹配则说明系统不支持这个类型。匹配上name 后,类装载器将获得index和size的值。index是一张存放所有.class文件起始地址表的索引,根据这个索引就可以找到具体的.class文件的二进制映像的起始地址,而size则是该.class文件的大小。这样根据.class文件存储位置的地址和大小就可以成功地完成类的装载。
3.5虚拟机启动
由于OS20操作系统是被GCC编译到主程序中,我们需要将kaffe虚拟机的初始化函数做为主应用程序中的某个任务来运行。kaffe虚拟机的初始化与启动是通过在主程序中运行initializeKaffe()函数来完成的。
4 测试与结果
在主程序中,调用OS20操作系统中的系统调用task_create()来将Kaffe虚拟机初始化为系统的一个进程。并为它分配必要资源,包括进程优先级、系统需要的内存空间等。依照分配的优先级,参与系统的进程调度。最后,将整个修改好的源代码在新的编译环境下编译连接成可执行代码,通过JTAG口下载到机顶盒开发板中运行。
Kaffe虚拟机的“输入”是“hello.java”,经过编译后生成类文件“hello.class”。运行下载到Flash的主程序,在调试终端可以看到“hello world”字样,这是Kaffe虚拟机解释字节码的结果。说明基于Sti5516芯片的Kaffe虚拟机移植成功。
5 结束语
以上介绍了Java虚拟机Kaffe的软件架构,从中我们可以看出,Kaffe虚拟机具有较好的可扩展结构模型,是遵循Java规范的优良的开放源码虚拟机,可以适应多种嵌入式应用环境。本文按照欧洲DVB-MHP规范,给出了Kaffe虚拟机在Sti5516机顶盒环境下的移植方案,使其可以应用于要求较高的嵌入式系统中,为机顶盒在证券信息服务、电子节目、MP3音乐下载、电子邮件、网页浏览等新型服务领域的开发应用奠定坚实的基础。我们相信,随着基于Java技术的DVB-MHP中间件技术的广泛使用,将使嵌入式系统的应用开发更加简捷方便。
参考文献
[1] 李旻枫. Jeode让Java在嵌入式系统中运转如飞[J].微计算机信息, 2002,18(4):45-46.
[2] Digital Video broadcasting (DVB): Multimedia home Platform(MHP) Specification 1.1[S]. tm2485, tam668r12.
[3] Sti5516 Data sheet, STMicroelectronics. [DB/OL]. www.st.com.
[4] Sun Document. The JavaTM Virtual Machine Specification. 1999.
[5] 严东华,张凯,Java虚拟机及其移植. 北京理工大学学报,2002;2:64-67.
本文作者创新点:本文作者给出了Kaffe虚拟机在Sti5516机顶盒环境下的移植方案,使其可以作用于被广泛使用在数字机顶盒系统中的ST芯片上,为机顶盒在证券信息服务、电子节目、MP3音乐下载、电子邮件、网页浏览等新型服务领域的开发应用奠定坚实的基础。这一移植方案为在意法半导体Sti5516芯片上移植Java中间件提供了一种思路,也对在其它嵌入式系统上移植Java虚拟机有一定的参考价值。