0%

一、前言

参加这次训练营时,我刚刚才进入大三,大三是个非常关键的时期,在之前的时间里已经积累了很多的基础,我在之前所学习到的知识将在这个时间段被检验被拷打,而翻过这座山后,学习的高度将建立在这个这个时期的过渡,所以不仅为了巩固与纠正之前的知识还为了能在这个过渡期将知识储备量进一步提高层次。我选择了这个训练营。我不仅能学到一门强大,前沿,更现代的技术,我还能对硬件与程序之间的桥梁——操作系统有更加深入的了解。能够得到丰富收获的同时也面临一系列的挑战。但是每当遇到困难与压力,我都够挺过来。难题来临,不得不顶上去,敢问路在何方,路就在脚下。

二、第一阶段

1.总述

第一阶段主要涉及的是Rust这门语言的学习,初次接触到Rust这门语言,可能最直观的感受是它的要求很多,比如可变引用于不可变引用、所有权、trait、mod等等。但是这也是Rust与其他语言不同的地方,它会在错误发生之前就尽力扼杀全部错误,这是其他语言所不具备的,这得益于Rust强大的编译器。另外,Rust编程的主要思想仍然是面向对象编程。这使得Rust在大型工程里会使代码更加模块化。

2.特殊机制

Rust的基础特性与其他语言类似这里不做描述,比如基本数据类型、结构体、枚举。这里只列举一些,有待补充。

(1) Option类型

这是一个枚举的变体(是基于枚举类型实现的),它在各种语义里发挥作用,其根本特别之处在于它的None和Some(),它与传统意义的Null不同,例如C语言里的Null表示为空值。它的设计能对Null做出处理而不简单停留在标识空值,他提供了更多选项。

(2) 生命周期

这是Rust强大的编译器带来的特性,它会检查在程序里每处被定义的内存的存在周期,以在编译阶段就避免悬垂指针的出现,这样的话内存的安全性将大大提高。

(3) 所有权机制

这是Rust独一档的特性,它会让Rust每处内存同一时间只会所属于一个变量,而其他变量只能引用这处内存,这样的定义使得Rust制定出了所有权规则,为内存提供了特殊的定义机制,这使得引用内存变得更加安全可靠。

(4) 模式匹配

针对模式匹配,Rust提供了match、if let、while let等来实现模式匹配,这使得我们在Rust可以对变量进行类型判断,增加了每条判断语句灵活性。

三、第二阶段

1.总述

第二阶段主要聚焦于基于risc-v架构的类Unix操作系统,我们采用了Rust语言来编写rcore内核,这是因为Rust在这方面有得天独厚的优势。操作系统在各领域都有所涉及,例如计算机体系架构、计算机组成、计算机网络、数据结构等。所以学习操作系统更够窥探更多计算机的秘密,因此我操作系统有非常浓厚的兴趣。

从裸机运行到单道批处理系统

  • 没有任何操作系统,能够直接硬件的程序运行被称为裸机程序。这样做有一点历史原因,虽然这样做对程序员来说十分自由、没有限制。但这样会造成许多问题,例如安全问题、不具通用性难以移植以及对硬件资源的利用率很低等等。
  • 于是有了单道批操作系统,在rcore表现为加入了初步的简陋的操作系统。为了安全性,借助硬件上划分的运行特权级将程序的执行环境人为与操作系统分隔开,同时也添加了系统调用,因此可以将多个程序按照一定的批次放在内存里约定的位置,以达到运行多个程序的目的。
  • 此时会将所有的程序编译并链接后,生成bin文件,将bin文件先加载到内存里,然后操作系统执行时会将需要执行的程序加载到0x80400000这个约定的地址。

从单道批处理到进程调度

  • 单道批处理系统已经明显的区别于裸机运行,但是这样的系统仍然还有进步空间,对硬件资源的利用率还是不高,比如说是cpu的处理能力没有充分利用以及内存资源的分配等等。
  • 因此在单道批处理系统的基础上,我们不只是将程序加载进内存后让其滞留在那里而是每个程序都可以运行起来,于是提出了时间片的概念,让每个程序尽量都能被cpu执行,这样cpu的空闲时间会下降,相反性能将大幅提高,同时还让持有内存资源的程序能够及时得到执行,提高了内存利用率。
  • 在rcore里,他是risc-v架构,使用内部的定时器来对运行时间进行切分,同时为了能成功切换程序,建立了新的数据结构TCB来维护与更新每个程序的关键信息。

