开源鸿蒙内核源码分析系列 | 指令集 | CICS PK RICS

开源鸿蒙内核源码分析系列 | 指令集 | CICS PK RICS

指令集

在计算机中,指示计算机硬件执行某种运算、处理功能的命令称为指令,它是计算机运行的最小的功能单位,而硬件的作用是完成每条指令规定的功能。

每一种处理器都有自己可以识别的一整套指令,称为指令集,它是硬件和软件之间沟通的桥梁。是处理器提供给软件控制它的语言,处理器执行指令时,根据不同的指令采取不同的动作,完成不同的功能,既可以改变自己内部的工作状态,也能控制其它外围电路的工作状态。按CPU的设计理念,将软硬件沟通方式分成复杂指令集(CISC)和精简指令集(RISC) ,不同的时期流行不同的方式,取决于当时的沟通成本/性价比。

早期的CPU全部是CISC架构,受限于软件和编译器技术不发达,设计方向是要用最少的机器语言指令来完成所需的计算任务,需更多的从硬件角度去考虑CPU的设计,能用硬件完成的就尽量不用软件去做。其结果导致硬件较复杂,功耗大,成本高。

后期因软件和编译器技术快速崛起,相比于硬件呈指数级的增长,原来的指令集架构就不再适用新时代,RISC的优势就凸显出来,设计方向是降低硬件的大小,减少处理器的功耗,从而硬件成本低廉,省电价格又便宜自然就占据了市场的主导权,尤其在嵌入式领域这种优势就更加的明显。

对比项CISC(复杂指令集)RISC(精简指令集)
Complex Instruction Set ComputerReduced Instruction Set Computer
目的增强原有指令的功能,设置更为复杂的新指令实现软件功能的硬化减少指令种类和简化指令功能,提高指令的执行速度
指令系统复杂、庞大简单、精简
指令数目一般大于200条一般小于100条
指令字长不固定固定
可访存指令不加限制只有 LOAD/STORE指令
各指令的执行时长指令间执行时长差距很大绝大多数在1个周期内完成
各种指令的使用频度指令间频度差距很大(二八原则)指令都比较常用
通用寄存器数量较少
中断机器是在一条指令执行结束后响应中断机器在一条指令执行的适当地方可响应中断
单元电路(功耗)包含有丰富的电路单元,因而功能强、面积大、功耗大包含有较少的单元电路,因而面积小、功耗低
目标代码的执行效率难以用优化编译生成高效的目标代码程序采用优化的编译程序,生成代码相对较为高效
控制方式绝大多数为微程序控制绝大多数为组合逻辑控制
指令流水线可以通过一定方式实现必须实现
微处理器的设计周期微处理器结构复杂,设计周期长微处理器结构简单,布局紧凑,设计周期短,且易于采用最新技术
适用场景适用于【通用型机器】;功能强大,易于/利于实现、处理特殊功能,因有专用指令来完成特定功能适用于【专用型机器】,因RISC指令系统的确定与特定的应用领域有关;指令规整,性能容易把握,易学易用
被应用的指令集(架构)X86指令集(架构)MIPS、ARM、RISC-V、Power-PC[IBM]、SPARC、AArch64(基于ARMv8架构的、分离出来的64位的执行状态) 指令集(架构)

x86

x86泛指一系列基于Intel 8086且向后兼容的中央处理器指令集架构。最早的8086处理器于1978年由Intel推出,为16位微处理器。由于以86作为结尾(但不知为何以86数字结尾),因此其架构被称为x86。

1985年,英特尔发布第三代32位CPU架构,但由于数字并不能作为注册商标,英特尔将其称为IA-32,全名为“Intel Architecture, 32-bit”。同时 CPU 型号到了 intel 80386,所以也称为i386,叫法一直延续至今,现在说的 x86 = i386 = IA-32 指代32位的架构。

2001年,英特尔原本已经决定在64位时代推出新的架构IA-64技术的Itanium处理器产品线来接替取代x86,但它与x86的软件天生不兼容,因此想了各种办法来运行x86的软件,但结果效率十分低下,加之处理器本身和软件移植的成本难以控制,因此这个项目最终告吹。

2003年,英特尔的竞争对手AMD公司自行把32位x86(或称为IA-32)拓展为64位,并命名为x86-64或Hammer架构,而后更名为AMD64架构,将架构打上了自己的Flag,由于AMD64处理器产品线首先进入市场,微软先推出了基于AMD64的操作系统版本。就不愿意为英特尔IA-64再开发另一个64位版本,英代尔被迫采纳AMD64架构且增加某些新的扩展到他们自己的产品,显然他们不想承认这些指令集是来自它的主要对手,便命名为EM64T架构,后正式更名为Intel 64 也叫x64。

