第一阶段 - rust基础与算法
由于我有rust基础,没有遇到什么困难,但还是第一次完整地做一次rustlings,有一定收获
第二阶段 - 专业阶段
实验环境配置
rcore开发的环境配置比较繁琐,而我恰好比较熟悉nix,因此我用nix定义的一个完美兼容rcore的开发环境。由于不需要 rustup
, 必须在 os/Makefile
中禁用 rust 环境的检测. flake.nix
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| { description = "rCore dev flake";
inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; oldnixpkgs.url = "github:NixOS/nixpkgs/7cf5ccf1cdb2ba5f08f0ac29fc3d04b0b59a07e4"; flake-utils.url = "github:numtide/flake-utils"; rust-overlay = { url = "github:oxalica/rust-overlay"; inputs.nixpkgs.follows = "nixpkgs"; }; };
outputs = { nixpkgs, oldnixpkgs, flake-utils, rust-overlay, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; overlays = [(import rust-overlay)]; }; oldpkgs = import oldnixpkgs { inherit system; }; in { devShells.default = pkgs.mkShell { packages = with pkgs; [ (rust-bin.nightly."2024-05-02".minimal.override { extensions = [ "rust-src" "llvm-tools" "rustfmt" "rust-analyzer" "rust-docs" "clippy" ]; targets = ["riscv64gc-unknown-none-elf"]; }) cargo-binutils python3 gdb tmux ] ++ [oldpkgs.qemu];
shellHook = '' rustc --version cargo --version qemu-system-riscv64 --version qemu-riscv64 --version ''; }; }); }
|
这份 flake.nix
也已经分享到官方问答论坛
第一/二章
阅读这两章需要先了解riscv,特别是特权级相关设计。
主要参考:
第三章:多道程序与分时多任务
学习了系统调用,陷入等知识,上下文切换过程中通用寄存器和CSR的使用加深了我对riscv特权级设计的理解。
本章练习较为简单。
第四章:地址空间
SV39的设计又引入了若干相关的寄存器,如satp, pmp csr。查阅riscv manul以加深理解。
本章练习中,为了处理请求映射已经被映射的页的错误,我使用了Result
错误传递,无法想象如果不使用Result
和?
语法糖我的代码会多么丑陋。然而很奇怪,整个rcore中极少使用Result
。
第五章:进程及进程管理
本章内容比较轻松,完善了TCB的设计并实现fork()
和exec()
系统调用。
本章练习也比较简单。
第六章:文件系统
easy-fs is NOT easy!层层抽象几乎让我晕头转向!
尽管如此,easy-fs囊括了superblock、索引节点、blockcache等现代文件系统中的基础概念,似乎不能再精简了。
link和unlink操作主要是查找inode并创建/删除目录项。在inode_block里创建与删除目录项无非是一些线性序列的操作,但由于没有封装成&[DirEntry]
,需要手动操作,比较费劲。将来有空我会尝试改进一下。
第七章:进程间通信
本章内容较少,但进程间通信是个大话题,还需拓展学习。
第八章:并发
学习了多线程的同步与互斥。
练习:学习了死锁检测算法