内存地址空间的管理策略

  • 以往所提到的地址或是所使用的地址都是物理地址,意思为所有数据都是直接承载在物理地址上的,且所存与所访问的地址是一一对应的。但是这样的话会带来很多问题,例如内存空间的不安全以及局限性等等。
  • 因此提出了多种存储管理策略来使程序能够重定位,这极大地提高了内存地址空间的灵活性,同时使访问内存变得更加安全。实现这一算法需要硬件上的支持,因为如果在软件层面上让操作系统来翻译性能会大幅降低,对于硬件资源更适合去干这份工作。因此诞生了mmu。
  • 这里的rcore使用的是SV39这种内存管理策略。依赖的是页机制,且使用的是多级页表。这我们对整个物理内存划分为一个很小的页面,这样我们对内存的分配更加灵活、安全、高效。

对外部存储空间的抽象与管理

  • 内存虽说是直接与cpu交互,但内存的大小十分有限,我们不能够仅仅依靠内存来存储数据。我们使用计算机通常会产生、使用以及删除十分庞大数据,因此我们不得不依靠外部存储器件来存储数据,但这部分器件往往无法被cpu直接访问,因此我们需要操作系统来操作接口与设备来使数据放在内存里。
  • 但是管理一个庞大的存储空间不是一件简单的事,并且内存与外存的存储结构通常是有很大差别的,所以我们需要实现对存储空间进行抽象然后再建立新的数据结构进行管理。这里引入的就是文件系统。
  • rcore里的文件系统将每个文件(站在人的视角看叫做文件)抽象成了多个存储节点(站在存储器件的角度上),每个节点的数据结构里含有数据索引,名称,权限,文件关系等重要信息。这样我们访问文件时,操作系统会根据我们的需要去检索节点然后去访问数据。
  • 在类Unix操作系统里文件系统采用了统一的框架“”fd(文件描述符)”去描述每个“文件”。由于许多外部设备的访问操作时相似的,例如“打开”、“读”、“写”等,因此对许多类似的设备重定向,建立适配该框架的数据结构,使得可以利用这个框架去访问外部设备。

线程与进程

  • 之前我们通常将每个程序作为进程受操作系统管理然后运行,操作系统分配资源的对象为进程,cpu运行的单位也是进程。但是这样的设计仍然会带有一定的局限性,因此我们进程再度细分,将进程分为了线程,进程可以申请线程。
  • 进程本身就是一个最大的主线程,它作为线程但又区别于子线程。每个线程都在在进程的环境里运行,所得到的资源也为该进程。因此操作系统分配资源的对象仍为进程,但cpu运行的单位变成了线程。这样提高了进程的运行响应,同时优化了操作系统的调度运行。
  • 但这样也带来了一定的问题,会出现一些线程间的冲突,因此我们需要调和线程之间的运行。这里rcore就使用到了信号量和互斥。

四、总结

在这两个阶段里,我学到了很多,一门新的语言Rust、一种类Unix基于risc-v架构的操作系统。从9月29日开始到现在第二阶段11月10日的结束,无论是知识上的或是技术上的,我收获到了许多。我知道这只是基础,我渴望能在第三阶段学习到更成熟的操作系统,以此能加强我对Rust的学习、对risc-v架构的理解、对类Unix系统的理解以及更前沿的编程技术。感谢。

第一阶段的Rustlings

关于第一阶段的Rustlings,还是花了很多时间去学习Rust。一开始是直接去看《Rust程序设计语言》,随后还看了《Rust圣经》,把一些较为简单的概念和程序过了一遍。可是发现做题时还是难以掌握,随后只能带着疑问和不懂的地方边做边查,做完一套后终于有点入门的感觉了,我感觉rust对我或者别的语言的用户来说,一大难点就是自造的概念太多了+ 第一次接触时的api暴露太多了,有一点不知如何下手。然后再结合上生命周期,就更难上手了。

rcore实验

Lab 1

这个实验主要是实现一个简单sys_task_info多任务系统. 通过这个实验, 了硬件是如何在不同的特权级之间切换的, 以及操作系统是如何管理这些特权级的,知道什么是系统调用和特权级的应用

Lab 2