所以在PC机时代,你会很容易看到 x86, x86_64, x64 ,i386 ,IA32, IA64, amd64这些玩意,大概知道表示什么,但很烦就不能简单点吗 ? 其背后是硬件公司竞争对手之间,软硬件公司之间激烈的PK,这样的案例比比皆是,屡见不鲜。

MIPS

MIPS(Microprocessor without Interlocked Pipeline Stages),是一种采取精简指令集(RISC)的指令集架构(ISA),由美国MIPS计算机系统公司开发,现为美普思科技。作为RISC冲击CISC的领军人物之一,1981年,斯坦福大学的Hennessy带领团队研发出第一个MIPS架构处理器,这个至今被视为教科书一般的顶级指令集架构自此现世。MIPS广泛被使用在许多电子产品、网络设备、个人娱乐设备与商业设备上。最早的MIPS架构是32位,最新的版本已经变成64位。商业市场主要竞争对手为ARM与RISC-V。

在一些大学和技术学校中计算机架构的课程上,学生们通常会学习MIPS架构。MIPS指令集被认为是RISC体系中最优雅的一种,这个架构极大地影响了后来的精简指令集架构,DEC的Alpha和惠普的Precision都深受其影响。

早期的MIPS公司发展迅速,始终立于RISC技术的潮头。公司成立次年,MIPS Release 1指令集即问世。1986年,几乎与ARM首款正式商用处理器ARM 2出现的同时,MIPS推出商用处理器R2000。至1988年,MIPS首款在市场上流行起来的产品R3000处理器横空出世。这款处理器销量迅速超过百万颗,不少公司的消费电子产品都用到了R3000,如索尼的PS、思科的路由器和SGI超级计算机等。美国首家电脑公司DEC、爱普生、日本电器等知名企业也都是MIPS的客户。其后续推出的R3000A更是创造了销量过亿的记录。

32位RISC芯片产品的成功促进了利用商品化部件生产超级计算机的进程,同时也启示业界以更高级的RISC技术迈向超级计算的顶峰,处理器架构掀起由32位向64位发展的浪潮。1991年,MIPS推出第一款64位商用微处理器R4000。次年底,同时代另一RISC架构Alpha问世,全面完成了从32位过渡到64位技术各项任务。自此,在MIPS R4000和Alpha 21064处理器引领下,64位技术应用时代到来。

1996年,MIPS推出R10000处理器,作为RISC阵营的旗舰之一,该处理器投放市场时被认为是世界上最快的CPU。彼时,已在CISC阵营中拔得头筹的英特尔产品与之相比都有所不如。MIPS产品性能强势若此。根据MIPS科技公司的统计,1997年以MIPS架构为基础的CPU出货量为4800万,占RISC CPU总市场份额的49%。

更重要的是,MIPS自成立之初便面向中高端市场,专注产品性能。当移动时代萌芽时,MIPS在功耗上没有太多优势,也未着力打造自己的移动处理器“朋友圈”,不得不在PC向移动进发的时代洪流中进退维谷。

MIPS授权分为处理器核授权和架构授权两类,MIPS的定价策略是核授权很贵,而架构授权很便宜。同时,MIPS的架构授权,并不限制任何对MIPS架构的更改。这种模式由于允许自行扩充指令,造成了生态碎片化。因为缺乏统一的生态。命运多舛,MIPS被转卖多次、很多相关专利已经被卖掉了、碎片化问题非常严重。2021年3月,MIPS宣布MIPS架构的开发已经结束,因为该公司正在向RISC-V 过渡。

ARM

ARM架构,过去称作高级精简指令集机器(Advanced RISC Machine),是一个精简指令集(RISC)处理器架构家族,其广泛地使用在许多嵌入式系统设计。由于节能的特点,其在其他领域上也有很多作为。ARM处理器非常适用于移动通信领域,符合其主要设计目标为低成本、高性能、低耗电的特性。

ARM架构版本从ARMv3到ARMv7支持32位空间和32位算数运算,大部分架构的指令为定长32位(Thumb)指令集支持变长的指令集,提供对32位和16位指令集的支持),而2011年发布的ARMv8-A架构添加了对64位空间和64位算术运算的支持,同时也更新了32位定长指令集。ARM处理器内核列表如下:

指令集架构处理器家族
ARMv1ARM1
ARMv2ARM2、ARM3
ARMv3ARM6、ARM7
ARMv4StrongARM、ARM7TDMI、ARM9TDMI
ARMv5ARM7EJ、ARM9E、ARM10E、XScale
ARMv6ARM11、ARM Cortex-M
ARMv7ARM Cortex-A、ARM Cortex-M、ARM Cortex-R
ARMv8Cortex-A35、Cortex-A50系列、Cortex-A70系列、Cortex-X1
ARMv9Cortex-A510、Cortex-A710、Cortex-A715、Cortex-X2、Cortex-X3、ARM Neoverse N2

