操作系统(OS)内核学习路线

操作系统(OS)内核学习路线

Shetty Yttehs Lv1

前言

大一刚到学校的我还是一枚萌新,连 git 都不能熟练使用,只会安装 Linux ,在 ACM 摸鱼了大半年发现水平根本比不过别人,于是来到龙芯实验室准备参加 OS 内核实现赛道。

后来有幸组建了 3 人队伍,在初赛通过了全部的测试样例,故写博客记录开发的过程,将其整理为学习路线,为社区贡献自己的微薄之力。

  • 本文并不会深入讲解操作系统相关知识,以列举相关链接为主,因为真要我讲我也讲不好

  • 如有侵权,请联系删除。

勘误

在深入研究文本之前,请务必注意可能存在一些 语法错误 ,这可能是由于翻译错误、打字错误或作者独特的写作风格。

如果你有疑问或者建议,欢迎在评论区留言,或通过邮箱 shetty.yttehs@outlook.com 联系。

  • 下面开始正文部分。

比赛说明

选择 RISC-VLoongArch 架构之一进行内核开发。

RISC-V

RISC-V 是一种开放的、可扩展的 指令集架构(ISA) ,它遵循 精简指令集计算机(Reduced Instruction Set Computer,RISC) 原则。RISC-V 的设计目标是提供一个 灵活高效易于实现 的 ISA,这使得它成为 嵌入式系统 和其他 低功耗设备 中的理想选择。

LoongArch

LoongArch 是一款由中国的长安科技(Loongson)公司开发的 64 位架构的 中央处理器(CPU) 。它旨在替代国际上主流的 x86 架构,特别是在面向中国市场的计算机和服务器设备中。LoongArch 采用了 RISC 设计原则 ,与 ARM 、MIPS 等其他 RISC 架构类似,但具有其独特的 指令集架构设计

Warning

作者所在的团队选择了 RISC-V 架构,以下部分只包含 RISC-V 架构。

初赛

能够使用 qemu-system-riscv64 运行内核,并尽可能通过测试样例。

决赛

内核能够在真正的开发板上运行,并尽可能通过测试样例。

编程语言选择

选择适合自己的,而不是最优的。

C 语言

  • 优点:语法相对简单,容易上手。

  • 缺点:安全性低,模块管理较为复杂。

C 语言入门相关资料

  1. 菜鸟教程 : 真神。

Rust

Rust 是一门现代化语言,微软、谷歌是 Rust 的支持者之一,他们在项目中也逐渐引入 Rust 来取代 C/C++ 。

  • 优点:模块化结构清晰,三方库资源丰富,安全性高,性能强。

  • 缺点:语法相对复杂,学习成本高。

Info

作者所在的团队选择了 Rust ,因此教程可能更多偏向于 Rust 语言。

Rust 入门相关资料

  1. 菜鸟教程 : 真神。

  2. Rustlings : Rust 习题练习,根据自己的体质来。

  3. Rust 死灵书 : 使用 Unsafe Rust 编程,根据自己的体质来。

开发环境搭建

Linux

在 x86_64 的 PC 上编译 RISC-V 架构的内核需要 交叉编译工具链(Cross-platform Toolchain) 以及其他工具的支持,毫无疑问, Linux 提供了良好的支持。

为了得到 Linux 环境,有以下几种方式:

方式WSL 2VMware实体机Termux on Android(不推荐)
优点方便,轻量接近实体机,有图形化界面性能高可以在 Android 设备使用
缺点环境隔离不彻底,没有图形化界面(其实可以用 VNC)开销大,配置繁琐安装复杂,容易不小心丢数据arm64 架构的软件包少
难度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

工具链

由于每个人的 Linux 环境不同,这时你意识到你要 STFW 了。

Info

后续也会有 类似的问题 ,本文只给出一种或几种方案。
请视自身开发环境进行取舍,最终给你答案的还是 STFW

关键词:riscv, gcc, rustup, cargo

对于 Rust ,此教程 有详细的说明。

关键词:riscv, gcc

安装 QEMU

Info

请注意,这里的 QEMU 指的是 qemu-system-riscv64 ,并不是 qemu-riscv64

  • qemu-system-riscv64 允许用户模拟完整的 RISC-V 64 位系统,包括 CPU、内存、设备等。

  • qemu-riscv64 主要用于执行单个 RISC-V 指令或程序。

由于我们编写的是内核,所以选择 qemu-system-riscv64

如果 Linux 发行版提供了 qemu-system-riscv64 ,那么请直接使用,手动编译是最后的选择。

相关资料

  1. rCore-Tutorial-Guide 2024 春季学期

前置知识

Warning