lab2是实现在启用虚拟地址的情况下重写sys_get_time和sys_task_info, 并实现sys_mmap和sys_munmpa系统调用, 因为启用了分页机制, 学习到了地址空间的概念, 应用程序只需要关心自己的地址空间, 而不需要关心其他应用程序的地址空间, 在实现过程中我对操作系统对代码中的地址空间, 页表的地址转换有了更深的理解

Lab 3

lab3是实现sys_spawn和stride调度算法, 学习到了进程是如何创建的, 以及进程是如何执行的

Lab 4

lab4是实现硬链接和获取文件信息的系统调用, 需要对inode和disk_inode有较深的理解, 学习了文件系统是如何与物理存储设备交互的

Lab 5

lab5是实现死锁检测, 需要理解死锁检测算法 need矩阵

前言

因为我已经工作有12年了, Rust也写了有几万行, 所以第一阶段对我来说没什么难度. 但是我还是按照训练营的要求, 完成了rustlings的练习.

rustlings

rustlings的练习很简单, 但是对于新手来说, 是一个很好的入门练习. 通过这些练习, 可以很快的了解rust的基本语法和特性.

不过我仍然从中学到了一些新东西, 比如 BinaryHeap. 之前我在编写应用程序的时候一直用 Vec 来实现优先队列, 现在我知道了 BinaryHeap 这个更好的实现.

总结

理解了 Drop 就入门了 Rust.
理解了 Trait 就熟悉了 Rust.

前言

就Rust语言来说,我认为这是开创新时代的语言,一直在努力学习。
我自己学Rust语言的过程,分了三个阶段,最初纯粹是好奇。
用Rust自己写了一些小程序后,对Rust有了实际的体验,感觉体验很好、值得信赖。
于是有了更深入学习的想法,前面参加了InfiniTensor训练营,了解到使用Rust开发更复杂程序的方法。
现在参加操作系统训练营,是对自己更高的挑战。

开发一个操作系统内核是一个宏大的课题,需要认真的思考、深入地研究。训练营在短时间内整个拉了一遍,
给了学员一个宏观的体验,这非常宝贵,这是我参加训练营的原因。同时,在这个过程中,通过交流和学习,
也触发了我个人的深层思考,这对我个人尤为宝贵。
限于时间,我没法把所有问题思考透彻,但又不能感兴趣的问题轻易丢弃,于是写这篇总结,留待以后。
标题叫Something Not yet done,就是我想做、想探寻但还没有答案的东西。

基础阶段

内容

基础段主要涉及Rust语言的学习。

  • Rust语言的unsafe部分
  • Rust语言的异步和并行部分

Rust语言的unsafe部分

第一次涉及到unsafe部分代码的编写,经历了程序的崩溃,意识到unsafe的危险;到使用安全方法怎么也无
法实现想要的功能,明白了Rust的哲学,unsafe的重要性。从享受Rust的安全编程,转变为谨慎地编写unsafe
然后再享受Rust的安全编程,对于Rust的编程理念有了更近一步的了解。
但如何安全地编写unsafe,仍然有很多知识需要学习和实践,包括:

  • unsafe function
  • unsafe trait
  • unsafe extern

要完全掌握Rust,unsafe是必须跨越的一步。

Rust语言的异步和并行部分

对于如何编写高性能的Rust程序,还缺乏实践。

专业阶段

内容

专业阶段主要涉及对rCore的代码分析、学习,和部分功能实现。

  • 系统调用
  • 虚拟地址
  • 进程管理和调度
  • 文件系统
  • 并行控制

系统调用

这部分功能比较简单。

虚拟地址

引入虚拟地址后,所有系统调用的参数传递,都需要进行地址转换。目前都在系统调用处理函数中,复制粘贴
代码来实现,格外得丑陋。希望在第三阶段的时候,对这部分进行封装。

进程管理和调度

stride是比较简单的调度算法,希望在后面能够尝试将Linux的调度算法移植过来。

文件系统

在实现功能的过程中,在File trait中增加的一个方法。不知道有没有破坏原有的抽象,三阶段看看完整的
项目是如何解决File到Inode转换的。

并行控制

死锁检测的实现中,感觉对于列表的实现有点丑陋,目前可用的集合类就只有VecDeque,三阶段看看有没有
其他实现方式。

项目阶段

待补充。

rustlings 总结

Rustlings 是学习 Rust 编程语言的极佳练习工具,它包含了多个由浅入深的练习题目,帮助学习者快速掌握 Rust 的基础知识和重要概念。

