中科院软件所实习日志(LARVa):从项目开始


LoongArch的爹:龙芯中科

一、还得从项目介绍开始

PLCT的实习是项目导向性,所以在开始前,还得介绍一下实习做的项目。主要内容来自于实习项目照片的官方仓库,项目编号:BJ82,要做的项目名称是:LARVa

PS:虽然官方仓库确实有项目的介绍,不过这一系列文章兼具笔记的功能。所以是希望未来的可能的读者能够读懂的,所以会对项目的背景、任务等等进行补充介绍

1. 项目背景

LARVa项目主要有两大背景:

  • LoongArch架构
  • RISC-V架构
  • 模拟器

A. LoongArch架构

要介绍LoongArch,就得先介绍一下其他的指令集架构。目前,目前主流的指令集架构和特点分别是:

  1. x86架构:x86架构由Intel开发,具有成熟的生态系统和软件支持。但是,x86架构是闭源的,不利于自主创新和技术研发。
  2. ARM架构:ARM架构由ARM公司开发,主要应用于移动设备(其实就是手机)、嵌入式系统和物联网,具有低功耗、高集成度的特点。但是,ARM架构也是闭源的,不利于自主创新和技术研发。
  3. MIPS架构:由MIPSMIPS公司开发,主要应用于路由器、数字电视、游戏机等领域,具有高性能、低功耗的特点。同时,MIPS架构虽然现在开源了,但是过去还是和arm类似,是需要授权的。
  4. Power架构:Power架构由IBM开发,主要用于高性能计算和服务器领域,具有高性能、高可靠性的特点。但是,Power架构的成本较高,适用于高端市场,一般人接触不到
  5. SPARC架构:SPARC架构由Oracle公司开发,主要应用于高性能计算和服务器领域,具有高性能、高可靠性的特点。但是,SPARC架构的市场份额较小,所以软件啥的不太行,生态系统不如x86ARM架构成熟。

目前流行的指令集,闭源的就不说了,太贵了。而即便是之前授权的、当前开源指令集,也是国外的,这个万一被卡脖子就不太好了。虽然开源授权协议是不牵扯国家政治,但是管理开源项目的开源组织、开源基金会却是被国家管理的。例如:

  • 前两天管理Python包的PyPI就收到了US法院传票,要求上交用户(包制作者)的信息。
  • 再比如稍后要介绍的RISC-V开源基金会的注册地址为了规避掉这个风险,注册地址从US搞到了瑞士。

所以其实说白了,指令集这种底层的东西,不掌握在自己手里,终究是有风险的。与此类似的,还有操作系统、数据库、编译器……

但是话说回来,作为计算机底层中的底层,指令集架构这个玩意出事情,那问题就太大了。而且,对于国产CPU发展,过去20多年中始终有两个问题无法解决,那就是要走自主之路还是走兼容之路,选择前者就意味着要重新建立一套生态系统,难度极大,选择后者的话可以兼容目前的ARM或者x86生态,但核心技术不能掌握在自己手里,不能自主。所以,国内的龙芯公司(Loongson)就推出了LoongArch架构。LoongArch指令集拥有2500多条自主指令,还可以翻译MIPSARMx86指令。相当于

LoongArch架构的目的有两个:

  • 一是因为LoongArch架构是国内自主研发的一种处理器架构,所以目的之一就是降低对国外技术的依赖、提高国家信息安全
  • 二是MIPS架构有一些设计的缺陷,所以作为后来者,LoongArch架构在处理器的指令集、内存管理、缓存一致性等方面进行了优化和改进

目前,龙芯已经推出了多款基于LoongArch架构的处理器,应用于服务器、工作站、嵌入式系统等领域。

比较搞笑的是,MIPS公司后来放弃了MIPS指令集架构,转而开发基于后面介绍的RISC-V的处理器😂。所以说LoongArch这个,有那么点小尴尬😂

MIPS官网已经是Taking RISC-V to new heights了😂

