已阅读5页,还剩64页未读, 继续免费阅读
(计算机应用技术专业论文)交叉编译系统的研究与实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
嚣韭琦:交叉编译系统的研究o j 实现 浙江人学硕士学位论文2 0 0 3 年2 月 摘要 伴随着以计算机技术、通讯技术为主的信息技术的飞速发展和互联网的广泛 应用,3 c ( c o m p u t e r 、c o m m u n i c a t i o n 、c o n s u m e r ) 合一将成为必然趋势。信息 家电,手持设备,移动设备等嵌入式产品的迅速发展,使得嵌入式软件开发再度 成为一个研究热点。 由于嵌入式设备的性能局限,往往不能通过本机编译得到所需软件的可执行 程序。因此,以l i n u x 为主机操作系统,搭配一个交叉编译系统,为嵌入式设备 生成可执行程序已成为现在日益流行的编译嵌入式软件的解决方案。而开放源码 的编译器g c c ,经过多年的发展,已能支持几乎所有知名厂商的处理器,是嵌入 式软件开发中理想的交叉编译器。 但现有g c c 支持的平台并不能满足层出不穷的嵌入式产品的丌发需要,仍有 许多平台得不到支持。本论文以交叉编译系统z l t c g 的开发为背景,详细介绍了 交叉编译系统o c c 的体系结构,对其高度可移植性所依赖的中间表示和机器描述 技术进行深入研究,并在此基础上完成了g c c 在目标机m i p s x 上的移植工作。本 文根据新目标机的特点,利用了指令拆分,延时槽调度,窥孔优化等技术,既实 现了对新目标机的支持,又吸收了原有系统高度优化和可移植的优点。彳 论文首先概述了编译系统的发展背景和原理,重点介绍了编译器系统的系统 结构、自举与移植。然后介绍了交叉编译系统z l t c g 的开发背景和体系结构。第 二章详细分析了编译器g c c ,重点说明了6 c c 的设计思想,系统结构及其中间语 言和机器描述文件机制。第三章介绍了交叉编译系统的移植过程,重点解释了移 植的思路和方法,移植的准备工作,移植的具体步骤,实现难点及相关的一些技 术细节,并给出了移植成功后的测试结果。其中移植的准备工作中详细说明了目 标机m i p s x 的系统结构和应用二进制接口的定义,而移植的具体步骤中详细阐述 了对编译器后端的移植过程。最后是一点总结和展望。 关键字:交叉编译系统,交叉编译器,交叉汇编器,交叉链接器,中间语言,、瓷e , g a s 一卧删鹦k 墨堡:一 堑墅:查墨丝堡至釜竺丝窒竺茎丝 塑兰查兰堡土兰丝丝苎:! ! ! 兰! 皇 a b s t r a c t w i t ht h e r a p i dd e v e l o p m e n t o fi n f o r m a t i o nt e c h n o l o g yi n c l u d i n gc o m p u t e r t e c h n o l o g ya n dc o m m u n i c a t i o nt e c h n o l o g y , a n dw i t ht h ei n t e m e tw i d e l yu s e d ,t h e c o m b i n a t i o no fc o m p u t e r , c o m m u n i c a t i o na n dc o n s u m e ri si n e v i t a b l e f o rt h er a p i d d e v e l o p m e n t o f t h ee m b e d d e d ,h a n d h e l da n dw i r e l e s sd e v i c e s ,t h ee m b e d d e d s o f t w a r e i sb e c o m i n gah o ts p o to f t h ei n f o r m a t i o ni n d u s t r y s i n c et h er e s o u r c el i m i t a t i o no fe m b e d d e de q u i p e m e n t s ,d e v e l o p e r su s u a l l yc a n t c o m p i l e s o f t w a r eo nt h e m i ts e e m st o b ea p o p u l a r s o l u t i o nf o re m b e d d e d e q u i p e m e n t st oc o m p i l es o f t w a r eo n a n o t h e rs y s t e m ,w h i c hu s el i n u xa sa no p e r a t i n g s y s t e mw i t hac r o s s c o m p i l e rb u i l to n a n dg c c ,o n eo f t h eo p e ns o u r c ec o m p i l e r , w h i c hh a db e e nd e v e l o p e dm a n yy e a r s ,c a ns u p p o r tn e a r l ya l lf a m o u sp r o c e s s o ra n d b e c o m ea na p p r o p r i a t ec r o s s c o m p i l e rf o rt h ed e v e l o p m e n to f e m b e d d e ds o f t w a r e h o w e v e r , g c cc a n ts u p p o r ta l l e m b e d d e de q u i p e m e n t s ,t h e r ea r es t i l lm a n y p l a t f o r m s n e e dc r o s s c o m p i l e r s w i t ht h eb a c k g r o u n do fd e v e l o p i n gar e n o v a t e d c r o s s - c o m p i l e rn a m e dz l t c gs u p p o r t i n gp r o c e s s o rm i p s x ,t h i st h e s i sa n a l y z e st h e a r c h i t e c t u r eo fg c c c r o s s c o m p i l e rs y s t e m ,d e e p l y s t u d i e st h ei n t e r m e d i a t e r e p r e s e n t a t i o na n dm a c h i n ed e s c r i p t i o nw h i c h t h ep o r t a b i l i 锣o fg c ca r eb a s e do n , a n dr e a l i z e sp o r t i n go fg c c c r o s s c o m p i l e rs y s t e m t oa t a r g e tp r o c e s s o r m i p s x t h i s t h e s i sm a k e su s eo fi n s t r u c t i o ns p l i t ,d e l a y - s l o ts c h e d u l i n ga n dp e e p h o l eo p t i m i z a t i o n i np o r t i n g t h en e wc r o s s c o m p i l e rs y s t e m ,z l t c gn o to n l ys u p p o r t st h en e wt a r g e t b u ta l s oa b s o r b st h eo l ds y s t e m sa d v a n t a g e so nc o d eo p t i m i z a t i o na n dp o r t a b i l i t y a tf i r s t ,t h i st h e s i sd e s c r i b e st h ed e v e l o p i n gh i s t o r ya n dt h e o r i e so fc o m p i l e r , e s p e c i a l l y o ni t s a r c h i t e c t u r e ,b o o t s t r a p p i n g a n dp o r t i n g t h e ni ti n t r o d u c e st h e d e v e l o p i n gb a c k g r o u n da n da r c h i t e c t u r e o ft h ec r o s s c o m p i l e rs y s t e m ,z l t c g i n c h a p t e r2 ,i ta n a l y s e sg c c i n d e t a i l s ,e s p e c i a l l yo ni t sd e s i g n a t i o i n ,a r c h i t e c t u r e , i n t e r m e d i a t el a n g u a g ea n dm a c h i n ed e s c r i p t i o nf i l e s i nc h a p t e r3 ,i te x p l a i n st h e i m p l e m e n t a t i o no fz l t c gd e s c r i b e si t sw a y sa n dm e a n s ,t h ep r e p a r a t i o na n dt h e p o r t i n g ,r e s o l v e ss o m ed i f f i c u l tp r o b l e m sa n de x p l a i n e ss o m et e c h n o l o g i e si nd e t a i l , o f f e r st h et e s tr e s u l t i nt h ep r e p a r a t i o np a r t ,i td e f m e st h ea r c h i t e c t u r eo fm i p s xa n d i t s a p p l i c a t i o nb i n a r y i n t e r f a c e i nt h e p o r t i n gp a r t ,i t d e s c r i b et h e p o r t i n g o f c o m p i l e r sb a c k e n d l a s t ,i tg i v e ss o m e c o n c l u s i o n sa n d f o r e s i g h t 苏望琦:交叉编译系统的研究与实现浙江人学硕:e 学位论文2 0 0 3 年2 月 k e y w o r d s :c r o s s c o m p i l e rs y s t e m ,c r o s s c o m p i l e r , c r o s s a s s e m b l e r ,c r o s s l i n k e r , i n t e r m e d i a t el a n g u a g e ,g c c ,g a s ,g l d ,m i p s x ,r t l 垒苎丝:窒圣堡堡垂竺竺塑塞皇窒型 塑鎏盔兰堡圭兰堡丝苎! ! ! :兰! ! j _ 第一章交叉编译系统综述 后p c 时代的到来,使得人们开始越来越多地接触到一个新的概念嵌入 式产品。像手机、p d a ( 如商务通等) 均属于手持的嵌入式产品,v c d 机、机顶 盒等也属于嵌入式产品,而像车载g p s 系统、数控机床、网络冰箱等同样都采用 嵌入式系统。形式多样的数字化设备正努力把i n t e r n e t 连接到人们生活各个角 落,也就是说中国数字化设备的潜在消费者数量将以亿为单位 嵌入式应用 。嵌 入式软件是数字化产品的核心。如果说p c 机的发展带动了整个桌面软件的发展, 那么数字化产品的广泛普及必将为嵌入式软件产业的蓬勃发展提供无穷的推动 力。 但由于大多数嵌入式产品的性能局限,如存储器小,无操作系统,使得其软 件不得不借助于交叉编译器系统进行编译,并最终生成可执行代码。这也是本文 的目的:介绍基于g n uc c 的c 语言交叉编译系统的实现。 1 1 编译系统的发展背景 在本世纪4o 年代,由于冯诺伊曼在存储一程序计算机方面的先锋作用,编 写一串代码或程序已成必要,这样计算机就可以执行所需的计算。开始时,这些 程序都是用机器语言( m a c h i n el a n g u a g e ) 编写的。机器语言就是表示机器实际 操作的数字代码,例如: c 70 60 0 0 00 0 0 2 表示在i b mp c 上使用的i n t e l8 x 8 6 处理器将数字2 移至地址0 0 0 0 ( 1 6 进制) 的指 令。当然,编写这样的代码是十分费时和乏味的,这种代码形式很快就被汇编语 言( a s s e m b l y1 a n g u a g e ) 代替了。在汇编语言中,都是以符号形式给出指令和 存储地址的。例如,汇编语言指令 m o vx 2 就与前面的机器指令等价( 假设符号存储地址x 是0 0 0 0 ) 。汇编程序( a s s e m b l e r ) 将汇编语言的符号代码和存储地址翻译成与机器语言相对应的数字代码。汇编语 苦大大提高了编程的速度和准确度,人们至今仍在使用着它,在编码需要极快的 速度和极高的简洁程度时尤为如此。但是,汇编语言也有许多缺点:编写起来也 不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为 一台计算机编写的代码在应用于另一台计算机时必须完全重写。很明显,发展编 程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式 来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行 的代码。例如,前面的汇编语言代码可以写成一个简洁的与机器无关的形式 x=2 苏韭琦:交叉编译系统的研究与实现 浙江大学硕士学位论文2 0 0 3 年2 月 起初人们担心这是不可能的,或者即使可能,目标代码也会因效率不高而没有多 大用处。 在1 9 5 4 年至1 9 5 7 年期间,i b m 的j o h nb a c k u s 带领的一个研究小组对f o r t r a n 语言及其编译器的开发,使得上面的担忧不必要了。但是,由于当时处理中所涉 及到的大多数程序设计语言的翻译并不为人所掌握,所以这个项目的成功也伴随 着巨大的辛劳。 几乎与此同时,人们也在开发着第一个编译器,n o a mc h o m s k y 开始了他的自 然语言结构的研究。他的发现最终使得编译器结构异常简单,甚至还带有了一些 自动化。c h o m s k y 的研究导致了根据语言文法( g r a m m a r ,指定其结构的规则) 的 难易程度以及识别它们所需的算法来为语言分类。正如现在所称的与乔姆 斯基分类结构( c h o m s k yh i e r a r c h y ) 一样包括了文法的4 个层次:o 型、1 型、2 型和3 型文法,且其中的每一个都是其前者的专门化。2 型( 或上下文无关 文法( c o n t e x t f r e eg r a m m a r ) 被证明是程序设计语言中最有用的,而且今天它 已代表着程序设计语言结构的标准方式。分析问题( p a r s i n gp r o b l e m ,用于限 定上下文无关语言的识别的有效算法) 的研究是在6 0 年代和7 0 年代,它相当完善 地解决了这一问题,现在它已是编译理论的一个标准部分。 人们接着又深化了生成有效的目标代码的方法,这就是最初的编译器,它们 被一直使用至今。人们通常将其误称为优化技术( o p t i m i z a t i o nt e c h n i q u e ) , 但因其从未真正地得到过被优化了的目标代码而仅仅改进了它的有效性,因此实 际上应称作代码改进技术( c o d ei m p r o v e m e n tt e c h n i q u e ) 。 当分析问题变得好懂起来时,人们就在开发程序上花费了很大的功夫来研究 这一部分的编译器的自动构造。这些程序最初被称为编译程序一编译器,但更确 切地应称为分析程序生成器( p a r s e rg e n e r a t o r ) ,这是因为它们仅仅能够自动 处理编译的一部分。这些程序中最著名的是y a c c ( y e ta n o t h e r c o m p i l e r c o m p i l e r ) ,它是由s t e v ej o h n s o n 在1 9 7 5 年为u n i x 系统编写的,类似 地,有穷自动机的研究也发展了另一种称为扫描程序生成器( s c a n n e r g e n e r a t o r ) 的工具,l e x ( 与y a e c 同时,由m i k el e s k 为u n i x 系统开发的) 是这 其中的佼佼者。 编译器设计最近的发展包括:首先,编译器包括了更为复杂的算法的应用程 序,它用于推断和或简化程序中的信息;这又与更为复杂的程序设计语言( 可 允许此类分析) 的发展结合在一起。其次,编译器已越来越成为基于窗口的交互 丌发环境( i n t e r a c t i v ed e v e i o p m e n te n v i r o n m e n t ,i d e ) 的一部分,它包括了 编辑器、链接程序、调试程序以及项目管理程序。这样的i d e 的标准并没有多少, 但是已沿着这一方向对标准的窗口环境进行开发了 冯博琴 。 苏斐琦:交叉编译系统的研究与实现浙江大学硕| :学位论文2 0 0 3 年2 月 1 2 编译器的系统结构 源程序 图表1 2 - 1 编译器的系统结构图 目标代码 编译器内部包括了许多步骤或称为阶段( p h a s e ) ,它们执行不同的逻辑操 作。将这些阶段设想为编译器中一个个单独的片断是很有用的,尽管在应用中它 们是经常组合在一起的,但它们确实是作为单独的代码操作来编写的。这里只是 简要地描述一下每个阶段。 i 2 1 扫描程序 在这个阶段编译器实际阅读源程序( 通常以字符流的形式表示) 。扫描程序 执行词法分析( l e x i c a la n a l y s i s ) :它将字符序列收集到称作记号( t o k e n ) 的有意义单元中,记号同自然语言,如英语中的字词相似。因此可以认为扫描程 序执行与拼写相似的任务。 例如在下面的代码行( 它可以是c 程序的一部分) 中: b i = 3 十l 这个代码包括了12 个非空字符,但只有8 个记号: 习互西 苎薹堑:奎圣丝堡重竺塑堡垒皇窒型 塑垩叁兰堡:兰堡丝塞! ! ! ! 兰:旦 b 标识符 左括号 i 标识符 1 南括号 ;赋值 3 数字 十加号 1 数字 每一个记号均由一个或多个字符组成,在进一步处理之前它已被收集在一个 单元中。 扫描程序还可完成与识别记号一起执行的其他操作。例如,它可将标识符输 入到符号表中,将文字( 1 i t e r a l ) 输入到文字表中( 文字包括诸如3 1 4 1 5 9 6 5 3 5 的数字常量,以及诸如“h e l l o ,w o r l d ! ”的引用字符串) 。 1 2 2 语法分析程序 语法分析程序从扫描程序中获取记号形式的源代码,并完成定义程序结构的 语法分析( s y n t a xa n a l y s i s ) ,这与自然语言中句子的语法分析类似。语法分 析定义了程序的结构元素及其关系。通常将语法分析的结果表示为分析树( p a r s e t r e e ) 或语法树( s y n t a xt r e e ) 。 例如,还是那行c 代码,它表示一个称为表达式的结构元素,该表达式是一 个由左边为下标表达式、右边为整型表达式的赋值表达式组成。这个结构可按下 面的形式表示为一个分析树: 仆 e x p r e s s i o n 2 e x p r e s s i o n lf 乡个 e x p r e s s l o nl d e n t i f i e r e x p r e s s l o nj i n d e n t i f i e r 户 e x p r e s s i o i i + e x p r e s s i o n f n u m b e rn u m b e r 3l 图表1 2 - 2 表达式分析树 4 堑苎堑:奎圣叁丝至竺塑些窒皇塞翌 塑兰奎兰堡差丝丝兰:! ! ! 兰! 旦 请注意,分析树的内部节点均由其表示的结构名标示出,而分析树的叶子则 表示输入中的记号序列( 结构名以不同字体表示以示与记号的区别) 。 分析树对于显示程序的语法或程序元素很有帮助,但是对于表示该结构却显 得力不从心了。分析程序更趋向于生成语法树,语法树是分析树中所含信息的浓 缩( 有时因为语法树表示从分析树中的进一步抽取,所以也被称为抽象的语法树 ( a b s t l ,a c ts y n t a xt r e e ) 。下面是一个c 赋值语句的抽象语法树的例子: s u b s c r i p t e x p r e s s i o na d d i t i r e e x p r e s s i o n i d e n t i f i e ri d e n t i f i e r n u m b e rn u m b e r bi 3 1 图表12 3 赋值表达式抽象语法树 请注意,在语法树中,许多节点( 包括记号节点在内) 已经消失。例如,如 果知道表达式是一个下标运算,则不再需要用括号“ ”和“ ”来表示该操作是 在原始输入中。 1 2 3 语义分析程序 程序的语义就是它的“意思”,它与语法或结构不同。程序的语义确定程序 的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示 和由分析程序分析的特征。这些特征被称作静态语义( s t a t i cs e m a n t i c ) ,而 语义分析程序的任务就是分析这样的语义( 程序的“动态”语义具有只有在程序 执行时才能确定的特性,由于编译器不能执行程序,所以它不能由编译器来确 定) 。一般的程序设计语言的典型静态语义包括声明和类型检查。由语义分析程 序计算的额外信息( 诸如数据类型) 被称为属性( a t t r i b u t e ) ,它们通常是作 为注释或“装饰”增加到树中( 还可将属性添加到符号表中) 。 在f 运行的c 表达式 b i = 3 + 1 中,该行分析之前收集的典型类型信息可能是:b 是一个整型值的数组,它带有 来自整型子范围的下标;i 则是一个整型变量。接着,语义分析程序将用所有的 子表达式类型来标注语法树,并检查赋值是否使这些类型有意义了,如若没有, 则声明一个类型匹配错误。在上例中,所有的类型均有意义,有关语法树的语义 分析结果可用以下注释了的树来表示: 苏斐琦;交叉编译系统的研究与实现 浙江大学硕士学位论文2 0 0 3 年2 月 一 s u b s c r i p t e x p r e s s i o n a d d it i v e e x p r e s s i o n i n t e g e r i n t e g e r 入入 i d e n t i f i e ri d e n t i f i e r n u m b e rn u m b e r b i31 a r r a yo fi n t e g e ri n t e g e ri n t e g e ri n t e g e r 图表1 2 - 4 赋值表达式带属性的语法树 1 2 4 源代码优化程序 编译器通常包括许多代码改进或优化步骤。绝大多数最早的优化步骤是在语 义分析之后完成的,而此时代码改进可能只依赖于源代码。这种可能性是通过将 这一操作提供为编译过程中的单独阶段指出的。每个编译器不论在已完成的优化 种类方面还是在优化阶段的定位中都有很大的差异。 在上例中,我们包括了一个源代码层次的优化机会,也就是:表达式3 + 1 可由编译器计算先得到结果4 ( 这种优化称为常量合并( c o n s t a n tf o l d i n g ) ) 。 当然,还会有更复杂的情况。还是在上例中,通过将根节点右面的子树合并为它 的常量值,这个优化就可以直接在( 注释) 语法树上完成: s u b s e r i p t e x p r e s s i o nn u m b e r 如t e g e r4 i d e n t i f i e r b a r r h yo fi n t e g e r i d e n t i f i e r j 月t e g e r 图表12 - 5 优化后的语法树 尽管许多优化可以直接在树上完成,但是在很多情况下,优化接近于汇编代 码线性化形式的树更为简便。这样节点的变形有许多,但是三元式代码 ( t h r e e a d d r e s sc o d e ) ( 之所以这样称呼是因为它在存储器中包含了3 个( 或3 个以上) 位置的地址) 却是标准选择。另一个常见的选择是p 一代码( p c o d e ) , 它常用于p a s c a l 编译器中。 苏斐琦:交叉编译系统的研究与实现 浙江大学硕士学位论文2 0 0 3 年2 月 在前面的例子中,原先的c 表达式的三元式代码应是: t=3+1 bf i = t ( 请注意,这里利用了一个额外的临时变量t 存放加法的中间值) 。这样,优化 程序就将这个代码改进为两步。首先计算加法的结果: t=4 b ( i 】= t 接着,将t 替换为该值以得到三元语句 bf i = 4 图表1 2 - 6 已经指出源代码优化程序可能通过将其输出称为中间代码 ( i n t e r m e d i a t ec o d e ) 来使用三元式代码。中间代码一直是指一种位于源代码 和目标代码( 例如三元式代码或类似的线性表示) 之间的代码表示形式。但是, 我们可以更概括地认为它是编译器使用的源代码的任何一个内部表示。此时,也 可将语法树称作中间代码,源代码优化程序则确实能继续在其输出中使用这个表 示。有时,这个中间代码也称作中间表示( i n t e r m e d i a t er e p r e s e n t a t i o n ,i r ) r e d d r a g o n8 6 。 1 2 5 代码生成器 代码生成器得到中间代码( i r ) ,并生成目标机器的代码。正是在编译的这 个阶段中,目标机器的特性成为了主要因素。当它存在于目标机器时,使用指令 不仅是必须的而且数据的形式表示也起着重要的作用。例如,整型数据类型的变 量和浮点数据类型的变量在存储器中所占的字节数或字数也很重要。 在上面的示例中,现在必须决定怎样存储整型数来为数组索引生成代码。例 如,下面是所给表达式的一个可能的样本代码序列( 在假设的汇编语言中) : m o vr 0 ,i ;v a l u eo fi 一 r 0 m u lr 0 ,2 ;d o u b l ev a l u ei n r o m o vr 1 。b;a d d r e s so fb 一 r 1 a d dr 1 ,r 0,a d dr ot or 1 m o v + r 1 ,4,jc o n s t a n t4 一 a d d r e s si n r 1 在以上代码中,为编址模式使用了一个类似c 的协定,因此b 是b 的地址( 也 就是数组的基地址) ,* r 1 则意味着间接寄存器地址( 因此最后一条指令将值4 存放在r 1 包含的地址中) 。这个代码还假设机器执行字节编址,并且整型数占据 存储器的两个字节( 所以在第2 条指令中用2 作为乘数) 。 1 2 6 目标代码优化程序 在这个阶段中,编译器尝试着改进由代码生成器生成的目标代码。这种改进 包括选择编址模式以提高性能、将速度慢的指令更换成速度快的,以及删除多余 的操作。 堑苎至:查圣丝丝重竺竺墼室皇塞堡 堑三当兰堡尘兰堡丝兰! ! ! :王! 星 在上面给出的样本目标代码中,还可以做许多更改:在第2 条指令中,利用 移位指令替代乘法( 通常地,乘法很费时间) ,还可以使用更有效的编址模式( 例 如用索引地址来执行数组存储) 。使用了这两种优化后,目标代码就变成: 编译器在其结构细节上确实差别很大,然而,上面讲到的阶段总会出现在几 乎所有的编译器的某个形式上。 1 3 编译器的自举与移植 在编译器构造过程中涉及到的另一个语言:编写编译器本身使用的语言。为 了使编译器能立即执行,这个执行( 或宿主( h0st ) ) 语言只能是机器语言。当 时并没有编译器,因此这确实是最初的编译器编写所用的语言。现在更为合理的 方法是用另一种语言来编写编译器,而使用该种语言的编译器早已存在了 冯傅 琴 。如果现存的编译器已经在目标机器上运行了,则只需利用现存的编译器编 译出新的编译器以得到可运行的程序: 图表1 3 - 1 用现有编译器编译产生新的编译器 当语言b 的现存编译器没有运行在目标机器上时,情况会更复杂一些。编 译将产生一个交叉编译器( c r o s sc o m p i l e r ) ,也就是一个为不同于它在运行之上 的机器生成目标代码的编译器。这种以及其他更为复杂的情况最好通过将编译器 画成一个t 型图( t d i a g r a m ) 来描述。用语言t ( 代表宿主语言) 编写的编译 器将语言a ( 代表源语言) 翻译为语言b ( 代表目标语言) 可画成以下的t 型图: 图表13 - 2 编译器t 型图 请注意,这与表示编译器是在“机器”t 上运行是等价的( 如果t 不是机 器代码,则可认为其是一个假定机器的可执行代码) 。我们一般都希望t 与b 相同( 也就是编译器为与之运行之上一样的机器生成代码) ,但是也并不是必须 这样做。可以用两种方法组合t 型图。 一种是,如果在一台机器t 上运行有两个编译器,其中一个编译器将语言a 苏韭琦:交叉编译系统的研究与实现浙江大学硕士学位论文2 0 0 3 年2 月 翻译为语言b ,另一个将语言b 翻译为语言c ,就可按照将第1 个的输出作为第 2 个的输入来组合。其所得结果就是一个在机器t 上的由a 到c 的编译。将该 过程表示为: 而一曰 图表1 3 - 3t 型图的组合方式一 另一种是,利用由“机器”t l 到“机器”t 2 的编译器来产生在t 2 上运行的 由a 到b 的编译器的执行语言。表示如下: 图表1 3 - 4 t 型图的组合方式二 在上面的描述中,第1 个假定是,在机器t 1 上利用语言t 1 现存的编译器将 语言a 翻译为语言b 。第2 个假定是,当语言t 1 的编译器运行在另一台机器上 时,就会引出语言a 的交叉编译器。 以将要编译的相同语言编写一个编译器是很普通的: 图表1 3 5 用与要编译的语言编写的编译器丁型图 但这将表现为一个循环错误:因为如果源语言的编译器不存在,那么编译器 本身也就不可能被编译了。从这个方法中可以得到很重要的启示。 让我们设想一个问题:如何解决循环。我们可以在汇编语言中编写一个“虽 快但不佳”的编译器,并翻译那些在编译器中真正使用得到的语言特征( 当然, 在编写“较好的”编译器时,会对使用那些特征有所限制) 。这些“虽快但不佳” 的编译器也可能产生极为无效的代码( 它仅需要正确而已! ) 。一旦运行这个“虽 快但不佳”的编译器,就可用它来编译那个“较好的”编译器。接着,对“较好 的”编译器进行重编译以得到最终的版本。人们将这个过程称为自举 ( b o o t s t r a p p i n g ) 。下图描述了这一过程。 苏韭琦:交叉编译系统的研究与实现浙江大学硕士学位论文2 0 0 3 年2 月 用语言a 编写一h j - a - :b , 用b 的机器语言编写的“虽快但不佳”的编译器 用语言a 编 b l 从a ) 得到的,正在运行但效率不高的编译器 b ) b 机器上a 语言的编译器的最终版本 图表13 - 6 编译器的自举过程 自举之后,在源代码和执行代码中就有了一个编译器。这样做的好处在于:通过 应用与前面相同的两步过程,编译器的源代码的任何改进都会立即被自举到一个 正在工作着的编译器中。 目标机重定位为 目标机重定位为t 2 原始编译器 从a ) 得到的交叉编译器 一雯 。 t 2 i b ) 新目标机上的编译器 图表1 3 - 7 编译器的移植过程 除此之外,还有一个好处。现在将编译器移植到一个新的主机,只要求重写 源代码的后端来生成新机器的代码。接着用旧的编译器来编译它以生成一个交叉 编译器,该编译器又再次被交叉编译器重新编译,以得到新机器的工作版本。上 图描述了这一过程。 l0 苏韭琦:交叉编译系统的研究与实现 浙江大学硕士学位论文2 0 0 3 年2 月 1 4 交叉编译系统简介 交叉编译系统是运行在主机平台上,为另一个不同的目标机平台生成可执行 代码的特殊的编译系统 p o r t i n g0 0 。而一般的编译器系统,其运行的主机平台 和生成的可执行代码的运行平台是相同的,即它的主机平台和目标机平台是一致 的。这就是交叉编译系统和一般编译系统的差别。需要注意的是,所谓的平台, 实际上包含两个概念;体系结构( a r c h i t e c t u r e ) 和操作系统( o p e r a t i n g s y s t e m ) 。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也 可以在不同的体系结构上运行。例如,x 8 6l i n u x 平台实际上是i n t e lx 8 6 体系 结构和l i n u xf o rx 8 6 操作系统的统称;而x 8 6w i n n t 平台实际上是i n t e lx 8 6 体系结构和w i n d o w sn tf o rx 8 6 操作系统的简称 s t a l9 2 。 一个经常会被问到的问题就是:“既然我们已经有了主机编译系统,那为什 么还要交叉编译系统呢? ”这是因为有些目标机平台上不允许或不能够安装所 需要的编译系统,即不可能在目标机平台上安装一般的编译系统。例如在某些存 储空间很有限的嵌入式设备上,通常的嵌入式设备只有几兆最多几十兆的存储空 间。有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是 因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。因 此,对于这些嵌入式平台,要得到应用程序的可执行文件,只有借助运行与其他 资源相对丰富的主机平台上的交叉编译器实现。 另一个经常会被问到的问题就是:“既然可以交叉编译,那还要主机编译干 吗? ”其实答案也很简单,交叉编译是不得已而为之。与主机编译相比,交叉编 译受的限制更多,虽然在理论上可以做任何形式的交叉编译,但事实上,由于受 到专利、版权、技术的限制,并不总是能够进行交叉编译,尤其是在业余条件下。 举例来说,我们至今无法生成惠普公司专有的s o i i i 格式的可执行文件,因此我们 根本无法做目的平台为h p p a h p u x 的交叉编译。 就该项目而言,需要交叉编译的原因主要是:目的平台上资源的限制,即没 有足够的存储空间,也没有操作系统,只能利用交叉编译在主机平台上编译产生 目标机平台所需的可执行程序。 1 4 1 交叉编译系统z l t c g 开发背景 随着微处理器技术的飞速发展,处理器性能的发挥在很大程度上取决于编译 器的质量。编译能否正常运行,编译效率高不高,关系到处理器的性能能否充分 发挥,对于计算机性能是至关重要的。现代处理器越来越复杂,基本指令集也越 柬越庞大,正因如此,编译器在计算机技术中的地位也在不断提高。 而另一方面,随着微处理器性能的提高,3 2 位芯片中能够执行上百万行c 代码构成的复杂程序,使得嵌入式设备高度智能化。这使得嵌入式软件的实现从 苏斐琦:交叉编译系统的研究与实现浙江大学硕士学位论文2 0 0 3 年2 月 某种意义上说决定了产品的功能,已成为新产品成功与否的关键因素。作为开发 嵌入式软件的主要工具之一,交叉编译系统,其重要性也在日益凸现。不论从硬 件还是软件的角度看,一套完整的交叉编译系统在很大程度上决定这嵌入式系统 的成功与否。而交叉编译系统的不可替代性主要表现在如下两个方面。 一方面,嵌入式软件的实际运行性能,在很大程度上收到编译系统性能的约 束。一个好的编译系统不但能实现各种方式的代码优化,提高代码的运行效率和 空间利用率,还能为开发人员提供详细明确的调试信息,加快嵌入式软件的开发 进度,降低开发成本。而另一方面,由于嵌入式系统资源有限,一般不提供编译、 连接并很难提供高级调试功能,所以嵌入式操作系统和应用软件通常是在另外的 开发平台上开发,这种开发平台由通用的计算机系统和专用的嵌入式软件开发环 境组成,嵌入式软件开发环境一般包括交叉编译器,调试器,优化器,下装程序 等等,也就是一套完整的交叉编译系统。 在这个背景下,开发拥有自主产权的交叉编译系统,对于我们国家的民族 i t 工业来讲,将有十分重要的战略意义。我们应该抓住机遇,组织力量,重点 出击,取得主动权。因此,浙江大学计算机学院和台湾某i t 业知名公司合作开 发了拥有自主产权的交叉编译系统z l t c g 。 1 4 2 交叉编译系统z l t c g 简介 z l t c g 是通过移植开发源代码的交叉编译器g c c 实现的。它是以c 为输入语 言,以1 3 8 6 一l i n u x 为主机运行系统,以m i p s x 为目标系统的完整的交叉编译器 系统。基于g c c 的交叉编译系统z l t c g 的产生过程如下图: i 3 8 6 上已有的 g c c 编译器 乏 图表14 - 1 基于g c c 的交叉编译系统z l t c g 的产生过程 作为一个完整的交叉编译系统,z l t c g 包含了如下3 个主要部分,其结构图 见下图: 1 ) 交叉编译器 2 ) 交叉汇编器 3 ) 交叉链接器 l2 堑苎堑:奎圣丝堡重竺竺竺壅= :i :塞翌 塑堡查兰堡:兰堡丝圣! ! ! ! 篓! 旦 图表14 _ 2 交叉编译系统z l t c g 系统结构 编译系统是非常复杂的软件1 ,因此很容易陷入错误和不足中。考虑到编写 编译器所花费的人力物力,很多公司都会放弃独立编写。而源代码开放的编译器 使得错误可以最大限度地减少。作为惯例,一个新的编译系统并不意味着要从头 重写,换句话说,借鉴已有系统是一个捷径。z l t c 6 直接以编译器g n uc c3 0 2 为基础,实现了目标机为m i p s x 的交叉编译器。并以g n ub i n u t i l s2 1 i 2 的汇 编器g a s 和链接器g l d 为基础,实现了目标机为m i p s x 的交叉汇编器和交叉链接 器。 由于交叉汇编器和交叉链接器由组内其他同学负责,因此,本论文只以交叉 编译器的实现为重点,对其他两个部分只作简单介绍。 n :g c c 中单为编译c 语言编写的c 代码就有3 0 万到4 0 万行,这些代码量由根据目标描述自动产生 的代码量觉得。 第二章编译器g o b 分析 g c c 是一个用c 语言实现的可移植编译系统。高度的优化和可移植性能是该 编译系统最为突出的两大特点,也是其技术上最为成功和精彩之处。由于优化和 可移植性是衡量现代编译系统的主要标准,加之g c c 的高稳定和免费提供等优 点,使许多专门从事c 编译器开发的公司难能与之对抗。g n u 声称“要让世界上 所有搞编译器的人没有事情可做”。 g n uc 完全兼容于a n s i c 。它除了保持c 语言家族的简洁、高效及灵活之外, 增加了许多新的语言特征,其中某些特征是从p a s c a l 、c 十十及a d a 语言中吸 收来的,这使得该语言的描述功能更为丰富和更易于编写高效的程序 s t a l9 2 。 g c c 是一个用c 语言实现的优化可移植编译系统,g c c1 3 7 的性能已十分稳定, g c c2 3 3 增加了对r i s c 结构的支持。目前它已成功地移植到诸如i 3 8 6 、i 8 6 0 、 v a x 、m i p s 、5 p a r c 及a l p h a 等系列的几十种不同的计算机平台上,并且其性能 较同级的商业软件产品更为稳定和可靠。性能的优化和可移植性使得该产品越来 越受到人们的青睐。 2 1g c c 的设计思想 g c c 的主要目标是为各种机器构造一个优化的编译器,而把g c c 本身的简洁 性放在优化第二位。运行6 c c 的机器必须具有3 2 位字长,字节寻址能力和若干 通用寄存器。 串型语言的编译技术已经基本成熟,但是,要达到像g c c 这样的高度优化性 能和能够被移植到几十种平台上的高度可移植性能,没有新颖的设计思想和独特 的技术方法是很难实现的。在传统编译技术中,可移植性主要体现在汇编代码生 成阶段,为了提高可移植性能而不能进行与机器相关的优化。因此,传统的编译 技术是牺牲优化性能换取可移植性能的。为此,g c c 的设计师们将解决这一矛盾 贯彻在整个设计思想之中,并体现于编译的各个阶段。其设计思想的核心包括三 个方面: 1 ) r t l 中间代码表示机制 2 ) 目标机描述与定义机制 3 ) 由目标机的机器描述引导中间代码生成及优化策略 首先,中间语言的使用是编译器实现代码优化和高度可移植的关键技术。g c c 从不同系统结构的机器语言中抽象出共性
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 餐饮业员工合同示范文本
- 三年级数学周长教学设计与反思
- 幼儿园小班活动周计划及评估标准
- 车间设备维护保养记录表及流程规范
- 智能工程投标文档制作指导
- 企业信息安全管理体系标准
- XX水浸探测施工合同
- 美业门店股权退股协议模板
- 特岗教师教学能力提升方案
- 幼儿消防安全课堂教学教案合集
- 医学伦理与职业操守
- 华为体验店开业方案
- 《风力发电技术概论》课件
- 城市设计实践类型 城市设计实践教程电子书
- 电气设备空载试运行及负荷试运行记录
- 全等三角形-倍长中线法
- 心肺复苏与电除颤指南课件
- GB/T 9162-2001关节轴承推力关节轴承
- 建筑机电安装工程标准化施工做法图集课件
- DB4401-T 6-2018园林绿地养护技术规范-(高清现行)
- 可下载打印的公司章程
评论
0/150
提交评论