1. 变量与可变性

  • Rust 中的变量默认是不可变的(immutable),即变量在声明后无法更改。要让变量可变,必须显式添加 mut 关键字。
  • 这种默认不可变性帮助开发者避免无意的状态变化,提高代码的安全性和可维护性。

2. 数据类型

  • Rust 是静态类型语言,编译器会在编译阶段检查数据类型。
  • Rust 支持多种数据类型,包括标量类型(整型、浮点型、布尔型、字符)和复合类型(元组、数组等)。

3. 所有权机制

  • Rust 的所有权系统是其内存安全性和性能的重要保障。
  • 每个值在同一时间只能有一个所有者,当所有者变量超出作用域时,内存会自动释放。所有权的转移、借用和引用(可变和不可变)是理解 Rust 内存管理的关键。

4. 借用与引用

  • 借用(Borrowing)允许在不转移所有权的情况下使用数据。
  • Rust 有严格的借用规则:在同一作用域中,只允许一个可变引用或多个不可变引用,确保内存安全。

5. 结构体与枚举

  • 结构体(Struct)用于将不同的数据组合成一个复合类型,枚举(Enum)用于定义一组可能的状态或值。
  • Rust 的枚举非常强大,支持绑定数据,并且可以与模式匹配一起使用,帮助更清晰地处理复杂的逻辑分支。

6. 模式匹配

  • match 表达式和 if let 是 Rust 中处理分支的主要工具,尤其是当处理枚举和结果类型(Result)时。
  • match 语法不仅简洁,还能避免遗漏某些分支,确保代码的健壮性。

7. 错误处理

  • Rust 提供了 ResultOption 类型来进行错误处理和空值处理。
  • 使用 unwrapexpectmatch 等方式处理这些类型,开发者可以编写出更健壮的代码,避免程序在运行时崩溃。

8. 所有权的移动与复制

  • 移动(Move):当变量的所有权被转移时,源变量将不可用。
  • 复制(Copy):对于实现了 Copy 特征的类型(如基本数据类型),赋值不会转移所有权,而是直接复制。

9. 特征

  • Rust 中的特征类似于其他语言的接口,用于定义一组方法签名,供结构体或枚举实现。
  • 特征使得 Rust 支持多态,通过泛型和特征约束实现代码的复用和接口一致性。

10. 智能指针

  • Rust 的标准库中提供了 BoxRcRefCell 等智能指针类型,帮助管理内存和共享数据。
  • Box 实现堆分配,Rc 实现引用计数,RefCell 提供运行时的可变性检查,用于实现更复杂的数据结构。

11. 并发编程

  • Rust 的所有权机制让多线程编程更加安全。
  • 使用 std::thread 库可以方便地创建线程,并且借助 ArcMutex 等类型来实现线程间的数据共享和同步。

12. 生命周期(Lifetimes)

  • Rust 使用生命周期注解来管理引用的生命周期,确保程序不会引用无效数据。
  • 生命周期的概念是 Rust 内存安全的重要组成部分,编译器会自动推断大部分生命周期,但有时需要显式标注。

OS 实现

第二阶段主要分为八个章节,每个章节层层递进,深入揭示操作系统的底层逻辑以及实现原理。

lab1

为了实现 sys_task_info 系统调用,首先在 TaskManager 中为任务控制块 (TCB) 扩展结构体,加入如下字段:sys_call_times:[u32;MAX_SYSCALL_NUM],然后在在mod.rs中增加increase_sys_call和get_sys_call_times函数,进而在syscall函数中调用increase_sys_call函数,

在系统调用处理逻辑中,维护当前任务的系统调用次数计数,每次进入系统调用时在数组中相应位置加一。在 sys_task_info 系统调用实现中,将当前任务的状态(应为 Running)、系统调用次数、以及通过 get_time() 获取的任务总运行时间写入 TaskInfo 结构体。

lab2

  • 完成sys_get_time和sys_task_info函数,需要定义一个translated_struct_ptr,它通过页表(PageTable)将一个指向结构体(*mut T)的指针翻译为对应的物理地址,并返回一个可变引用(&’static mut T),这样可以直接操作映射后的物理内存。在sys_task_info函数中,需要获取系统调用时间和任务运行时间,所以需要在task.rs中定义并实现它们。
  • 完成sys_mmap和sys_munmap函数,用于申请和释放虚拟内存映射。sys_mmap 通过指定的起始地址 start、长度 len 和内存页属性 port 来映射一段物理内存到虚拟地址空间。该函数会检查起始地址对齐情况、port 的合法性,并将内存页映射为可读、可写或可执行。sys_munmap 则用于取消内存映射,释放从 start 开始的一段虚拟内存。(注意,需要判断地址是否对齐)

lab3

  • 实现了自定义的spawn的系统调用来创建新进程,以便简化进程创建的过程而无需使用fork+exec的组合操作。通过sys_spawn,直接从指定的路径启动目标程序,成功返回子程序的进程id,否则返回-1。
  • 实现了stride调度算法,为每个进程设置优先级与其调度权重,使得系统资源能够更公平分配。stride调度通过设置初始优先级与动态步长(pass值),优先调度累计步长最小的进程,并对选中的进程步长进行累加调整,确保各进程的运行比例与优先级成正比。我还新增了 sys_set_priority 系统调用,以便动态调整进程优先级,增强调度灵活性。

lab4

在本次作业中,我实现了三个系统调用:linkat、unlinkat 和 fstat,以支持硬链接和文件状态获取。

  1. linkat:该调用用于创建一个文件的硬链接。它接收原有文件路径和新链接路径作为参数,并将新路径指向与原文件相同的磁盘块。在实现中,我确保在创建链接时不允许同名文件的存在,避免潜在的未定义行为。
  2. unlinkat:此调用用于删除文件的链接。当调用 unlinkat 时,如果文件的引用计数降至零,它将回收与文件关联的 inode 及其数据块。我的实现确保正确处理文件的彻底删除,维护文件系统的一致性。
  3. fstat:该调用获取指定文件描述符的状态信息。它将文件状态结构体填充以提供有关文件的详细信息,如大小、权限和时间戳等,便于用户或其他系统调用进行进一步处理。
    通过这三个系统调用的实现,我的文件系统支持了硬链接的创建与删除,以及文件状态的查询,从而增强了其功能和灵活性。

lab5

我实现的功能包括对进程和线程的资源管理,主要是通过互斥量(mutex)和信号量(semaphore)来控制并发访问。具体而言,为每个线程维护了四个关键数据结构:m_allocation 和 s_allocation 用于记录已分配的互斥量和信号量的数量,m_need 和 s_need 则用于跟踪线程尚需的资源数量。在系统调用中,加入了对死锁的检测逻辑,确保在尝试获取新资源之前检查当前资源的可用性。如果发现潜在的死锁情况,则会拒绝资源请求,并返回相应的错误代码。此外,还实现了调整资源需求的方法,以便在资源分配和释放时动态更新状态。

前言

我是一位已经参加工作有12年的资深工程师, 职业生涯中曾经担任过 CTO, 也做过总架构师. 精通 5+ 门编程语言, 对 10+ 门编程语言有过万行生产环境编码经验.
但因为自己毕业于一所大专院校, 在大专学习期间学校并没有开设过这些计算机系基础课程. 在多年工作中我时常好奇:

  1. 应用程序的内存是如何分配的
  2. 应用程序代码是如何启动的
  3. 应用如何与操作系统进行交互
  4. 操作系统是如何管理硬件资源的
  5. 多线程是如何实现的
    等等问题.
    抱着求知的心态, 我报名参加了这次的操作系统训练营.
    这些基本能力, 对应用开发者来说就像超市货架上每天都能“生长”出来的食物, 操作系统是如何把他们实现的, 我想要了解这个过程.

我曾在2021年参加过一次学堂在线的操作系统课程, 但是因为工作和家庭琐事繁忙, 最终没有完成. 这次我希望通过这次训练营, 继续学习操作系统的知识, 并且完成所有的实验.

我始终贯彻着一句话: 计算机是一门实践工程学科, 不管看的听的再怎么醍醐灌顶, 写不出来就是没学会.
学校的操作系统课程, 大多数都是讲理论, 缺乏实践. 这次训练营, 我希望能开发自己的内核程序, 并烧录到自己的硬件上运行.

第二阶段

Lab 1

这个实验主要是实现一个简单的多任务系统. 通过这个实验, 我理解了硬件是如何在不同的特权级之间切换的, 以及操作系统是如何管理这些特权级的.

Lab 2

这个实验启用了分页机制, 我学习到了地址空间的概念, 应用程序只需要关心自己的地址空间, 而不需要关心其他应用程序的地址空间. 同时我也学习到了内核是如何管理这些地址空间的.