也许你认为可以跳过这部分,不过现在偷的懒以后都会找回来的。

Info

对于初学者,暂时学会基本的功能就够了,后续可以再次深入学习。
跳读法 未必不是一种好办法。

Break the GFW

🤫嘘,小声说话,成为一名合格的 CSer 。

请自行完成 CS 自学指南 必学工具的第一项。

权衡可信度,带宽,流量,价格等因素。

目标

写项目中遇到困难时,能够做到 STFWAsk GPT for Help

Linux Shell

这将促进 GUI 向 CLI 的转变。

目标

  • 理解 可执行文件 的概念

  • 使用命令行管理文件的创建/删除/移动

进阶(选做)

  • 打造属于自己的 shell

    由于 bash 的功能简陋,你可以使用以下列举的 shell :

shellfish zsh
优点上手简单,内置插件丰富社区支持度高,三方插件丰富,兼容传统 shell 语法
缺点不完全兼容传统 shell 语法初始界面简陋,需要自己动手配置

相关资料

  1. Linux入门教程

Vim

CLI 文本编辑器,Linux用户心目中神一般的存在。

Info

🥹:如果我实在接受不了 Vim 怎么办?
CLI 编辑器不止 Vim ,可以用 NanoEmacs 代替,更加适合新手。

Info

虽然 Vim 的理念与一般的应用程序不同,但是强烈建议掌握其基础功能。
因为目前很多 CLI 应用的操作使用与 Vim 一样的方式。

目标

  • 学会使用 Vim 编辑文件,学会基本的操作

进阶(选做)

  • 使用 NeoVim

NeoVim 是更加强大的 Vim ,如果你不满足简陋的 Vim ,欢迎入坑 NeoVim 。

NeoVim 有丰富三方插件,社区支持度高,打造成功可以与 VSCode 相媲美,不过配置过程较为繁琐,建议从使用别人的配置开始。

Git

强大的版本控制工具,CSer 必学。

相关资料

  1. Learn Git Branching

  2. Git 快速入门

Makefile

自动化编译和构建项目。

Info

Makefile 内容较多,学习难度较高,建议对着模板改。

目标

  • 使用 make 命令编译运行内核项目

相关资料

  1. Makefile Tutorial : Makefile 零基础入门,根据自己的体质来。

  2. NJU ProjectN : 南京大学操作系统讲义的 PA0 部分,作为入坑 CLI 的参考。

操作系统理论知识

如果你是计算机小白,没有对计算机领域有一个较为全貌的理解,推荐看一个系列视频(前 10 集推荐连续看完):Crash Course Computer Science

Warning

一定要形成一个基本的框架,不然写代码时会晕乎乎的。
作者亲身经历。

主要部分中断处理 内存管理 进程调度 文件系统 设备管理 …
进阶busybox libc …

目标

  • 知道 操作系统 是什么

  • 使用下方资料或自行查找资料,了解操作系统的构成

  • 了解 RISC-V 汇编语言,这个量力而行吧

相关资料

  1. [完结] 循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 : 用 C 语言开发 RISC-V 操作系统的教程,讲得很详细,选择 Rust 的同学看到 Hello RVOS 就够了。

  2. 16分半还你一个能听懂基本分页存储管理在干嘛的大脑! : 操作系统内存管理,讲得很详细,小姐姐的声音也很甜。

  3. 开源操作系统社区活动 :收集了丰富的操作系统相关资源。

实践环节

到了这一步,其实只是刚刚开始,请坚持下去。

Info

千万不要只看教程,动手敲代码才是最有效的学习方式。

Info

虚拟内存上板时可能会发生 多级页表 相关的 Bug ,请参考 Reddit 社区的解决方案

后记

操作系统并非简单的事物,它与传统编程不同,脱离了对 标准库 的依赖,因此需要改变思维和习惯。

最后送给大家来自 CS自学指南 的一句话:

  • 你得有足够的驱动力强迫自己静下心来,阅读几十页的 Project Handout,理解上千行的代码框架,忍受数个小时的 debug 时光。而这一切,没有学分,没有绩点,没有老师,没有同学,只有一个信念 —— 你在变强。

祝大家在自己研究的方向有所突破,早日实现自己的梦想。

致谢

感谢 Cai1Hsu xiaocongyaosa 两位搭档的指导。

感谢 rCore-Tutorial 提供的优秀资源,以及整个社区的支持和贡献。

  • Title: 操作系统(OS)内核学习路线
  • Author: Shetty Yttehs
  • Created at : 2024-06-02 23:44:19
  • Updated at : 2024-09-01 12:58:06
  • Link: https://blog.shettyyttehs.org/2024/06/02/os-kernel-learning-route/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments