rCore入门-来自清华的OS前沿教程

电子说

1.3w人已加入

描述

1.  简介

rCore教程旨在一步一步展示如何从零开始用Rust语言写一个基于RISC-V架构的类 Unix 内核。值得注意的是, 本项目不仅支持模拟器环境(如Qemu/terminus 等),还支持在真实硬件平台 Kendryte K210 上运行。

1.1 为什么要学习操作系统?

UNIX

一名程序员的绝大部分工作都是在操作系统上面进行的。学习操作系统,深入了解操作系统原理,是每个合格的程序员必须要经历的。很多人学习 Rust 语言感到很吃力,基本上就是因为操作系统基础知识薄弱造成的。通过自己实现一个操作系统,可以让你对操作系统的理解不仅仅是停留在概念上。而且用 Rust 实现操作系统,对于 Rust 爱好者来说,更有意思。---上面应该是Rust大牛张汉东说的。

学习OS只是想更加了解Linux对当前工作辅助,可以参考我之前的一个文章介绍Linux 0.11的:os内核入门-linux0.11编译介绍。相对来说rCore更加学术前沿一些,关于学术和一个公司商用的技术,可能大家会有很多误解,一般在医学领域科研可能领先应用50年左右,计算机领域也可能领先15年左右。举个例子之前介绍的seL4微内核是一个学术性很先进的OS,十几年前开发出来的,现在还没大规模应用。

1.2 目前常见的操作系统内核都是基于 C 语言的,为何要推荐 Rust 语言?

事实上, C 语言就是为写 UNIX 而诞生的。Dennis Ritchie 和 KenThompson 没有期望设计一种新语言能帮助高效地开发复杂与并发的操作系统逻辑(面向未来),而是希望用一种简洁的方式来代替难以使用的汇编语言抽象出计算机的行为,便于编写控制计算机硬件的操作系统(符合当时实际情况)。

C 语言的指针既是天使又是魔鬼。它灵活且易于使用,但语言本身几乎不保证安全性,且缺少有效的并发支持。这导致内存和并发漏洞成为当前基于 C 语言的主流操作系统的噩梦。

Rust 语言具有与 C 一样的硬件控制能力,且大大强化了安全编程和抽象编程能力。从某种角度上看,新出现的 Rust 语言的核心目标是解决 C 的短板,取代 C 。所以用 Rust 写 OS 具有很好的开发和运行体验。

用 Rust写 OS 的代价仅仅是学会用 Rust 编程。

----上面摘自书中描述,下面讲点我对Rust的理解。

计算机技术的发展还算比较快,在这个过程中软件技术一直在更新,有的是因为要适应硬件,有的是要适应人类的需求,涌现出了大批的技术,最常见的是我们的桌面OS,还有很多桌面应用,这些大多是面向对象的C++、Java、Object-c实现的,还有一些嵌入式设备,没有界面的,大部分用c语言这种面向过程的语言实现;网址网页的应用更多用一些脚本语言,例如php js python去实现;还有一些人工智能的应用可能用一些偏向算法的语言,例如matlab去实现;一些服务器上运行的程序可能需要并发支持强的Go语言去实现,也适应多核CPU的硬件设计理念。这么多语言,就像一个江湖,里面有很多门派,如果要新搞一个门派,那一定需要博采众长,成为一代宗师,厚积薄发才可以。

举个游戏的例子,什么样的游戏能受大众的欢迎,“王者荣耀”可以说是老少皆宜,其又可以追溯到Dota,Dota可以说创造了此类玩法的流派,当年Dota的发展就是一个很好的例子,首先用户主导,用户给iceforge提需求想玩什么样的角色,想玩什么的场景,然后不断的更新英雄和地图,英雄分三类:法师、力量型、敏捷型,基本涵盖了玩游戏需求的场景,你是什么样的性格就能找到自己对应的玩法,如上图中。可以说Dota也是游戏领域的集大成者了。换个说法就是“精益求精、持续改进”。

所以现代的编程语言是一个可以一直演变的,今天新加了这个特性,明天又新加另外一个特性,才能保持活力,而古老的语言可能很久都不更新,也可能历史的包袱太沉重,例如考虑兼容性和语言特长已无法再进行修改了。采众之所长,可以说是我对Rust的一大感触,首先底座基于C/C++,加入面向对象的思想,脚本语言的思想,并发、安全等思想,可以说是更高级的语言,包含了很多计算机技术的落地,所以对新手不友好,建议是多学几门语言再学习Rust,就知道其好处了。缺点肯定也有,好的东西不是越多越好,可能会相互冲突,并且会造成不稳定因素,更重要的是其弱小的时候得不到充分的验证,有点像学术性的东西,大家也多抱观望态度。就像上图中画的Rust吉祥物,一个大螃蟹:想横着走,但是还需要第一个愿意吃螃蟹的人。

