如何理解指令集体系结构(ISA)的兼容性?x86/ARM/MIPS
本周计组作业是一个开放性问题:如何理解ISA的兼容性?于是思考了很多,发现哦原来这半个学期其实在学的是这个呀,查了资料发现并没找到太多有关ISA兼容性的资料,于是自己整理了一些自己的理解+查到的资料,不保证是对的,仅做一个记录和分享。如果有什么不对的地方,请在评论区讨论,真的还不太明白,求指教。
参考:https://baike.so.com/doc/6448046-6661728.html
《计算机组成与设计 硬件/软件接口》原书第五版 机械工业出版社
1.什么是ISA?
2.什么是兼容性?
3.为什么ISA设计需要考虑兼容性?
4.如何实现ISA的兼容性设计?
一.什么是ISA?
指令集是计算机中全部指令的集合。指令集体系结构是用来将逻辑上的指令(汇编语言级别)转换为计算机CPU硬件信号的一系列体系化规则的集合。
你把ISA可以理解为CPU设计的不同模式,不同的模式由不同的组织开发,分为两种类型:复杂指令集CISC、精简指令集RISC:
(1)复杂指令集采用变长的编码方式,语句的长度不固定,数据寻址模式较多,经典的例子有ARM v7版本,以及由Intel开发的x86系列。
(2)精简指令集采用定长的编码方式,语句的长度固定,数据寻址模式较少,经典的例子有MIPS,以及更新后的ARM v8版本。
二.什么是兼容性?
兼容性(compatibility)是指硬件之间、软件之间或是软硬件组合系统之间的相互协调工作的程度。兼容的概念比较广,相对于硬件来说,几种不同的电脑部件,如CPU、主板、显示卡等,如果在工作时能够相互配合、稳定地工作,就说它们之间的兼容性比较好,反之就是兼容性不好。
1.向上兼容
在较低档计算机上编写的程序,可以在同一系列的较高档计算机上运行,或者在某一平台的较低版本环境中编写的程序可以在较高版本的环境中运行,都称为向上兼容,前者是硬件兼容,而后者是软件兼容,例如,基于Intel386的PC兼容机上所有的软件也可以运行在486或更高的机型上。向上兼容具有非常重要的意义,一些大型软件的开发,工作量极大,如这些软件都能做到兼容,则无需在其它机器上重新开发,就可节省庞大的人力和物力。
2.向下兼容
向下兼容(downward compatibility),又称向后兼容(backward compatibility)、回溯兼容,在计算机中指在一个程序和/或库更新到较新版本后,用旧版本程序创建的文档或系统仍能被正常操作或使用(包括写入),或在旧版本库的基础上开发的程序仍能正常编译运行的情况。
在文件系统中,ext4文件系统的设计就是向后兼容的,ext3的文件系统可以被当作ext4文件系统挂载。通常更新一个软件时,应该为向下兼容性做出一定的考虑,这往往能给用户带来方便并更好地留住用户。Microsoft特别强调维持软件的向下兼容性。为了实现此一目标,有时微软甚至不惜支持使用了非官方乃至误用的 API 的软件。但情况并不总是这样,有时为了考虑向下兼容会带来一些累赘,尤其是进行过较多升级后。Python3.0 便是放弃向下兼容的一个例子。
如果一个软件的旧的版本保存的文档不能被新版本读取,即使厂商提供了额外工具对旧文档进行不可逆转的转换,这也不能称作向下兼容。这可能是软件厂商的一种市场战略,强迫用户购买升级软件,随着升级用户逐渐增加,逐渐地使得旧软件能读取的文档越来越少。
对于软件来说,向下兼容的意思是,较高版本的程序能顺利处理较低版本程序的数据。拿著名的动画制作软件 Flash 的两个版本 Flash 5 与 Flash MX 2004 来说,这两个版本虽然保存出来的文件都是 .fla,可是文件内容的结构有所不同。尽管如此,Flash MX 2004 仍然能处理 Flash 5 保存的 fla 文件,我们就说 Flash MX 2004 是向下兼容的。 另外一个常见的例子也可以帮助我们理解向下兼容的概念,Microsoft的Office 2007可以打开Office 2003的文件,反之却不可以,因此说Office这个软件是向下兼容的。 事实上,多数的计算机软件都是向下兼容的。但是必须说明的一点是,由于考虑实际应用,不一定所有版本高的软件都能接受版本低的软件输出的东西,例如假设有一种软件X,并假设已经有10.0 版本了,那么版本旧得已经没有什么人用的X Version 1.0 所输出的文件,就不太可能在10.0 版本中顺利读取。
参考:https://baike.so.com/doc/6448046-6661728.html
三.为什么ISA设计需要考虑兼容性?
以x86的开发为例,它是由一些相互独立的小组开发的,并且它被持续改进了超过35年,不断在原来指令集的基础上增加新的特性,这就好像有人往包装好的包里添加衣服,需要前后的开发互不矛盾,于是后续开发的指令集需要向下兼容全部已存在的版本。
兼容性在软件开发是实际应用中具有很重要的意义,一旦代码写好,下一个危险将是它会变成一个流行的程序。这种程序存在的时间总是比预期要长,意味着程序员每隔几年就需要更新一下代码,使新的版本可以运行在新的操作系统和新机器上。不同的ISA之间,虽然使用不同的汇编语言和规则,但是如果使用具有兼容性的高级语言(而非汇编语言)来编写程序,将会提高新旧版本交替的效率,减少工作量。(存疑)
以下将列举出x86开发的历史过程,从中你可以体会到兼容性这个“金手铐”对x86的影响,体系结构的改变不允许对已有的软件产生任何的危害。
事实上,在向后的二进制兼容是神圣不可侵犯的同时,x86指令集快速发展。在35年中,平均每个月至少增加一条新的指令。
四.如何实现ISA的兼容型设计?(存疑)
1.使用所有计算机上都有的标准指令。
2.在原本ISA的基础上添加指令。
3.设计原则