Rcore-Tutorial versão 3.6. Veja a documentação em chinês.
Rcore-Tutorial API Docs. Veja os documentos da API de dez oses
Se você não conhece a linguagem de ferrugem e tente aprender, visite Rust Learning Resources
Número oficial do Grupo QQ: 735045051
Este projeto tem como objetivo mostrar como escrever um sistema operacional do tipo Unix em execução em plataformas RISC-V do zero no Rust for Beginners , sem nenhum conhecimento de base sobre arquiteturas de computadores, linguagens de montagem ou sistemas operacionais .
qemu-system-riscv64 ou placas de dev baseadas no Kendryte K210 SoC, como o MAIX DockVeja Guia Oficial.
Instale algumas ferramentas:
$ 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-srcAqui, compilamos e instalamos manualmente o Qemu 7.0.0. Por exemplo, no 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 ) Em seguida, adicione o seguinte conteúdo a ~/.bashrc (ajuste esses caminhos de acordo com seu ambiente):
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
Por fim, atualize o shell atual:
$ source ~ /.bashrcAgora podemos verificar a versão do qemu:
$ qemu-system-riscv64 --version
QEMU emulator version 7.0.0
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developersFaça o download do arquivo compactado de acordo com sua plataforma no site SIFive (Ctrl+F 'Toolchain').
Extraia -o e anexe a localização do diretório 'Bin' no seu diretório raiz ao $PATH .
Por exemplo, podemos verificar a versão do 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 runDepois de gerar algumas mensagens de depuração, o kernel lista todos os aplicativos disponíveis e insere o shell do usuário:
/**** 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
>>
Você pode executar qualquer aplicativo, exceto initproc e user_shell . Para executar um aplicativo, basta inserir seu nome de arquivo e pressionar Enter. usertests podem executar várias aplicações, portanto, é recomendável.
Digite Ctrl+a então x para sair do qemu.
Antes do capítulo 6, você não precisa de um cartão SD:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210Do capítulo 6, antes de executar o kernel, devemos inserir um cartão SD no PC e escrever manualmente a imagem do sistema de arquivos:
$ cd rCore-Tutorial-v3/os
$ make sdcard Por padrão, ele substituirá o dispositivo /dev/sdb , que é o cartão SD, mas você pode fornecer outro local. Por exemplo, make sdcard SDCARD=/dev/sdc .
Depois disso, remova o cartão SD do PC e insira -o no slot do K210. Conecte o K210 ao PC e depois:
$ git clone https://github.com/rcore-os/rCore-Tutorial-v3.git
$ cd rCore-Tutorial-v3/os
$ make run BOARD=k210 Tipo Ctrl+] para desconectar de K210.
O ramo do Ch9-Log contém muitas informações de depuração. Você pode tentar executar o tutorial da RCORE para entender o comportamento interno do kernel do sistema operacional.
$ 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
...... Atualmente, ele só pode ajudá -lo a visualizar o código, pois apenas uma pequena parte do código foi documentada.
Você pode abrir um DOC HTML do os usando cargo doc --no-deps --open no diretório os .
Os documentos da API para dez OS
Nossa primeira versão 3.6.0 (capítulo 1-9) foi publicada e ainda estamos trabalhando nisso.
Aqui estão as atualizações desde 3.5.0:
power Series Application nos capítulos iniciais, agora você pode encontrar módulo na saída UPSafeCell em vez de RefCell ou spin::Mutex para acessar estruturas de dados estáticos e ajustar sua API para que ela não possa ser emprestada duas vezes por vez (mencionar & .exclusive_access().task[0] em run_first_task ) TaskContext para TaskControlBlock em vez de restaurá -lo no lugar na pilha do kernel (desde CH3), eliminando task_cx_ptr2 irritante llvm_asm! com asm! rcore-fs-fuse para 128MIB huge_write que avalia o desempenho do FS (qemu ~ 500kib/s k210 ~ 50kib/s) spin::Mutex com UPSafeCell antes do capítulo SMP find_pte em vez de find_pte_create em PageTable::unmap find_pte em vez de verificá-lo fora desta função" não deve ser um bug cargo doc --no-deps --open para ver a documentação de uma caixa Vamos adicioná -los mais tarde.