但是计算机领域的新事物,面临的最关键的问题其实就是生态系统问题x86arm发展了这么多年,基本上什么软件都可以使用,而LoongArch才出来没几年(相比于x86arm),所以缺少配套的软硬件生态系统。所以其实,我们LARVa这个项目其实就是为LoongArch的生态系统中添砖加瓦

B. RISC-V架构

说到RISC-V架构,就得介绍介绍他的历史

RISC-V架构最初是由加州大学伯克利分校的一位教授David Patterson和他的学生Andrew Waterman在2010年提出的。他们认为,当时的处理器架构设计存在着许多限制。

PS:那个时候指令集架构基本都是不开源的

所以他们需要一种更加灵活、开放的架构来推动计算机技术的进步。因此,他们基于精简指令集(RISC)的思想,设计了一种全新的指令集架构,即RISC-V

自2010年以来,RISC-V架构得到了越来越多的关注和支持。2014年,RISC-V基金会成立,旨在促进RISC-V架构的发展和推广。因为RISC-V是开源的,所以非常火热,甚至干死了老前辈,倒逼MIPSSPARC这类指令集架构开源。

截至目前,RISC-V已经成为了一种广泛使用的指令集架构,并且在各种应用领域都有着广泛的应用。例如,RISC-V已经被用于物联网、人工智能、移动设备、服务器等各种领域的处理器设计中。

RISC-V基金会官网

C. 模拟器

我们上面介绍了LoongArchRISC-V这两种指令集架构,那么这两者到底有什么关系呢?其实它们的交集就是我们的LARVa项目,不过在正式介绍LARVa项目前,需要先介绍一下模拟器。

模拟器emulator)是一种软件或硬件系统,它可以模拟另一个计算机系统的行为。直观的理解,模拟器就是一个能从硬件CPU、磁盘等等设备开始模拟的虚拟机。模拟器最大的好处就是可以在自己的计算机上运行其他计算机系统的软件,而无需实际拥有该系统的硬件。例如模拟器通常会模拟目标系统的处理器、内存、输入输出设备等硬件,以及操作系统和应用软件等软件环境。

这样说比较抽象,举一个例子:

  • 我们是穷逼,只有一台x86 CPU的机器。
  • 但是我们工作/学习的需要,我们需要编写运行在RISC-VCPU的机器上的程序
  • 所以这个时候,我们可以用模拟器在自己的机器上模拟一台有RISC-VCPU的计算机
  • 这样的话,就可以在自己的自己的机器上去测试未来将运行在RISC-VCPU上的程序

模拟器最大的好处就是能从CPU、内存这些开始模拟,所以其实就是完完全全在你电脑上模拟一个包括硬件在内的目标计算机,这就非常非常有用。例如,模拟器常见的应用场景有:

  • 开发和测试新的操作系统、应用软件或游戏,因为它可以模拟目标系统的环境,让开发人员进行测试和调试。
  • 旧系统的保护和维护,因为它可以让用户在现代计算机上运行旧的软件,而无需拥有旧系统的硬件。
  • 模拟器还可以用于教育和学习,因为它可以让学生学习和理解其他计算机系统的工作原理。

2. 项目任务

介绍了模拟器之后,结合我们前面介绍的LoongArchRISC-V的内容,其实我们LARVa这个项目要干的事情就很清楚了:

开发一个能够运行在LoongArch架构上的模拟器,这个模拟器能够模拟RISC-VCPU。

