Rcore-Tutorial 버전 3.6. 중국어 문서를 참조하십시오.
Rcore-Tutiorial API 문서. 10 개의 OS의 API 문서를 참조하십시오
Rust Language를 모르고 배우려고하면 Rust Learning Resources를 방문하십시오.
공식 QQ 그룹 번호 : 735045051
이 프로젝트는 컴퓨터 아키텍처, 어셈블리 언어 또는 운영 체제 에 대한 배경 지식없이 초보자를 위해 RISC-V 플랫폼에서 실행하는 UNIX와 유사한 OS를 처음부터 Rust 에서 작성하는 방법을 보여줍니다.
qemu-system-riscv64 시뮬레이터 또는 개발 보드공식 안내서를 참조하십시오.
몇 가지 도구 설치 :
$ 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여기서 QEMU 7.0.0을 수동으로 컴파일하고 설치합니다. 예를 들어, 우분투에서 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 ) 그런 다음 ~/.bashrc 에 다음 내용을 추가하십시오 (환경에 따라 이러한 경로를 조정하십시오).
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
마지막으로 현재 쉘을 업데이트하십시오.
$ source ~ /.bashrc이제 QEMU 버전을 확인할 수 있습니다.
$ qemu-system-riscv64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developersSifive 웹 사이트 (Ctrl+F 'Toolchain')에서 플랫폼에 따라 압축 파일을 다운로드하십시오.
그것을 추출하고 루트 디렉토리 아래의 'bin'디렉토리의 위치를 $PATH 로 추가하십시오.
예를 들어 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일부 디버그 메시지를 출력 한 후 커널에는 사용 가능한 모든 응용 프로그램이 나열되고 사용자 쉘을 입력합니다.
/**** 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
>>
initproc 및 user_shell 자체를 제외한 모든 응용 프로그램을 실행할 수 있습니다. 응용 프로그램을 실행하려면 파일 이름을 입력하고 Enter를 누르십시오. usertests 많은 응용 프로그램을 실행할 수 있으므로 권장됩니다.
Ctrl+a 입력 한 다음 x 입력하려면 qemu를 종료하십시오.
6 장 전에 SD 카드가 필요하지 않습니다.
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k2106 장부터 커널을 실행하기 전에 SD 카드를 PC에 삽입하고 파일 시스템 이미지를 수동으로 작성해야합니다.
$ cd rCore-Tutorial-v3/os
$ make sdcard 기본적으로 SD 카드 인 Device /dev/sdb 덮어 쓰지만 다른 위치를 제공 할 수 있습니다. 예를 들어, make sdcard SDCARD=/dev/sdc .
그런 다음 PC에서 SD 카드를 제거하고 K210의 슬롯에 삽입하십시오. K210을 PC에 연결 한 다음 :
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210 K210에서 분리하려면 Ctrl+] 입력하십시오.
CH9-Log의 지점에는 많은 디버그 정보가 포함되어 있습니다. OS 커널의 내부 동작을 이해하기 위해 Rcore 튜토리얼을 실행하려고 시도 할 수 있습니다.
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ git checkout ch9-log
$ make run
......
[rustsbi] RustSBI version 0.2.0-alpha.10, adapting to RISC-V SBI v0.3
.______ __ __ _______.___________. _______..______ __
| _ | | | | / | | / || _ | |
| | _) | | | | | | (---- ` --- | | ---- ` | (---- ` | | _) || |
| / | | | | | | | _ < | |
| | - ---. | ` -- ' |.----) | | | .----) | | |_) || |
| _| `._____| ______/ |_______/ |__| |_______/ |______/ |__|
[rustsbi] Implementation: RustSBI-QEMU Version 0.0.2
[rustsbi-dtb] Hart count: cluster0 with 1 cores
[rustsbi] misa: RV64ACDFIMSU
[rustsbi] mideleg: ssoft, stimer, sext (0x222)
[rustsbi] medeleg: ima, ia, bkpt, la, sa, uecall, ipage, lpage, spage (0xb1ab)
[rustsbi] pmp0: 0x10000000 ..= 0x10001fff (rw-)
[rustsbi] pmp1: 0x2000000 ..= 0x200ffff (rw-)
[rustsbi] pmp2: 0xc000000 ..= 0xc3fffff (rw-)
[rustsbi] pmp3: 0x80000000 ..= 0x8fffffff (rwx)
[rustsbi] enter supervisor 0x80200000
[KERN] rust_main() begin
[KERN] clear_bss() begin
[KERN] clear_bss() end
[KERN] mm::init() begin
[KERN] mm::init_heap() begin
[KERN] mm::init_heap() end
[KERN] mm::init_frame_allocator() begin
[KERN] mm::frame_allocator::lazy_static!FRAME_ALLOCATOR begin
...... 현재 코드의 작은 부분 만 문서화되었으므로 코드를 보는 데 도움이 될 수 있습니다.
Cargo Doc ( os Directory)에서 cargo doc --no-deps --open 사용하여 os 의 DOC HTML을 열 수 있습니다.
10 OS의 API 문서
우리의 첫 번째 릴리스 3.6.0 (1-9 장)이 출판되었으며 여전히 연구 중입니다.
3.5.0 이후의 업데이트는 다음과 같습니다.
power 시리즈 응용 프로그램을 수정하십시오. 이제 출력에서 모듈러스를 찾을 수 있습니다. RefCell 또는 spin::Mutex 대신 UPSafeCell 사용하여 한 번에 두 번 빌릴 수 없도록 API를 조정하십시오 ( run_first_task 에서 & .exclusive_access().task[0] . TaskContext TaskControlBlock 으로 이동하여 커널 스택에서 제자리에 복원하는 대신 (CH3 이후) 성가신 task_cx_ptr2 제거합니다. llvm_asm! asm! rcore-fs-fuse 로 생성 된 FS 이미지 크기를 128mib로 확장하십시오. huge_write 라는 새로운 테스트 추가 (QEMU ~ 500KIB/S K210 ~ 50KIB/S) spin::Mutex UPSafeCell 로 교체하십시오 find_pte_create 대신 find_pte 호출해야합니다 PageTable::unmap find_pte 에서 레벨 3 pte의 유효성을 확인하십시오"버그가되어서는 안됩니다. cargo doc --no-deps --open 문서를 사용할 수 있습니다. 나중에 추가하겠습니다.