最著名的是 ARMv7指令集 支持两种指令集,ARM 指令集和 Thumb 指令集,从功耗上来说,thumb 指令集的功耗要低于 ARM 指令集。

至2009年为止,ARM架构处理器占市面上所有32位嵌入式RISC处理器90%的比例,使它成为占全世界最多数的32位架构之一。ARM处理器可以在很多消费性电子产品上看到,从便携式设备(PDA、移动电话、多媒体播放器、掌上型电子游戏和电脑)到电脑外设(硬盘、桌面型路由器),甚至在导弹的弹载电脑等军用设施中都有他的存在。

ARM公司的商业模式: IP(Intellectual Property,知识产权)授权模式(ARM架构授权、IP核授权、使用级授权);

主要业务范围: ARM指令集、ARM微架构、ARM芯片(不自己造)

RISC-V

RISC-V(发音为“risk-five”)号称芯片设计领域的 Linux,是一个基于精简指令集(RISC)原则的开源指令集架构(ISA),目标是成为一个通用的指令集架构(ISA),RISC-V的不同寻常不仅在于它是一个最近诞生的指令集架构(它诞生于最近十年,而大多数其他指令集都诞生于20世纪70到80年代),而且在于它是一个开源的指令集架构。与几乎所有的旧架构不同,它的未来不受任何单一公司的浮沉或一时兴起的决定的影响(这一点让许多过去的指令集架构都遭了殃)。它属于一个开放的,非营利性质的基金会。RISC-V基金会的目标是保持RISC-V的稳定性,仅仅出于技术原因缓慢而谨慎地发展它,并力图让它之于硬件如同Linux之于操作系统一样受欢迎。

RISC-V 指令使用模块化的设计,包括几个可以互相替换的基本指令集,以及额外可以选择的扩充指令集。所有基本跟扩充的指令集都是由科技产业、研究机构跟学术界合作开发的。基本指令集规范了指令跟他们的编码、控制流程、暂存器数目(以及它们的长度)、记忆体跟定址方式、逻辑(整数)运算以及其他。只要有软体以及一个通用的编译器的支援,只用基本指令集就可以制作一个简单的通用型的电脑。

标准的扩充指令集可以搭配所有的基本指令集以及其他扩充指令集,而不会发生冲突。

很多 RISC-V 电脑可能使用精简扩充指令集来降低电力消耗、程式的大小以及记忆体的使用。未来也有计划支援hypervisor和虚拟化。

Risc-V chipset design in 2070 by cornerstoneman

百文说内核 | 抓住主脉络

子曰:“诗三百,一言以蔽之,曰‘思无邪’。”——《论语》:为政篇。百文相当于摸出内核的肌肉和器官系统,让人开始丰满有立体感,因是直接从注释源码起步,在开源鸿蒙内核源码加注释过程中,每每有心得处就整理,慢慢形成了以下文章。内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感,容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思。更希望让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了。
百万汉字注解内核目的是要看清楚其毛细血管,细胞结构,等于在拿放大镜看内核。内核并不神秘,带着问题去源码中找答案是很容易上瘾的,你会发现很多文章对一些问题的解读是错误的,或者说不深刻难以自圆其说,你会慢慢形成自己新的解读,而新的解读又会碰到新的问题,如此层层递进,滚滚向前,拿着放大镜根本不愿意放手。与代码有bug需不断debug一样,文章和注解内容会存在不少错漏之处,请多包涵,但会反复修正,持续更新,v**.xx 代表文章序号和修改的次数,精雕细琢,言简意赅,力求打造精品内容。百篇博客系列思维导图结构如下:

根据上图的思维导图,我们未来将要和大家一一分享以上大部分关键技术点的博客文章。

百万汉字注解.精读内核源码

如果大家觉得看文章不过瘾,想直接撸代码的话,可以去下面四大码仓围观同步注释内核源码:

gitee仓

https://gitee.com/weharmony/kernel_liteos_a_note

github仓 :

https://github.com/kuangyufei/kernel_liteos_a_note

codechina仓

https://codechina.csdn.net/kuangyufei/kernel_liteos_a_note

coding仓

https://weharmony.coding.net/public/harmony/kernel_liteos_a_note/git/files

写在最后

我们最近正带着大家玩嗨OpenHarmony。如果你有用OpenHarmony开发的好玩的东东,或者有对OpenHarmony的深度技术剖析,想通过我们平台让更多的小伙伴知道和分享的,欢迎投稿,让我们一起嗨起来!有点子,有想法,有Demo,立刻联系我们:

合作邮箱:zzliang@atomsource.org