有了这个模拟器能干嘛呢?我觉得能干的事情之一就是未来我们有钱之后,买一台LoongArchCPU的计算机,我们就能够使用我们写的模拟器去模拟运行RISC-V的CPU(

严谨的说,我们做的事情其实是为国产的LoongArch架构的生态系统添砖加瓦,为国产开源事业贡献自己的力量(Hoorayヾ(@^▽^@)ノ)

3. 项目内容

以下介绍Copy自Github的项目官方介绍,加上我的一些心里想法

工作内容:

  • 与mentor协作开发基于LoongArch架构的RISC-V模拟器LARVa

    这个mentor有点难顶TAT,我打电话联系的时候给我说他平时有本职工作,我入职实习之后投入的时间比他还多。。。。估计我得好好肝了

  • 该项目目前使用Rust语言开发,需要有一定Rust基础。由于LoongArchRust上游支持很新(截至该职位发布时甚至不完整),有很大机率涉及直接向Rust上游贡献适配代码。

    咋说呢,Rust这东西我一直都是久闻其名,和go一样都是处于想学没来得及学的叠加态。还得往上游贡献代码,感觉挺有意思,干tnnd!

  • 目前路线图上的短期目标包括实现一个不依赖LoongArch的解释执行后端,用于校验RISC-V模拟语义,因此暂时没有LoongArch知识或硬件也 okay。

    我:解释执行后端??校验模拟语义????喵喵喵喵???

  • Rust上游支持开发LoongArch UEFI应用之前,工作重心会放在实现linux-user模拟上。否则会开始基于RustSBI实现完整的RISC-V系统级模拟。(这也可能通过一定的方式先在Linux环境模拟,但目前没有这方面想法。)

    UEFIRustSBIlinux-user这些东西我都听过,咋整一块我就看不懂了

  • mentor 会和你一同学习制作架构模拟器。

    寄中寄

我的评价是:寄()。哈哈,开个玩笑。感觉这个项目挺有意思的,感觉最有意思的部分就是向RUST上游贡献LoongArch的代码,这个有点牛逼。啥时候我能给Linux贡献一下LoongArch的代码,回头和朋友吹牛也能说我是Linux内核代码贡献者😂

好好肝吧,咱啥都缺,最缺钱,尤其是看到好配置的机器时候,不过最不缺的就是肝,冲!干tnd!

二、个人学习Road Map

这个Road Map和项目开发的Road Map没啥关系,是我目前评估出来的为了做这个项目,我需要学的一些东西。

  1. Rust语言。咱多少还是学了五六种语言的,这个速成一下问题不大
  2. QEMU源码。得去看看QEMU源码,了解一下模拟器实现的大概原理,不然还没法写出来自己的模拟器
  3. LoongArch指令集。这个肯定得去看看,不过感觉问题不大,好歹咱还是学过x86、ARM、RISC-V的,差不多就中断啊、IO啊、MMU啊那些老三样
  4. UEFI。之前自己写的操作系统是直接MBR分区里的loader,当时偷懒了图开发方便,没学UEFI。这会多少得学学了
  5. RustSBI。之前自己写的RISC-V的操作系统,SBI是自己写的,虽然知道RustSBI的功能和作用,但是具体还真没用过,得去学学
  6. 其他。
    • 后续再添加
    • 目前水平有限,只能想到这么多
    • 有的东西还不太懂,例如:“依赖LoongArch的解释执行后端”这是啥现在都搞不懂,得先学习上面的前置知识。

根据这五个milestone的依赖关系,准备按照下面的顺序学习:

  • Branch 1:学习Rust语言
  • Branch 2:学习LoongArch指令集架构
  • Branch 3:看QEMU源码

PS:三个Branch之间是并行的

Milestone和LARVa之间的依赖关系图

最后嘛,希望工钱能多点,或者换成护肝片也不错😂


文章作者: Jack Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Jack Wang !
 上一篇
Rust语言从入门到入土 1:Rust的开始 Rust语言从入门到入土 1:Rust的开始
本文是中科院软件所实习(LARVa项目)日志的第二篇,主要记录了我学习Rust语言的相关内容。本文主要介绍了什么是Rust,以及Rust开发环境配置
下一篇 
编译原理 2:语言及其文法 编译原理 2:语言及其文法
本章是编译原理的第二章,主要对语言进行数学上形式化的定义,即定义了语言的文法
2023-05-29
  目录