Lab 3

进程: 学习到了进程是如何创建的, 以及进程是如何执行的.

Lab 4

文件系统: 学习到了文件系统是如何与物理存储设备交互的, 块存储设备是如何存储文件与数据的.

Lab 5

多线程: 学习到了操作系统是如何实现多线程的, 以及多线程之间如何通过锁来通讯.
通过课程实验: 我学习了如何用银行家算法检测死锁.

总结

通过这门课程我学习到了很多操作系统的基础知识, 包括:

  • 裸机程序是如何启动的
  • 应用程序内存是如何分配与隔离的
  • 操作系统是如何操作硬件的
  • 应用程序是如何与操作系统进行交互的
  • 文件系统是如何实现的
  • 等等…
    同时我也发现课程框架代码存在许多值得改进的地方, 所以我在尝试编写自己的内核程序.

阶段1:语言学习

rust 是一门非常有意思的语言,它吸收了很多现代编程语言的特性,特别是来自函数式编程的许多特性,比如 默认不可变,模式匹配,流 api,以及 trait,可以以一种不同的方式去抽象与编码。
rust 的“人体工程学”做的也非常不错,有许多语法糖与内置宏,匿名函数的写法也足够简洁,在学习过程中感觉非常有趣。

在语言学习过程中重点学习了基本的语法以及一些库函数的使用,对语言周边,比如 clippy 的使用还不够好,build.rs 也不太会写,多线程编程也不够熟练,希望接下来的学习当中能再注意一下重点学一下这些东西。

阶段2:rcore labs 学习

rcore 今年秋冬的任务是除了进程间通信以及io设备没有做过多要求,其余的每章都有一个编程练习,在我看来,编程练习的难度是适中的,但是依然要求完整的理解整个代码框架,对学习操作系统内核很有帮助。

前三章作为引子一步一步从裸机程序到一个批处理裸机程序的内核,后面几章的顺序是:虚拟内存(地址空间),进程,文件(持久化存储),再到并发。课程顺序与传统授课顺序不太一样,在我个人看来是一种由易到难的渐进学习过程:因为第八章的线程和并发编程真的感觉好难 debug 😂,在这章上浪费的时间也比较多。

印象最深刻的是对文件系统的讲解,将文件系统作为一个库抽象出来,内核也只是管理文件系统提供的 Inode 接口,以此来区分在内存中的 inode 和磁盘中的 inode,这样一层从 BlockDevice 到 FileSystem 再到 rcore-kernel 最后被封装为一些系统调用,这样层层抽象的写法看起来真的挺赏心悦目的哈哈,而且对知识的学习与综合起来也方便许多。

另外还有虚拟内存,内存模型也是内容量非常庞大的一章,需要理解 memory-set, map-aera, pagetable-entry, 以及物理地址和虚拟地址,物理页号和虚拟页号之间的关系,

抽象之下是和底层处理器的操作,内联汇编,riscv 库,以及 C ffi,rust 都支持的很好。处理 trap 的汇编函数也很有意思,以及一些 riscv csr,学习的同时也去了解了一下 riscv。不过本次学习,对rv要求的不是很多,更多的是以问答作业的形式去提问,不知道后面的阶段会不会有深入的机会。

2024二阶段总结

在这一阶段,我对我的学习可以划分两个比较明显的时期,一个是前期比较懵懂地入门,一个是中后期的速通。

Read more »

Rustlings

这是我第一次刷Rustlings,还是很有收获的。最后新增的一些算法题也很有意思,不过整体来说还是适合有Rust语法知识基础的人学习。最后几个算法题刷的很慢,我的数据结构和算法学的不是很好,在这里有学到很多。不过我也参考了许多资料。如果有人看的话,也算一点收获叭。整体来说Rust写起来很爽!

参考资料

Rust语法基础

初学者应该主要从三个方面了解Rust:Rust语法基础,Cargo以及Rust的标准库和官方文档。

Rust 程序设计语言 - Rust 程序设计语言 简体中文版

这是社区推荐的的The Rust Programming Language的中文翻译版本。主要讲Rust语法基础,国内有开源作者撰写了Rust语言圣经两本书的内容比较相似,后者语言比较生动,内容也比较丰富,前者的话语言精炼一些,个人比较推荐去读前者,读不懂的时候再去看Rust语言圣经的版本,会有新的收获。

The Cargo Book

Introduction - The Cargo Book

