(信号与信息处理专业论文)cosea虚拟操作系统和构件跨平台加载运行的研究与实现.pdf_第1页
(信号与信息处理专业论文)cosea虚拟操作系统和构件跨平台加载运行的研究与实现.pdf_第2页
(信号与信息处理专业论文)cosea虚拟操作系统和构件跨平台加载运行的研究与实现.pdf_第3页
(信号与信息处理专业论文)cosea虚拟操作系统和构件跨平台加载运行的研究与实现.pdf_第4页
(信号与信息处理专业论文)cosea虚拟操作系统和构件跨平台加载运行的研究与实现.pdf_第5页
已阅读5页,还剩62页未读 继续免费阅读

(信号与信息处理专业论文)cosea虚拟操作系统和构件跨平台加载运行的研究与实现.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

中文摘要 目前,l i n u x 操作系统越来越受到人们的关注,构件技术也逐渐发展成为 软件行业的主流。l i n u x 和构件技术正在最大程度的改变着软件行业,但两者 的结合并不尽如人意。w i n d o w s 等其他操作系统上开发的应用程序并不能在 l i n u x 上运行,从而导致了l i n u x 上可以支持的应用相对较少。本项目就填补 了这块空白,使得其他操作系统上可以运行的程序在l i n u x 上不需要任何修改 就能直接运行,这样不但大大丰富了l i n u x 的软件资源,而且避免重复开发功 能相同的软件,节省了大量的人力和时间。 基于上述想法,设计并实现了一个l i n u x 上的构件运行平台,取名为c o s t a 。 通过c o s e a ,c o m 构件、c a r 构件、n e t 、j a v a 等应用程序可以直接运行 在l i n u x 上。c o s e a 平台主要实现了以下几个功能:l i n u x 上可以支持p e 文 件的加载器;该加载器对构件的加载;w i n d o w s 或e l a s t o s 的a p i 与l i n u x 的 a p i 转接;l i n u x 中的构件代码重定位与内存保护机制以及l i n u x 内核与客户 端构件之间的通信机制。 本文首先描述了c o s t a 的结构设计与实现,介绍了c o s e a 环境的命令,目 录结构、环境配置等;说明了c o s e a 的体系结构,包括四个部分:w i n d o w s 或e l a s t o s 应用程序、s o 文件部分、c o s e a 加载器和c o s t as e r v e r ;阐明了c o s e a 的实现思路。 本文重点介绍了c o s e a 的加载器部分。着重分析了p e 文件的特点和结构, e l f 格式的特点和结构,并阐明两者的区别。进一步说明了p e 文件的解析过 程,重定位过程以及将p e 文件加载到内存中后的地址分配。详细说明了加载 器的加载依据,加载器的结构和实现。 最后,分析了c o m 构件和c a r 构件各自的特点,描述了各自的加载运 行流程图,分别通过实例说明c o m 和c a r 构件在c o s e a 上的运行情况。 关键词:l i n u xc o m 构件c a r 构件跨平台p e 加载器 a b s t r a c t t o d a y , l i n u xd r a w sm o r ea n dm o r ep e o p l e sa t t e n t i o n c o m p o n e n tt e c h n o l o g y h a sb e c o m et h em a i n s t r e a mi nt h ep r o c e d u r eo fd e v e l o p i n gn e wa p p l i c a t i o n s l i n u x a n dc o m p o n e n tt e c h n o l o g yc h a n g eo u rv i e wa b o u ts o f t w a r em o s t h o w e v e r , t h e r e l a t i o n s h i pa m o n gt h e mi sn o ts oh a r m o n y 部i ts h o u l db e t h ea p p l i c a t i o n sr u n n i n g o nw i n d o w so ro t h e ro p e r a t i o ns y s t e mc a n tr u no nl i n u x ,a sar e s u l t ,l i n u xh a sl e s s c h o i c eo na p p l i c a t i o n s t h i sp r o j e c tf i l l e dt h eb l a n ko ft h ec o o p c r a t i o no fl i n u xa n d c o m p o n e n t s t h ep r o j e c tl e tt h ea p p l i c a t i o n sr u n n i n go no t h e ro p e r a t i o ns y s t e mc a n r u no nl i n u x s ot h es o f t w a r er e s o u r c e sg e ta b u n d a n t ,a n da v o i dd o i n gt h es a l t l e p r o g r a m m i n g ,s a v i n gal o to fm a n p o w e ra n dt i m e b a s e do nt h o s et h o u g h t , id e s i g n e da n di m p l e m e n t e dac o m p o n e n t sr u n n i n g p l a t f o r mn a m e dc o s e a t h r o u g hc o s e a ,c o mc o m p o n e n t ,c a r n e t , j a v aa n dx m l c a nr u no nl i n u x c o s e ai m p l e m e n t e ds o m ef u n c t i o n sa sb e l o w :i m p l e m e n to ft h e l o a d e rw h i c hs u p p o r t sp ec o m p o n e n to nl i n t t x ;l o a dt h ec o m p o n e n t so nl i n u x ; t r a n s f e rt h ea p ii nw i n d o w so re l a s t o st ol i n u x ;t h em e c h a n i s mo fr e l o c a t i o na n d m e m o r y - p r o t e c t i o nf o rc o m p o n e n to nl i n u x ;t h ec o m m u n i c a t i o nm e c h a n i s m b e t w e e nl i n u xk e r n e la n dc o m p o n e n t s t h ep a p e rd e s c r i b e dt h es t r u c t u r eo fc o s e a ,i n t r o d u c e dt h eo r d e r s ,c a t a l o g u e , c o n f i g u r ea n ds oo n t h es t r u c t u r eo fc o s e ai n c l u d e df o u rp a r t s :t h ea p p l i c a t i o n s o nw i n d o w so re l a s t o s ,s of i l e s ,c o s e al o a d e r ,a n dc o s e as e r v e r a tl a s t ,c l a r i f i e d t h em e t h o do fi m p l e m e n t i n gc o s e a t h i sp a p e re m p h a s i z e dt h ec o s e al o a d e r ia n a l y s e dt h ec h a r a c t e r i s t i ca n d s t r u c t u r eo fp ef o r m a ta n de l ff o r m a t ,a n dc l a r i f i e dt h ed i f f e r e n c e sb e t w e e nt h e m m o r e ,c l a r i f i e dh o wt op a r s ep ef i l e ,r e p o s i t i o n i n g ,a n dh o wt od i s t r i b u t et h e a d d r e s sa f t e rp ef i l eb e i n gl o a d e dt ot h em e m o r y id e s c r i b e dt h el o a d e rb a s i s ,i t s s t r u c t u r ea n di m p l e m e n t i o ni nd e t a i l f i n a l l y , ia n a l y s e d t h ec h a r a c t e r i s t i co fc o mc o m p o n e n ta n dc a r c o m p o n e n t ,d r a w e dt h e i rf l o w c h a r t s ,s h o w e dt h e i rs t a t u sr u n n i n go nc o s e ab y i n s t a n c e s k e yw o r d s :l i n u x ,c o mc o m p o n e n tc a r c o m p o n e n t ,a c r o s sp l a t f o r m , p el o a d e r 独创性声明 本人声明所呈交的学位论文是本人在导师指导下进行的研究工作和取得的 研究成果,除了文中特别加以标注和致谢之处外,论文中不包含其他人已经发表 或撰写过的研究成果,也不包含为获得丞鲞盘堂或其他教育机构的学位或证 书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中 作了明确的说明并表示了谢意。 学位论文作者签名: l d b a s e ;模块的加载起始地址 f o r ( i = 0 ;i s e c t i o n n 啪;i 。r + ) m m a p ( ( v o i d 木) s t a r t ,p m o d u l e l n f o - a d d r , s i z e o t r a w d a t a , f l a g , m a p j 削o n y m o u s ,- l ,0 ) ;将模块中各s e c t i o n 影射到相应的地 址空间 s t a r t = s t a l l + s i z e o t r a w d a t a ;计算下一个s e c t i o n 开始的地址值 d o r e l o c a t i o n ( p m o d u l e l n f o ) ;厘定位 u p d a t e l a t a c c o r d i n g l i d ( p m o d u l e l n f o ) ;设置输入函数表 i f ( p m o d u l e l n f o - t y p e r 忡e _ d l l ) 是否为合法的d l l 文件 i n i t d l l ( p m o d u l e l n f o ) ;初始化d l l p m o d u l e n o d e - i n f o = p m o d u l e l n f o ; i n s e r t n e w m o d u l e ( p m o d u l e ) ;) e l s ei f ( m o d u l e _ t y p e s o m o d u l e ) 是否为合法的s o 文件 p m o d u l e n o d e - i n f o = d l o p e n ( m o d u l e p a t h ,r t l d _ l a z y ) ; i n s e r t n e w m o d u l e ( p m o d u l e ) ; e l s e p r i n t f ( ”c a n ts u p p o r tm o d u l et y p e s ! ! h a ”) ; r e t u r ne r r o r ;) r e t u r no k 图4 8c o s e a 力n 载器关键函数的实现代码 4 4 8c o s e a 的地址空间分布 一个应用程序的能够运行会涉及到很多模块,除了将e x e 程序加载到内存 中,还需要加载d l l 等其他p e 模块。c o s e a 的地址分配问题,结合l i n u x 用户地址 空间的分布,采取如下三个原则进行地址空间分配: 一、一般将e x e 文件加载到从0 x 4 0 0 0 0 0 开始的地址空间。 二、对于d l l 或构件的加载起始地址一般设为o x l 5 0 0 0 0 0 0 ,加载的具体地址, 根据模块的大小逐渐累加。 三、对于s o 模块等一些非p e 格式文件,其加载地址不受加载器控制。 c o s e a 力l l 载器加载应用程序和相应的d l l 后,其地址空间分布如图4 9 所示。需要 第四章c o s c a 加载器技术的研究与实现 解释下面几个程序的含义和作用:p e l o a d e r e x e ,实现了p e 文件的加载,这里就 是加载e x e 和d l l 。e x e 与d l l 是在e l a s t o s 或w i n d o w s 环境下编译生成的两个p e 文 件,一个是可执行文件,另一个是动态链接库文件。s o 文件是在l i n u x 系统上实 现的e l a s t o s 或w i n d o w s 的a p i ;d e 饺件列出了s o 文件中对外提供的的函数名称和 序号;由于e x e 中没有在i n t 表中没有保留函数名,其只是保持了函数的序号, 因此必须解析d e 玟件,以获得输入函数的名称,在通过l i n u x 的系统函数d l s y m 找到s o 文件中对应的函数指针,最后将指针填充到脚表中对应的表项。当所有 的i a t 表项都设置了相应的函数指针,e x e 程序就可以运行了。 文件,该文件由l i n u x 操 统加载,其加载地址由l j 卫 系统确定 d 1 1 加载到从0 x 1 5 0 0 0 0 0 0 开 的地址空间 e l o a d e r e x e 由l i n u x 系统加重 到从0 x s 0 0 0 0 0 0 开始的地方 e 文件加载后,所需调用的 h 部函数指针应该添加到对 z 的i a t 表中,其和下面的, 一一对应 p e 程序加载后,其会列出 一系列输入函数的序号, 根据序号就可以在d l l 中找 到对应的函数。但由于目 前的方法不支持通过序号 查找s o 中对应的函数指 针,因此需要分析,d e f 文件 以获得,对应序号的函数 名称 o x ? ? ? ? ? ? ? ? o x 8 0 0 0 0 0 0 o r d i n a l 图4 9 地址分布图 4 5c o s e a 在过程调用中对栈的处理 根据函数名称在加载的s o 文件中找到对应的函数地 址并将获得的函数指针 设置为i a t 中相应的表项。 通过序号分析d e f 文件以 获得函数的名称,函数的 名称,是为了在利用在s o 文件中查找到相应的函数 指针 d e f 文件,磁盘文件无 需加载到内存。 旺e 是待运行的p e 程序, 其由p e l o a d e r 加载到从 0 x 4 0 0 0 0 0 开始的地址 在函数调用过程中,一定会使用栈。基于x 8 6 体系结构的应用程序都是通 过程序栈来支持函数调用的,栈是用来传递参数,保存返回信息,保存寄存器信 息,以及保存过程局部变量的地址空间。因此,在x 8 6 体系结构下,包含两个 3 2 第四章c o s e a 加载器技术的研究与实现 与栈相关的寄存器,e b p ( 帧指针寄存器) ,e s p ( 栈指针寄存器) 。栈指针 是可以移动的,而帧是信息获取的参照地址。无论在l i n u x 还是在e l a s t o s 或 w i n d o w s 上,过程的调用都遵循帧栈结构,尽管l i n u x 用户栈的起始地址和e l a s t o s 和w i n d o w s 用户栈的起始地址并不相同,但这并不影响e l a s t o s 或w i n d o w s 应用 程序中的过程在调用过错中适用l i n u x 用户空间的栈,因为通过反汇编可以看 到,在过程调用的栈的操作都是通过帧指针寄存器e b p 和栈指针寄存器e s p 进 行的。 4 6c o s e a 的模块管理 前面的分析可知,c o s e a 力 1 载器利用m m a p 来映射或预留地址空间,并将e l a s t o s 和w i n d o w s 应用程序映射到c o s e a 加载器本身所在的地址空间。但应用程序的运 行会涉及到很多其他的模块,因为无论是w i n d o w s 上的应用程序还是e l a s t o s 上的 程序都会调用一些底层函数。这就涉及到c o s e a 加载器如何选择加载模块和地址 空间如何分配的问题。 c o s e a 将所有加载的模块分为两类:本地模块( n a t i v em o d u l e ) 和内建模块 ( b u i l d i nm o d u l e ) 。本地模块是指e l a s t o s 或w i n d o w s 上生成的模块,包括e x e 和 d l l ,其好处是可以保持与e l a s t o s 或w i n d o w s 的完全兼容,一般是以“d l l 或e x e ” 结尾。内建模块是指e l a s t o s 或w i n d o w s 需要的,但由于系统调用的原因,不能以 本地模块的方式加载n l i n u x 系统上的模块。这种模块在c o s e a j f l 载器中以“s o , 结尾。为实现这种模块,必须在l i n u x 上开发与e l a s t o s 或w i n d o w s 上模块相同的 a p i ,然后通过前面所说的模式转换,达到在l i n u x 上支持e l a s t o s 或w i n d o w s 应用 程序调用的目的。 c o s e a 采取链表方式来管理这些模块,所有的加载模块都保存在一个加载模 块指针的全局链表中。该模块链表的作用就是纪录所加载模块,快速定位模块, 为其他需要加载的模块提供服务。模块链表的维护包括增加模块,查找模块,模 块生命周期管理,以及删除模块。链表中的模块,对于e l f 格式的s o 模块而言, 其只需保留通过d l o p e n 系统调用得到的s o 模块动态库的指针即可,而p e 模块加 载后保留信息要多一些,这是为了其他模块在加载相同模块时,这些信息可以减 少读写磁盘模块的时间,从而提高模块的加载速度。 c o s e a 利用内存分配链表来管理地址空间。内存分配链表的作用是记录用户 地址空间的使用情况,确定新加载模块的的加载位置,并将回收的模块进行回收, 以节省或重新利用地址空间。该链表记录了己分配和未分配的内存块地址和大 小。初始的时候,已分配表为空,未分配表有两个部分,第一部分是针对e x e 第四章c o s e a 加载器技术的研究与实现 模块而言,块的起始地址设为0 x 4 0 0 0 0 0 ,大小为o x 4 0 0 0 0 0 到o ) 【7 0 0 0 0 0 0 的之间的 空间( 0 x 8 0 0 0 0 0 0 是e l f 程序默然的加载地址) 。第二部分是针对d l l 模块而言, 该块的起始地址为0 x 1 5 0 0 0 0 0 0 ,大小为从0 x 1 5 0 0 0 0 0 0 蛰j 0 x 3 0 0 0 0 0 0 0 的之间的地址 空间。对于非p e 格式的模块,如e l a s t o s s o 、k e r n e l 3 2 s o 等则通过c o s e a ) b l l 载器调 用l i n u x 系统函数加载到相应的地址空间。对于这些模块的加载,其加载地址不 受c o s e a 力1 载器控制。 4 7 小结 本章详细介绍了p e 文件的特点,c o s e a 加载器的加载依据,体系结构,模块 加载方式等。通过在l i n u x 上编写c 程序实现了c o s e a 加载器,将p e 文件加载 到内存中。下面第五章和第六章,将详细阐述c o m 构件与c a r 构件在c o s e a 上的运行的实现,并分别通过实例说明。 第五章c o m 构件在c o s e a 上运行的实现 第五章c o m 构件在c o s e a 上运行的实现 为了实现c o m 构件在l i n u x 上运行,我通过分析c o m 构件的特点和它的 流程,设计了适合c o m 构件加载运行的方案,最终实现了c o m 构件通过c o s e a 平台在l i n u x 上运行。 5 1c o m 构件 c o m 组件对象模型,是一种以组件为发布单元的对象模型,这种模型使各 个组件可以用一种统一的方式进行交互。无论各构件是什么语言或工具开发的, 只要遵循c o m 规范,彼此之间就是二进制兼容的。同时c o m 构件具有可重用 性,使得复杂的大型软件系统变成一些简单的对象模块,极大的提高了效率。本 章首先阐明c o m 的结构、c o m 构件的注册和c o m 的实现,在此基础上再详细 讲解c o m 在c o s e a 上的运行方式。 5 1 1c o m 对象 c o m 是面向对象的软件模型,因此对象是它的基本要素之一,那么c o m 对象到底是什么呢? 在c o m 规范中并没有对c o m 对象有严格的定义,我认为 与c + + 中的对象的概念是相似的,就是方法、属性和数据组合在一起的一个实例。 每个c o m 对象都有一个1 2 8 位的全局唯一标识叫l s i d ,它是一个随机数, 由u u i d 工具产生。 5 1 2c o m 的模型 c o m 是建立在客户服务器模型基础上的,但并不是严格意义上的客户服 务器模型,有时客户也可以提供服务,服务方也需要其他对象的某些功能。采用 这种模式,简化了应用,把任务进行了分离,客户方和服务方各司其职,共同完 成任务,提高了稳定性和可靠性。同时,一个服务可以提供给多个客户,一个客 户也可以连接到多个服务方,提高了灵活性与扩展性。 5 1 3c o m 接口 接口是包含了一组函数的数据结构,逻辑上是组相关的函数集合。它在 第五章c o m 构件在c o s e a 上运行的实现 c o m 中是至关重要的,组件之间只有通过接口才可以互相通信。一个接口一旦 公布,它将永远保持不变,构件升级时,也不会修改已有接口,只是加入一些新 的接口。c o m 接口的内存结构是一个函数指针数组,每个数组元素包含的是一 个由构件所实现的函数的地址。下图5 1 为c o m 接口的内存结构图: 虚拟函数表v t a b l e 图5 - 1c o m 接口内存结构图 指向成员函 数的指针 每个c o m 接口都必须继承i u n k n o w n 接口,是因为该接口提供了两个非常 重要的特性:接口查询和生存期控制。在i u n k n o w n 接口中定义了3 个函数: q u e r y i n t e r f a c e 、a d d r e f 、r e l e a s e 。其中客户通过q u e r y i n t e r f a c e 函数来查询某个 组件是否支持某个接口,如果支持,就会返回一个指向此接口的指针,利用这个 指针就可以调用那个接口中的函数;否则,就会返回一个错误代码。客户了解组 件所支持接口的唯一方法就是通过q u e r y i n t e r f a c e 进行查询,组件所支持的接口 集就是q u e r y l m e r f a c e 能够为之返回的接1 3 指针的那些接1 3 。a d d r e f 和r e l e a s e 函数是用来控制接口生命周期的,是提供给客户的何时使用完一个接口的手段。 当客户从组件取得一个接口时,此引用计数值将增加1 ;当客户使用完某个接口 后,组件的引用计数值将减1 ;当引用计数值为o 时,组件就可将自己从内存中 删除。a d d r e f 用于增大引用计数值,r e l e a s e 用于减少引用计数值。每个接口都 有一个唯一的接口标识符( i i d ) ,它是一个1 2 8 位的全局唯一标识符。这样可以 保证唯一性,从而避免了出现名字发生冲突的问题。 5 1 4c o m 库 c o m 库就是一些系统级的核心代码,这是这些代码才使得对象和客户之间 可以通过接口在二进制代码级进行交互。在w i n d o w s 操作系统下,这些库以d l l 文件的形式存在,它包括以下两个内容:提供了少量的a p i 用于实现客户和服务 端c o m 应用的创建:通过注册表查找本地服务端:提供标准的内存控制方法, 使得应用控制内存分配。c o m 库的实现不在应用层,一般位于系统层,它的实 途f 第五章c o m 构件在c o s e a 上运行的实现 现必须依赖于系统底层的一些函数。有了c o m 库,使得我们不必再为c o m 通 信而编写大量代码,可以直接使用它所提供的a p i ,加快了开发速度。 5 1 5 类厂 类厂( c l a s s f a c t o r y ) 是c o m 对象的生产基地,c o m 库是通过类厂创建c o m 对象的。类厂本身也是一个c o m 对象,它支持一个特殊的接口i c l a s s f a c t o r y , 在这个接口中有一个很重要的函数c r e a t e h a s t a n c e ,这个函数用于创建对应的 c o m 对象。因为每个类厂只针对特定的c o m 类对象,所以c r e a t e l n s t a n e e 这个 成员函数知道该创建什么样的c o m 对象。而类厂是由谁创建的呢? 答案是 d l l g e t c l a s s o b j e c t 函数,d l l g e t c l a s s o b j e c t 函数并不是c o m 库中的函数,而是 由组件程序实现的函数。 5 1 6c o m 构件的注册机制 ,c o m 构件没有关于自身的导入信息的描述,构件依赖关系是建立在全局的 注册表之上,组件对象信息和接口信息都需要在注册表中进行注册。 注册表是w i n d o w s 操作系统上一个正式的共享系统数据库,包括关于系统 中硬件、软件、配置以及用户的各种信息,所有基于w i n d o w s 的程序都可以向 注册表中加入若干信息并从中读出所需信息。在w i n d o w s 下注册表的信息不是 杂乱无章地排列,它内部的组织结构是一个类似于文件夹管理的树状分层的结 构。他们有自己的名字主键、子键、键值名称及键值数据。w i n d o w s 注册表的主 键包括h k e y _ - l o c 过m a c h i n e 、h k e y u s e r s 、h k e y c u r r e n t u s e r 、 h k e yc l a s s e sr o o t 、h k e yc u r r e n tc o n f i g 和m ( e yd y nd a t a 六大主键,这六大主键在所有的w i n d o w s 操作系统中是固定不变的。 5 2w i n e 的介绍 w i n e l 2 4 是“w i n ei sn o ta ne m u l a t o r ”的缩写,这意味着,w i n e 并不是一个 虚拟机,即它不是通过模拟c p u 来工作的。w i n e 的目的是通过软件模拟的方式, 将w i n d o w s 的a p i 以l i n u x 系统调用实现。这样,没有w i n d o w s 的系统支持, w i n d o w s 应用程序仍然可以加载至l j l i n u x 上运行。它在u n i x l i n u x 之上实现了 w i n d o w sa p i s 。它是一个w i n d o w s 兼容层,用通俗的话说,就是一个w i n d o w s 模 拟器。它提供了一个可以在l i f l u x 系统上编译w i n d o w s 应用程序的开发工具包 ( w i n e l i b ) 。同时还提供了一个程序加载器,该加载器允许不用任何修改的w i n d o w s 第五章c o m 构件在c o s e a 上运行的实现 3 1 9 5 n t 的二进制文件,就可以运行在l i n u x 上。 5 3c o m 构件在c o s e a 上运行的实现 5 3 1 注册表机制 在c o s e a 上,我们根据w i n e 的注册表机制,自己维护了一个注册表,它的 机制与w i n d o w s 的注册表的机制是一样的。c o s e a 中的s y s t e m r e g 文件相当于 w i n d o w s 的注册表。当注册了动态连接库之后,就会加入该动态连接库的相关信 息,通常会包含c l s i d ,i n t e r f a c e 和类型库的信息。注册表加载到内存之后,就 会对应用程序所需要的库函数一个个的查找。如果已经注册了,就会在注册表中 找到该文件的路径,然后加载到内存中。如果没有注册,就要先在注册表中注册 后再加载。 5 3 2 底层函数的转换, w i n d o w s 上的应用程序在w i n d o w s 系统上运行时,都要调用w i n d o w s 的底 层函数,如k e r n e l 3 2 d l l 等。下图5 2 是w i n d o w s 应用程序运行的拓扑图: w i n d o w se x e w i n d o w sd l l g d l 3 2 d l l 、u s e r 3 2 d l l k e r n e l 3 2 d l l n t d l l d l l w i n d o w so sk e m e l 图5 - 2w i n d o w s 应用程序运行的拓扑图 如果想使得w i n d o w s 应用程序能够不进行二次编译就直接运行在l i n u x 系 统上,那么我们就必须在l i n u x 系统上模仿w i n d o w sa p i 这层,才会使得应用程 序运行在l i n u x 过程中,不会感觉到操作系统的改变。 运行w i n d o w s 上的e x e 应用程序的时候,它同时也有两种方式来调用该应 用程序所用的动态连接库:n a t i v e 和b u i l d i n 。n a t i v e 这种方式是用来调用 w i n d o w s 自身的动态连接库。你只要把w i n d o w s 的动态连接库拷贝到l i n u x 系 统上即可。b u i l d i n 这种方式是用来调用l i n u x 的动态连接库,在l i n u x 系统上是 第五章c o m 构件在c o s e a 上运行的实现 以s o 的形式存在的。 由于研究时间有限,并且w i n d o w s 的底层a p i 的数量很大,大多数没有开 放的源代码,所以我实现这些底层函数具有很大的困难。c o s e a 中c o m 构件所 需要的底层函数我是通过移植w i n e 项目中的w i n d o w s a p i 实现的。w i n e 中d l l s 目录下实现了1 6 9 个w i n d o w sa p i 。 通过使用o b j d u m p 、d u m p b i n 、g d b 等工具,以及反汇编的分析发现,所有的 w i n d o w s 应用程序都要调用k e r n e l 3 2 d l l 、n t d l l d l l 、o l e 3 2 d l l 、a d v a p i d u l 等。其中 k e r n e l 3 2 d l l 是一个很重要的动态链接库,几乎所有的w i n d o w s 应用程序都会用 到它。a d v a p i d l l 是用于注册组件或者取消组件的注册。0 1 e 3 2 d l l 是用于c o m 组件的初始化和创建对象。n t d l l d l l 是一个最底层的函数,k e r n e l 3 2 d l l 会调用到 它。根据第四章中所讲的底层函数的转换,需要将这些经常用到的d l l 都转换成 s o 文件,以支持w i n d o w s 应用程序在l i n u x 上运行。所以就选择性的移植了以 下几个a p i :k e r n e l 3 2 s o 、n t d l l s o 、u s e r 3 2 s o 、o l e 3 2 s o 、a d v a p i 3 2 s o 、g d i 3 2 s o 。 众所周知在l i n u x 系统下,系统是根据m a k e f i l e 来进行创建的,w i l l e 也不 例外。所以我移植的过程就是通过修改m a k e f d e 文件实现的。在c o s e a 环境中, 将m a k e f i l e 文件改写成为d i r s 和s o u r c e s 文件,如果此目录下还存在下级目录, 就编写d i r s 文件,如果不存在下级目录,全部是c 语言源代码,就编写s o u r c e s 文件。之后使用m 命令重新编译所在目录,生成c o s e a 环境中的s o 文件。下面 以k e r n e l 3 2 s o 为例,说明这个过程,下面图5 3 是w i n e 中d l l s 目录下k e r n e l 目 录里面的m a k e f i l e 文件: 第五章c o m 构件在c o s e a 上运行的实现 4 0 第五章c o m 构件在c o s e a 上运行的实现 4 1 第五章c o m 构件在c o s e a 上运行的实现 图5 - 3w i n e 中k e r n e l 目录的r n a k e f i l e 文件 下面的图5 - 4 和5 5 分别是根据上面的m a k e f i l e 文件改写成c o s e a 中的d i r s 文件和s o u r c e s 文件: 第五章c o m 构件在c o s e a 上运行的实现 4 3 第五章c o m 构件在c o s e a 上运行的实现 图5 5k e r n e l 目录的s o u r c e s 文件 4 4 第五章c o m 构件在c o s e a 上运行的实现 5 3 3c o m 在c o s e a 上的运行机制 首先要通过c o s e a 的p e 加载器将c o m 构件加载到内存中,加载部分的原 理与c a r 构件加载基本上是一样的,唯一不同就是在加载c o m 构件的过程中, 要先将注册表加载到内存中,然后根据注册表一个个的查找应用程序所需要的库 函数:这也是运行c o m 构件要比运行c a r 构件时间长的原因。下图5 - 6 是c o m 构件工作的流程图: 图5 - 6c o m 构件工作流程图 c o m 构件工作流程为: 一、c o c r e a t e l n s t a n c e 调用c o g e t c l a s s o b j e c t 函数; 二、c o m 库找到d l l 程序并进入进程; 第五章c o m 构件在c o s e a 上运行的实现 三、调用d l l g c t c l a s s o b j c c t 函数; 四、d l l g e t c l a s s o b j e c t 函数创建娄厂: 五、d l l g e t c l a s s o b j e c t 函数把类厂接口指针返回蛤c o g e t c l a s s o b j e c t 函数: 六、c o g e t c l 笛s o b i e c t 函数把类厂接口指针返回给c o c r e a t c l n s t a n c e 函数: 七、c o c r e a t e i n s t a n c e 函数得到类厂后调用类厂的对象创建函数; 八、类厂创建c o m 对象; 九、类厂把c o m 对象返回给c o c r e a t e h a m a n e e 函数,c o c r e a 把l n s t a n c e 函数 返回: 十、客户直接调用c o m 对象。 5 3 4c o m 在c o s e a 上的运行实例 我们的主要开发工具除了使用v c 60 ( 或者d o s 下的c l 命夸) 之外还使 用v m w 缸e 和s e c u 州c r t 。其中,w 玳是一个虚拟机,一个虚拟p c 的软件, 在其上安装l m u x 操作系统,这样可以使你可以在一台机器上同时运行w i n d o w s 和l i n u x 系统( 机器本身是w m d o w s 操作系统) 。但是,使用v m w a i - e 对于w m d o w s 与l t n u x 之间切换和上传、下传文件。不是很方便。所以采用s e c u r e c r t ,它可 以将装有l i n u x 的v m w & i _ e 视为服务端,自己视为客户端。使用s e e u r e c r t 在 w i n d o w s 和l i n u x 系统之间切换就想在w m d o w s 下使用一个小应用程序一样 简单。除此之外使用s e c u r e c r t ,通过亿和s z 就可以上传或下传文件。图5 - 7 显示了使用s e c u r e c r t 上传文件的过程 j qi 口 图5 7 使用s e c u r e c r t 上传文件的过程圈 第五章c o m 构件在c o s e a 上运行的实现 首先,使用r z 命令将在w i n d o w s 系统上编译生成的c o m 构件 f i r s t s r v c l i e n t e x e 和f i r s t s r v d l l d l l 上传到c o s e a 的s a m p l e s 目录下。然后,使用 命令r e g s v r 3 2 注册服务端的d l l 。最后,输入命令“c o s e a c o r nf i r s t s r v c l i e n t c x e , 这样c o m 构件就借助于c o s e a 这个平台在l i n u x 系统上运行起来了。通过对话 框输出“h e l l ow o r l d ”。下面图5 8 和图5 - 9 分别是服务端和客户端的源代码和运 行结果的截图: 第五章c o m 构件在c 惦龃上运行的实现 图5 - 8 程序源代码 第五章c o m 构件在c o s e a 上运行的实现 通过上面h e l l ow o r l d 的例子,说明了c o m 构件可以在c o s e a 上加载运行, 同时也说明了c o s e a 平台的设计方案是切实可行的。 第六章c a r 构件在c o s e a 上运行的实现 第六章c a r 构件在c o s e a 上运行的实现 在研究c a r 构件的运行机制期间,结合c a r 构件的特点自描述,通 过分析它的工作流程,设计了c a r 构件加载运行的方式,实现了e l a s t o s a p i 和 l i n u xa p i 的转接,生成了e l a s t o s s o ,最终实现了c a r 构件通过c o s e a 在l i n u x 上运行。 6 1c a r 构件自描述特性 自描述是c a r 构件一个很重要的特征,这个特性对于c a r 构件运行在 c o s e a 上也具有很重要的意义。首先构件自描述是指构件能够描述自己的信息数 据,这样便于从二进制级上把接口与实现分离,并达到接口可以跨地址空间的目 的。主要包括以下两点: 一、c a r 把类信息( c l a s s l n f o ) 作为描述构件的元数据,类信息由c a r 文 件编译而来,是c a r 文件的二进制表述。在c a r 中,可以使用一个特殊的c l s i d 从构件中取出元数据信息,构件元数据的解释不依赖于其它的d l l 文件。 二、在c a r 的构件封装中,除了构件本身的类信息封装在构件内外,还对 构件的依赖关系进行了封装。即把一个构件对其它构件的依赖关系也作为构件的 元数据封装在构件中,我们把这种元数据称为构件的导入信息( i m p o r t l n f o ) 。 c a r 构件通过对c l a s s l n f o 和i m p o r t l n f o 的封装,可以实现构件的无注册运 行,并可以支持构件的动态升级。 6 2c a r 构件元数据 6 2 1 元数据定义 元数据( m e t a d a t a ) ,是描述数据的数据。一方面元数据是一种数据,另一方面 元数据还是对数据的一种抽象,它主要描述了数据的类型信息。 普通的源文件( c 或者c + + 语言) 经过编译器的编译产生二迸制的文件,其 中通常不包含数据的类型信息。比如一个指针,单看编译完之后的二进制代码或 汇编代码已不能区分它是整型或是字符型了,如果是指向字符串的指针

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论