肾结石挂什么科| 增强ct是什么| 腰果不能和什么一起吃| g是什么计量单位| 莲藕不能和什么一起吃| 海螺不能和什么一起吃| 明太鱼是什么鱼| 任性的女孩有什么特点| 悬饮是什么意思| 开户名是什么| 肚子咕咕叫吃什么药| 眼睛过敏用什么眼药水| 下肢浮肿是什么原因引起的| 戈美其鞋子是什么档次| 咽炎要注意什么饮食| 腐竹是什么做的| 刘邦和刘秀是什么关系| 口腔溃疡喝什么水| 脚底痛是什么原因| 羟苯乙酯是什么| 心电图p波代表什么| 化干戈为玉帛是什么意思| 便秘喝什么茶好| 吃什么可以解酒| 四面受敌是什么动物| 增生是什么原因造成的| 什么是成熟| basic是什么意思| 肾虚吃什么药最有效| 立夏节吃什么| 胃下垂有什么症状表现| 发物是什么| 儿童咳嗽吃什么消炎药| 什么是脂肪肝| 何首乌泡酒有什么作用| 警察和公安有什么区别| 桂花什么时候开花| 旗人是什么意思| 女性尿酸高有什么症状表现| 莹五行属性是什么| 35岁属相是什么生肖| 走投无路是什么意思| 一个山一个脊念什么| 尿常规白细胞3个加号什么意思| 梦见梅花鹿是什么预兆| 做水煮鱼用什么鱼最好| 药流后需要注意什么| dp什么意思| 什么生活| 什么动物冬眠| 做肠镜有什么危害| 保持器是什么| 卵子排出体外是什么样子| 水鱼是什么意思| 内心孤独的人缺少什么| 生育酚乙酸酯是什么| 大云是什么烟| 鼻梁高的男人说明什么| 刺猬爱吃什么| 牡丹鹦鹉吃什么| fda是什么| 背弃是什么意思| 地球是什么星| 茉莉花茶有什么作用| 6月25日是世界什么日| 左侧卵巢囊性包块是什么意思| 肉炒什么菜谱大全| 苏州立秋吃什么| 什么叫刑事拘留| 水晶是什么材质| 儿童肠胃感冒吃什么药效果好| 利妥昔单抗是什么药| 甲状腺是什么病| 1900年属什么生肖| 眼睛红红的是什么原因| 总放屁是什么病的前兆| 本科专科有什么区别| 乳腺增生不能吃什么食物| 收心是什么意思| hh是什么牌子| 带状疱疹不能吃什么食物| 火腿肠是什么做的| 00后是什么意思| 打瓜是什么瓜| 莲蓬可以用来做什么| 小肚子左边疼是什么原因| 类风湿因子高说明什么| 湿气用什么药最好最快| 脑回路什么意思| 什么是败血症| 小孩喜欢趴着睡觉是什么原因| 拉绿屎是什么原因| 胃胀消化不好吃什么药| 手抖挂什么科| 脚汗多是什么原因| 什么是直肠炎| 韬光养晦什么意思| 凭什么我买单| 高危性行为是什么意思| 委屈什么意思| 中国最高学位是什么| 腱子肉是什么意思| 为什么睡觉出虚汗| 青黄不接是什么意思| 牛b克拉斯什么意思| 长脸适合什么耳环| 射进去是什么感觉| 808是什么意思| 脑血栓是什么意思| 检查食管做什么检查| 红花泡水喝有什么功效和作用| singing是什么意思| 排骨炖什么汤止咳润肺| 哮喘咳嗽吃什么药好得快| 孕妇用什么驱蚊最安全| 结局he是什么意思| 龟头上抹什么药能延时| 艺高胆大是什么生肖| 脚气是什么菌引起的| 血清果糖胺测定是什么| 褪黑素不能和什么一起吃| 内膜厚是什么原因| 什么不什么| 梦见自己找工作是什么意思| 安排是什么意思| 潘氏试验阳性说明什么| 为什么会得胆囊炎| messi是什么意思| 3月17日是什么星座| 胃胀胃痛吃什么药| 梦见吃蜂蜜是什么预兆| 诺如病毒吃什么药最有效| 缘字五行属什么| 为什么体重一直下降| 子宫内膜增厚有什么影响| simon是什么意思| pubg什么意思| 头晕什么原因引起的| 屁多是什么病的前兆| 重情重义是什么意思| 夏至吃什么传统食物| 梦见吃酒席是什么预兆| junior什么意思| 多潘立酮片治什么病| 晕3d什么症状| 纪是什么意思| 5月7日是什么星座| 金银花什么时候采摘最好| 玉对人体有什么好处| 四月十四日是什么节日| 拔完智齿吃什么消炎药| 大便陶土色是什么颜色| 2段和3段奶粉有什么区别| 西布曲明的危害及副作用分别是什么| 脑动脉硬化吃什么药| 什么样的伤口需要打破伤风| 90年属什么| 女人吃猪肝有什么好处| 潮吹是什么样的| 姑妈是什么关系| wonderful什么意思| 6月底什么星座| 小孩拉肚子吃什么药好| 年柱金舆是什么意思| 64年属什么| examine什么意思| 男人交生育保险有什么用| 眼睛视物模糊是什么原因| 梳子断了有什么预兆| 怀孕前检查什么项目内容| 四氯化碳什么颜色| 体脂是什么| agc什么意思| qq邮箱的格式是什么| 用脚尖走路有什么好处| 什么是情趣| 来例假不能吃什么东西| 鲸鱼属于什么类动物| 腮腺炎是什么| 什么叫世家| 百雀羚属于什么档次| 筑基期后面是什么| 大人睡觉流口水是什么原因引起的| 人彘是什么意思| 心累是什么意思| 什么叫靶向药| 晨起嘴苦是什么原因| hpv感染有什么症状| 值神是什么意思| 去香港需要办理什么证件| 沙拉是什么| 什么样的小船| 溜号是什么意思| 为什么喝茶会睡不着| 女士喝什么茶叶对身体好| 老公的妈妈叫什么| 腮腺炎是什么症状| 健身后应该吃什么| 颌下淋巴结肿大吃什么药| 鸡汤用什么鸡| 变蛋吃多了有什么好处和坏处| 狗怀孕有什么症状| 孩子发烧吃什么饭菜好| 涌泉穴在什么地方| 腺样体肥大挂什么科| 创伤是什么意思| 脑梗的症状是什么| 饭前饭后吃药有什么区别| 上热下寒吃什么中成药| 草莓什么季节种植| 头疗是什么| 月经快来了有什么征兆| 沉疴是什么意思| 1996年是什么命| 老枞是什么茶| 阿胶配什么吃不上火| 办健康证需要检查什么| 坏肚子吃什么药| 什么泡水喝降甘油三酯| c1e驾照能开什么车| 水瓶女和什么星座最配| 吃什么补肺养肺比较好| 狗眼看人低是什么意思| 二姨子是什么意思| 七情六欲什么意思| 女人喝什么补气养血| 鸡头上长痘痘用什么药| 小混混是什么意思| 早上起床口苦是什么原因| 九价疫苗是什么| 牙痛吃什么消炎药| 做宫颈筛查能查出什么| 百什么争什么| 风雨交加是什么生肖| 颈椎间盘突出有什么症状| 火车无座是什么意思| 老年人吃什么水果对身体好| 吃韭菜有什么好处和坏处| gaba是什么| 一个骨一个宽是什么字| 求欢是什么意思| 氯高是什么原因| 梦见着大火了是什么征兆| 治疗胃反酸烧心用什么药最好| 盐为什么要加碘| 吃维生素c有什么好处| 红苋菜不能和什么一起吃| 项羽为什么叫西楚霸王| gjb2基因杂合突变是什么意思| 四季花是什么花| 排长是什么级别| 皮毒清软膏有什么功效| 爬虫什么意思| 银行卡销户是什么意思| 什么是耳鸣| 牛羊成群是什么生肖| 蛋白烫发是什么意思| 一什么点心| 吃什么长卵泡| 肖想是什么意思| 为什么医院不推荐钡餐检查| 什么样的贝壳| 乌鸡不能和什么一起吃| 牙周炎吃什么药最有效| 百度

新闻中心

EEPW首页 > 消费电子 > Java虚拟机应用于数字电视机顶盒的研究与实现

为什么说黑鱼是鬼

——
作者:刘俊 张萍 姚莉 于鸿洋 时间:2025-08-05 来源:中国有线电视 收藏
    为了促使朝着基于的中间件标准DVB。MHP (多媒体家庭平台)发展,简略介绍的体系结构,从由Sun公司提供的基于Linux的J2ME到嵌入式操作系统OS20的移植过程,重点介绍本地方法调用的移植实现。实验证明,该方法能够使简单的Java程序在上成功运行。 
        

        引    言  

    随着有线广播电视网向数字化、网络化、产业化方向发展,利用有线电视网络作为传输平台的除了能够让用户在现有模拟电视机上观看数字电视节目之外,广播和交互式多媒体应用功能的要求也应运而生,互动电视成为数字电视发展的方向。众多程序员熟悉的为网络广泛运用的Java语言能很好地满足一些服务应用的要求,因此提出了包含Java的数字电视机顶盒中间件的系统架构,该虚拟机用来执行Java应用程序,并且中间件将应用程序和底层操作系统、硬件细节隔离开,使上层的数字电视的服务应用不必考虑过多的底层细节。本文主要介绍了J2ME中主要用于数字电视领域的CDC的移植,其中又着重介绍了本地方法(native method)的实现过程。 

        结构及工作原理 

        Java虚拟机工作原理  
        

    Java虚拟机处于机器和编译程序之间,在任何平台上都提供给编译程序一个共同的接口。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。 

  Java虚拟机的主要任务是装载class文件并且执行其中的字节码。Java虚拟机包含一个类装载器,它可以从程序和API中装载class文件。字节码由执行引擎来执行,具体过程如图1所示。 



        图1 Java虚拟机的工作过程 

        Java虚拟机结构  
         

    类装载器的体系结构是Java虚拟机在安全性和网络移动性上发挥重要作用的一个方面,图中所示的类装载器可以包含多个类装载器的子系统, Java应用程序能够在运行时决定需要安装的类,并且将被不同的类装载器装载的类存放在不同的命名空间。  

    执行引擎处于Java虚拟机的核心位置,它的行为由指令集所决定,其主要作用就是解释字节码(即运行经过编译后的Java程序的class文件) ,不同的执行引擎实现可能非常不同。由软件实现的虚拟机的执行引擎分为一次性解释字节码、即时编译器和自适应优化器,由硬件芯片构成的虚拟机用本地方法执行Java字节码,它的执行引擎是内嵌在芯片里。  

    Java虚拟机相当于一个堆栈计算机,它在指令间传送信息时不使用任何物理寄存器,而使用堆栈的帧来表示方法的状态、字节码的操作对象、方法的参数空间及局部变量的空间,它的“程序计数器”为一个伪寄存器,是当前所执行指令的字节码数组的一个指针。 

        Java实现方法  
        

    Java有两种实现方法:Java方法和本地方法。Java方法是由Java 语言编写,编译成字节码,存储在class文件中。本地方法是由其他语言(比如C,C++,或者汇编语言)编写的,编译成和处理器相关的机器代码,保存在动态连接库中,格式是各个平台专有的,它是联系Java程序和底层主机操作系统的连接方法。Java方法与平台无关,但是本地方法却不是,运行中的Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。通过本地方法, Java程序可以直接访问底层操作系统的资源,使程序和特定的平台相关,一个本地方法接口——Java本地接口(JNI)使得本地方法可以在特定的主机系统的任何一个Java平台上运行。 

           J2ME中的CDC移植的解决方案  

    我们选用的要移植的Java虚拟机是Sun公司提供的J2ME对于数字电视领域CDC配置,该虚拟机是针对Linux的软件实现(用C语言编写的虚拟机,该虚拟机也称为C Virtual Machine,简称CVM) 。Java虚拟机规范并没有强求Java虚拟机必须支持任何特定的本地方法接口,但是Sun 公司提供了本地方法接口(Java Native Interface) ,是为移植所用。Java程序通过调用本地方法和主机交互。 

            Java虚拟机 



        图2 Java虚拟机的位置  

    虚拟机处于嵌入式操作系统OS20 上,因此Sun公司提供的Java虚拟机中与底层操作系统相关的操作都应该替换为OS20的内核函数。因此将Sun公司提供的CDC移植到OS20需要完成一些工作,比如: C语言中关于基本数据类型的数据位的修改,关于线程的创建机制(OS20为任务) ,关于线程之间的同步、互斥,关于动态连接的实现,关于本地方法的实现等,本节主要介绍关于本地方法的实现过程。 

        本地方法  
        

    解释器处理字节码时,与给定字节码有关的动作的语义、执行字节码的相关动作大多是从堆栈中获得其操作数,并将其结果送回堆栈中。典型的情况下字节码是带有参数的,这些参数在字节码流中紧跟在字节码自身之后。 

    在虚拟机解释字节码过程中,执行引擎会不时遇到请求本地方法调用的指令,虚拟机负责试着发起这个本地方法的调用。本地方法是Java虚拟机指令集的一种可编程扩展,运行这个本地方法就是Java虚拟机对这条指令的执行。 

         本地方法函数调用  
         

    为了增加虚拟机的性能,加快其速度,解释器在处理一些字节码时调用的本地方法函数用汇编实现了将Java栈转换为C栈,然后在C堆栈上实现函数的调用。Linux下是用独立的汇编语言程序invokeNative_i386。 S实现函数CVMjniInvokeNative () ,我们采用在C里面嵌入汇编的形式来实现该函数。  

    该函数的形参有7个,完成的主要功能是将由实参传递来的部分数据通过直接或者运算后得到本地方法的参数,然后压入本地栈,通过汇编来实现本地的C函数调用。实参传递过来的7个数据包含JN I环境指针(env) 、本地方法的函数指针(native code) 、Java栈指针(args) 、本地方法的描述符(terse sig) , Java栈的参数总数(args size)表示静态或非静态方法的类对象标志(class object)及用于存储返回值的一个指针变量(return value) ,其中env要作为第一个本地方法的参数传递,并且native code也要传递到本地方法来实现本地方法的正确调用。 

        J2ME中的CDC移植  
         

    由于Linux有多个通用寄存器,在实现该函数的代码中充分运用了如esp、ebp、esi等寄存器,但是OS20提供的可操作的寄存器只有3个通用寄存器Areg、Breg、Creg和1个工作指针寄存器Wptr (相当于堆栈指针) ,在实现过程中,我们用在C函数中设立局部变量来代替Linux的通用寄存器,通过手动调整工作栈指针来实现本地方法的调用,具体实现过程如图3所示。 



 图3 Java栈到本地栈的转换  

    当进入汇编函数时,工作区指针为Wptr,实参、状态寄存器和指令指针寄存器的值全部自动入栈,然后是我们定义的代替Linux寄存器的局部变量自动入栈,此时的Wptr自动移到Wptr′,利用OS20的汇编指令,手动将实参传递过来的参数通过计算得到本地方法参数的个数,然后将本地方法所需的参数依次压栈,最后再手动调节工作区指针实现本地方法的成功调用。这里我们先将本地方法函数指针和1个标志位flag(0x10101010)入栈,原因有两个:  

    ①当随后我们手动调节工作指针Wptr′到Wptr"时,工作栈已由先前的嵌套汇编的函数进入到了要调用的本地方法的C函数,因此先前的函数的局部变量在此时无效,也就是说此时如果用以前实参传递过来的本地函数指针调用本地的函数肯定不会成功,因此要把这个函数指针先手动保存起来。  

    ②flag的设置的原因是:本地方法的参数的个数不是固定的,而OS20 所提供的用汇编调用函数在回到函数入口点时只弹出Wptr"指向的4 个单元的内容,因此多余的参数出栈操作也必须通过调节Wptr手动完成,通过向下移动Wptr查找flag标志,再调节Wp tr到Wtpr+2即可正确地回到汇编函数。当本地方法的参数完全手动入栈后就可以手动调节工作区指针Wptr而进入到调用的本地函数,函数返回后的第一件事是保存在寄存器中的函数的返回值到return value,恢复工作区指针Wptr,并将本地方法的返回值类型作为嵌入汇编的函数的返回值,此时就完成了由Java栈到C栈的转换,并成功调用本地方法。 

         结    论  

    通过对Sun公司下载的CDC代码的修改与编写,对CDC中的加载的类做了一些裁减,并且将线程化的解释器改为一次性解释字节码的单线程解释器简化程序,成功地生成了在机顶盒上可以运行简单的Java程序的虚拟机。 



评论


相关推荐

技术专区

关闭
头皮屑挂什么科 孔子是什么家 灵芝长在什么地方 心里难受想吐是什么原因 补肾壮阳吃什么
什么是免疫治疗 黑糖是什么糖 穿拖鞋脚臭是什么原因 神态是什么意思 麻醉科属于什么科室
户籍地是什么 运费险是什么意思 鸭子炖什么好吃 孩子上吐下泻吃什么药 小沙弥是什么意思
被弹颏是什么意思 公务员是什么职业 交警罚款不交有什么后果 氟斑牙是什么原因造成的 5月3号是什么星座
怀孕了胃不舒服是什么原因hcv8jop7ns6r.cn 全麻对身体有什么危害hcv7jop7ns1r.cn 眼睛跳是什么原因hcv8jop0ns2r.cn 糖醋里脊是什么菜系hcv7jop5ns5r.cn 老公的弟弟叫什么hcv9jop3ns5r.cn
被强奸是什么感觉dayuxmw.com 什么级别可以配秘书hcv9jop0ns4r.cn 结界是什么意思hcv8jop9ns1r.cn 总爱放屁是什么原因hcv9jop1ns2r.cn 靖康耻指的是什么历史事件hcv7jop7ns2r.cn
85属什么hcv9jop1ns4r.cn 哕是什么意思hcv7jop5ns3r.cn 贱货是什么意思hcv8jop1ns9r.cn 巨蟹座女和什么座最配adwl56.com 1.29是什么星座hcv9jop0ns7r.cn
什么是丁克hcv8jop1ns3r.cn 农历5月25日是什么星座hcv8jop9ns1r.cn 东南大学什么专业最牛ff14chat.com 鲁肃是一个什么样的人hcv8jop8ns3r.cn 孙权字什么hcv8jop0ns3r.cn
百度