The Cargo Book是关于Cargo的一本书,初学者可能只会使用到Cargo的一少部分命令和参数,但实际上,Rust受到广泛关注的一个原因,就来自于强大的构建和包管理工具Cargo,值得注意的是这本书的中文翻译版本最后的更新时间是2019年,相关的内容和英文最新版差别比较大,最好读英文版本。

Rust标准库文档

List of all items in this crate

Rust的标准库文档涵盖了基础阶段大部分的内容,结构体、宏、智能指针等等都在标准库文档中有详细的说明,Rust程序相比其他许多语言确实比较在学习和编写上难度更大 ,但是Rust设计者们也在极力减少开发者的心智负担,对于一些数据类型和结构,标准库中定义了一些好用的方法和属性,方便大家学习和使用。另外,标准库中也定义了一些基本的API接口,方便开发。总之Rust标准库是一座宝库。

Rust

crates.io: Rust Package Registry

crate.io是提供了诸多Rust开发者开发的库,可以直接在cargo.toml里面配置库名和版本就能使用,很方便,基础阶段Rust标准库文档是小宝库,在后续进阶开发阶段,crate.io就是名副其实的大宝库。言下之意是,基础阶段暂时不用看这个。

Youtube

Rustlings 5.0 | Intro | Learn Rust Interactively

**目前国内的Rust学习资源还在初级阶段,B站上暂时没有很完善的教程,推荐一个油管博主的视频,讲到比较陌生不好理解的地方,博主会把Rust基础教程和标准库文档贴出来,对着讲解,还是很有收获的,还能教你怎么快速找到自己需要查的知识点。但是这个博主是之前录的视频,没有训练营版本Rustlings最后一些练习的讲解。

Rustlings

这是我第一次刷Rustlings,还是很有收获的。最后新增的一些算法题也很有意思,不过整体来说还是适合有Rust语法知识基础的人学习。最后几个算法题刷的很慢,我的数据结构和算法学的不是很好,在这里有学到很多。不过我也参考了许多资料。如果有人看的话,也算一点收获叭。整体来说Rust写起来很爽!

参考资料

Rust语法基础

初学者应该主要从三个方面了解Rust:Rust语法基础,Cargo以及Rust的标准库和官方文档。

Rust 程序设计语言 - Rust 程序设计语言 简体中文版

这是社区推荐的的The Rust Programming Language的中文翻译版本。主要讲Rust语法基础,国内有开源作者撰写了Rust语言圣经两本书的内容比较相似,后者语言比较生动,内容也比较丰富,前者的话语言精炼一些,个人比较推荐去读前者,读不懂的时候再去看Rust语言圣经的版本,会有新的收获。

The Cargo Book

Introduction - The Cargo Book

The Cargo Book是关于Cargo的一本书,初学者可能只会使用到Cargo的一少部分命令和参数,但实际上,Rust受到广泛关注的一个原因,就来自于强大的构建和包管理工具Cargo,值得注意的是这本书的中文翻译版本最后的更新时间是2019年,相关的内容和英文最新版差别比较大,最好读英文版本。

Rust标准库文档

List of all items in this crate

Rust的标准库文档涵盖了基础阶段大部分的内容,结构体、宏、智能指针等等都在标准库文档中有详细的说明,Rust程序相比其他许多语言确实比较在学习和编写上难度更大 ,但是Rust设计者们也在极力减少开发者的心智负担,对于一些数据类型和结构,标准库中定义了一些好用的方法和属性,方便大家学习和使用。另外,标准库中也定义了一些基本的API接口,方便开发。总之Rust标准库是一座宝库。

Rust

crates.io: Rust Package Registry

crate.io是提供了诸多Rust开发者开发的库,可以直接在cargo.toml里面配置库名和版本就能使用,很方便,基础阶段Rust标准库文档是小宝库,在后续进阶开发阶段,crate.io就是名副其实的大宝库。言下之意是,基础阶段暂时不用看这个。

Youtube

Rustlings 5.0 | Intro | Learn Rust Interactively

**目前国内的Rust学习资源还在初级阶段,B站上暂时没有很完善的教程,推荐一个油管博主的视频,讲到比较陌生不好理解的地方,博主会把Rust基础教程和标准库文档贴出来,对着讲解,还是很有收获的,还能教你怎么快速找到自己需要查的知识点。但是这个博主是之前录的视频,没有训练营版本Rustlings最后一些练习的讲解。