OS kernel labs based on Rust/C Lang & RISC-V 64/X86-32
OS kernel labs based on Rust/C Lang & RISC-V 64/X86-32
rCore-Tutorial version 3.6. See the Documentation in Chinese.
rCore-Tutorial API Docs. See the API Docs of Ten OSes
If you don't know Rust Language and try to learn it, please visit Rust Learning Resources
Official QQ group number: 735045051
This project aims to show how to write an Unix-like OS running on RISC-V platforms from scratch in Rust for beginners without any background knowledge about computer architectures, assembly languages or operating systems.
qemu-system-riscv64 simulator or dev boards based on Kendryte K210 SoC such as Maix DockSee official guide.
Install some tools:
$ rustup target add riscv64gc-unknown-none-elf
$ cargo install cargo-binutils --vers =0.3.3
$ rustup component add llvm-tools-preview
$ rustup component add rust-src
Here we manually compile and install Qemu 7.0.0. For example, on Ubuntu 18.04:
# install dependency packages
$ sudo apt install autoconf automake autotools-dev curl libmpc-dev libmpfr-dev libgmp-dev \
gawk build-essential bison flex texinfo gperf libtool patchutils bc \
zlib1g-dev libexpat-dev pkg-config libglib2.0-dev libpixman-1-dev git tmux python3 python3-pip
# download Qemu source code
$ wget https://download.qemu.org/qemu-7.0.0.tar.xz
# extract to qemu-7.0.0/
$ tar xvJf qemu-7.0.0.tar.xz
$ cd qemu-7.0.0
# build
$ ./configure --target-list=riscv64-softmmu,riscv64-linux-user
$ make -j$(nproc)
Then, add following contents to ~/.bashrc(please adjust these paths according to your environment):
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0/riscv64-softmmu
export PATH=$PATH:/home/shinbokuow/Downloads/built/qemu-7.0.0/riscv64-linux-user
Finally, update the current shell:
$ source ~/.bashrc
Now we can check the version of Qemu:
$ qemu-system-riscv64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers
Download the compressed file according to your platform From Sifive website(Ctrl+F 'toolchain').
Extract it and append the location of the 'bin' directory under its root directory to $PATH.
For example, we can check the version of GDB:
$ riscv64-unknown-elf-gdb --version
GNU gdb (SiFive GDB-Metal 10.1.0-2020.12.7) 10.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ pip3 install pyserial
$ sudo apt install python3-serial
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run
After outputing some debug messages, the kernel lists all the applications available and enter the user shell:
/**** APPS ****
mpsc_sem
usertests
pipetest
forktest2
cat
initproc
race_adder_loop
threads_arg
race_adder_mutex_spin
race_adder_mutex_blocking
forktree
user_shell
huge_write
race_adder
race_adder_atomic
threads
stack_overflow
filetest_simple
forktest_simple
cmdline_args
run_pipe_test
forktest
matrix
exit
fantastic_text
sleep_simple
yield
hello_world
pipe_large_test
sleep
phil_din_mutex
**************/
Rust user shell
>>
You can run any application except for initproc and user_shell itself. To run an application, just input its filename and hit enter. usertests can run a bunch of applications, thus it is recommended.
Type Ctrl+a then x to exit Qemu.
Before chapter 6, you do not need a SD card:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210
From chapter 6, before running the kernel, we should insert a SD card into PC and manually write the filesystem image to it:
$ cd rCore-Tutorial-v3/os
$ make sdcard
By default it will overwrite the device /dev/sdb which is the SD card, but you can provide another location. For example, make sdcard SDCARD=/dev/sdc.
After that, remove the SD card from PC and insert it to the slot of K210. Connect the K210 to PC and then:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210
Type Ctrl+] to disconnect from K210.
The branch of ch9-log contains a lot of debug info. You could try to run rcore tutorial for understand the internal behavior of os kernel.
…
Currently it can only help you view the code since only a tiny part of the code has been documented.
You can open a doc html of os using cargo doc --no-deps --open under os directory.
The API Docs for Ten OS
Our first release 3.6.0 (chapter 1-9) has been published, and we are still working on it.
Here are the updates since 3.5.0:
power series application in early chapters, now you can find modulus in the outputUPSafeCell instead of RefCell or spin::Mutex in order to access static data structures and adjust its API so that it cannot be borrowed twice at a time(mention & .exclusive_access().task[0] in run_first_task)TaskContext into TaskControlBlock instead of restoring it in place on kernel stack(since ch3), eliminating annoying task_cx_ptr2llvm_asm! with asm!rcore-fs-fuse to 128MiBhuge_write which evaluates the fs performance(qemu~500KiB/s k210~50KiB/s)spin::Mutex with UPSafeCell before SMP chapterfind_pte rather than find_pte_create in PageTable::unmapfind_pte instead of checking it outside this function" should not be a bugcargo doc --no-deps --open to view the documentation of a crateWe will add them later.
No open issues yet, or sync has not completed.