关于Rust的名字的来源:

rust直译过来是一类真菌(中文中叫植物锈病的不少都是这类真菌造成的,如上图中),关于Rust的由来有很多说法:

直接因素是Mozilla公司和Chrome是对头,chrome是铬金属,那么就需要Rust去腐蚀。

我更喜欢的解释是:

这类真菌生物结构上没有一个中心点,而是完全分布式的.是空间上无单点失败的(想象下人类脑袋心脏随便哪块掉),非常鲁棒.

这类真菌的生命周期中有五种形态(像毛毛虫变蝴蝶这就是算有两种形态),非常独特,非常鲁棒。有多独特呢?笔者为了写这个答案,苦搜wiki,发现查出来的这五种形态 Pycniospore, Aecium ,Urediniospore , Telium ,Basidium 中间三种都是这类真菌独有的.

有多鲁棒呢?作为真菌,五种生物形态下的rust中的2,3,5形态甚至还能往前倒退到之前的形态(真正的回到娘胎重造),做到了避免时间上的单点失败

有多种生物形态,也是映射Rust多范式的特点吧

这类真菌在寄生的时候甚至可以是多宿主的,而且能在宿主间切换,也是映射Rust对语言间互操作性的重视(想想除了D基本没语言能跟C++好好互操作,都只能操作C,大家只能依赖SWIG这种技术再人为定义接口才行).

这类真菌有一个特性叫Dikaryon, 用采访中说的比喻就是类似当想夫妻两想生孩子时候,可以同步并行得看看到底两人的后代能有多少种组合,这种繁殖时候的并行性,是又双叒叕一层的保证rust菌生存的鲁棒性

1.3 目前常见的指令集架构是 x86 和 ARM ,为何要推荐 RISC-V ?

目前为止最常见的指令集架构是 x86 和 ARM ,它们已广泛应用在服务器、台式机、移动终端和很多嵌入式系统中。由于它们的通用性和向后兼容性需求,需要支持非常多(包括几十年前实现)的软件系统和应用需求,导致这些指令集架构越来越复杂。

x86 后向兼容的策略确保了它在桌面和服务器领域的江湖地位,但导致其丢不掉很多已经比较过时的硬件设计,让操作系统通过冗余的代码来适配各种新老硬件特征。

x86 和ARM 在商业上都很成功,其广泛使用使得其 CPU 硬件逻辑越来越复杂,且不够开放,不能改变,不是开源的,难以让感兴趣探索硬件的学生了解硬件细节,在某种程度上让CPU成为了一个黑盒子,并使得操作系统与硬件的交互变得不那么透明,增加了学习操作系统的负担。

从某种角度上看,新出现的 RISC-V 的核心目标是灵活适应未来的AIoT(人工智能物联网, AI + IoT)场景,保证基本功能,提供可配置的扩展功能。其开源特征使得学生都可以深入CPU的运行细节,甚至可以方便地设计一个 RISC-VCPU。从而可帮助学生深入了解操作系统与硬件的协同执行过程。

编写面向 RISC-V 的 OS 的硬件学习代价仅仅是你了解 RISC-V 的 Supervisor特权模式,知道 OS 在 Supervisor 特权模式下的控制能力。

---上面还是书中的解释,下面介绍点RISC-V的由来。

“芯片”是我国一个更大的痛点,抛开制造被美国各种卡脖子,在软件指令集授权方面也是被交智商税。你会说我们很多公司都会设计芯片,例如华为的麒麟芯片,或者国内大部分厂商都自己造了芯片,这只是表象,核心是基本都买的ARM的授权,然后自己再改改。

UNIX

先介绍下ARM,ARM指令集也是RISC精简指令集,目前已经占领了大部分芯片市场。但是其商业模式是卖芯片设计的,授权费相当的昂贵,有时要上千万美元,大企业还可以买,小公司就不行了,可以说“天下苦ARM久已”。

美国的高校想用也要付费,RISC指令集的创始人加州大学伯克利分校的David Patterson教授自己想用都不行。2010年,加州大学伯克利分校的一个研究团队正在准备启动一个新项目。在为新项目选择指令集的时候,他们发现,x86指令集被Intel控制得死死的,ARM指令集的授权费又非常贵,MIPS、SPARC、PowerPC也存在知识产权问题。在牛人眼中,这么小儿科的东西还要收钱,直接新搞一个,并且使用BSDLicense开源协议,硬件也开源,没错就是这么疯狂,谁想用谁用,不用付费,并且新一代的设计,吊打旧的技术。有点像Linus Torvalds当年svn收费还不好用直接开发了一个git一样。

RISC-V是因为其前开发过四个版本,这是第五个版本。这么一个好东西,大家伙可以说一拥而上,短短几年的时间里,包括谷歌、华为、阿里、IBM、镁光、英伟达、高通、三星、西部数据等商业公司,以及加州大学伯克利分校、麻省理工学院、普林斯顿大学、ETH Zurich、印度理工学院、洛伦兹国家实验室、新加坡南洋理工大学以及中科院计算所等学术机构,都纷纷加入RISC-V基金会。好处首先就是价格便宜,例如阿里的玄铁开发板不足百元,可以硬刚树莓派几百元的价格。真是学生都可以随便买,真香系列如下图:

RISC-V当然作为新兴的事物,也有缺点,跟上面说的Rust一样,在发展的初期弱小的时候得不到充分验证,一些缺点也被ARM抨击,但是还是要多一些包容,其还在改进发展之中。作为“搅局者”,已经把大旗插好了,就看大家的热情了。

有兴趣可以参考:https://zhuanlan.zhihu.com/p/73089738

2.  课程介绍和代码下载编译运行

2.1  课程介绍

本小节调一点课程里面,刚开始就介绍很精彩的部分,大家感受下。

操作系统抽象:

在计算机和操作系统的技术研究和发展的过程中,形成了一系列的核心(抽象)概念:执行环境、进程、地址空间和文件,这些奠定了操作系统内核设计与实现的基础。

UNIX

CPU在执行过程中,可以在不同层次的执行环境之间切换,这称为 执行环境切换 。执行环境切换主要是通过特定的API或ABI来完成的,这样不同执行环境的软件就能实现数据交换与互操作,而且还保证了彼此之间有清晰的隔离。对于应用程序的执行环境而言,应用程序只能看到执行环境直接提供给它的接口(API 或 ABI),这使得应用程序所能得到的服务取决于执行环境提供给它的访问接口。所以,操作系统可以看成是应用程序执行环境,其形态可以是一个库,也可以是一个虚拟机等,或者它们的某种组合形式。更清晰常见的形式如下图:

UNIX

应用程序的内存布局:

UNIX

在上图中可以看到,代码部分只有代码段.text一个段,存放程序的所有汇编代码。而数据部分则还可以继续细化:

已初始化数据段保存程序中那些已初始化的全局数据,分为 .rodata 和 .data 两部分。前者存放只读的全局数据,通常是一些常数或者是常量字符串等;而后者存放可修改的全局数据。

未初始化数据段 .bss 保存程序中那些未初始化的全局数据,通常由程序的加载者代为进行零初始化,即将这块区域逐字节清零;

堆 (heap)区域用来存放程序运行时动态分配的数据,如 C/C++ 中的 malloc/new 分配到的数据本体就放在堆区域,它向高地址增长;

栈 (stack)区域不仅用作函数调用上下文的保存与恢复,每个函数作用域内的局部变量也被编译器放在它的栈帧内,它向低地址增长。

2.2 环境搭建和代码下载运行

环境搭建主要是安装Rust和qemu,参考:

http://rcore-os.cn/rCore-Tutorial-Book-v3/chapter0/5setup-devel-env.html

代码下载参考第一章的代码:

 

git clone https://github.com/rcore-os/rCore-Tutorial-v3.git cd rCore-Tutorial-v3 git checkout ch1 cd os make run

 

UNIX

打印的RUSTSBI是这个系统的BootLoader,也是用Rust语言写的。

关于rCore系统整体的介绍,可以参考清华王润基同学的毕业论文:

https://raw.githubusercontent.com/wiki/rcore-os/zCore/files/wrj-thesis.pdf

后记:

rCore也算是一个承前启后的学习OS,可以学习OS的基本技术,另外Rust和RISC-V属于未来的前沿技术,未来的OS很可能以此为根基。有一点rCore是一个宏内核,这点不是太新颖,但是清华直接给补上了,下一篇会介绍更新的zCore。

审核编辑 :李倩

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分