Proyek ini berasal dari repositori 华中科技大学操作系统团队 / riscv-pke.
Seperti yang dapat Anda lihat di cabang , setiap cabang sesuai dengan level dengan deskripsi ringkasnya.

Ini bukan paket runnable lokal, karena saya belum melakukan pekerjaan kompilasi di dalamnya. Cukup menganggapnya sebagai buku jawaban dari pos pemeriksaan dalam penilaian online pendidik . Jika Anda ingin menjalankan proyek ini secara lokal, silakan baca terus dan temukan jalan Anda di ReadMe resmi .
Pendahuluan ini hanya akan ditampilkan di cabang default.
Dokumen dalam bahasa Cina dapat ditemukan di sini. Masih belum ada dokumen khusus dalam bahasa Inggris, tetapi komentar in-line dalam kode kami serta nama-nama yang menjelaskan diri untuk variabel dan fungsi akan membantu dalam perjalanan PKE Anda.
PKE adalah proyek open source (lihat lisensi.txt untuk informasi lisensi) untuk tujuan pendidikan dari kursus teknik sistem operasi/sistem teknik komputer, yang diberikan kepada mahasiswa sarjana mengambil jurusan CS (Ilmu Komputer) atau EEC (Teknik Listrik dan Ilmu Komputer) di universitas.
PKE menyediakan serangkaian laboratorium yang mencakup titik-titik pengetahuan sisi teknik dari sistem operasi serta beberapa organisasi/arsitektur komputer, termasuk:
LAB1 (3 Laboratorium Dasar+2 Laboratorium Tantangan): Perangkap (Syscalls), Pengecualian dan Interupsi (IRQ dalam Terminologi Intel).
Lab2 (3 Laboratorium Dasar+2 Laboratorium Tantangan): Manajemen Memori.
Lab3 (3 Laboratorium Dasar+2 Laboratorium Tantangan): Proses.
Lab4 (3 Lab dasar): Perangkat dan File (dilakukan pada papan PYNQ FPGA + mobil mainan Arduino).
Eksperimen dalam repo mungkin berbeda (dengan laboratorium yang lebih aktual) dari daftar di atas dengan berlalunya waktu.
Dari sudut pendidikan tentang teknik sistem operasi, berbeda dari banyak proyek pendidikan OS terkenal (seperti XV6 ( JOS ketika sebelumnya) yang digunakan dalam MIT 6.828 dan UCORE diajarkan di Universitas Tsinghua) yang menggunakan kernel OS yang lengkap atau hampir tidak ada.
PKE dibangun di sekitar gagasan proxy kernel (diusulkan dalam PK, proyek open source dari ekologi perangkat lunak RISC-V), yang menekankan untuk membangun kernel OS "cukup" untuk aplikasi yang diberikan. Dengan ide seperti itu, kami merancang serangkaian laboratorium di PKE yang secara bertahap "meningkatkan" kernel OS dengan memberikan serangkaian aplikasi, dari sederhana hingga kompleks. Selama peningkatan, Anda dapat mempelajari lebih banyak ide yang lebih canggih dari sistem operasi modern, dan yang lebih penting, bermain dengan mereka dengan mengikuti laboratorium, satu demi satu.
Di setiap laboratorium, PKE dimulai dengan aplikasi (ditempatkan di folder ./user/ , dengan awalan "app_") dan kernel OS proxy yang tidak lengkap . Selama laboratorium, Anda perlu 1) memahami interaksi antara aplikasi dan kernel OS proxy (kadang-kadang, juga mesin RISC-V yang ditiru dengan menggunakan Spike, atau papan FPGA dengan inti RISC-V yang lembut); 2) ikuti kode dari aplikasi yang diberikan ke kernel OS berdasarkan pemahaman; 3) Lengkapi kernel OS proxy untuk membuat aplikasi (atau sistem) untuk dieksekusi dengan benar dan lancar.
Di laboratorium PKE, kami mencoba yang terbaik untuk mengontrol dan meminimalkan skala kode dari setiap laboratorium, berharap dapat membantu Anda tetap fokus pada komponen utama sistem operasi, dan meminimalkan upaya pada saat yang sama. Hubungi kami jika Anda memiliki saran lebih lanjut tentang mengurangi skala kode, terima kasih sebelumnya!
1. Instal Sistem Operasi (Mesin Virtual atau Subversi Windows Linux)
(Lebih disukai) Ubuntu 16.04lts atau lebih tinggi, 64-bit
2. Pasang alat untuk membangun kompiler silang dan emluator
$ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex3. Pasang kompiler silang RISC-V
$ export RISCV=/path-to-install-RISCV-toolchains
$ git clone --recursive https://github.com/riscv/riscv-gnu-toolchain.git
$ cd riscv-gnu-toolchain
$ ./configure --prefix= $RISCV
$ make -j $( nproc )
$ sudo make installDalam perintah di atas, $ (NPROC) adalah singkatan dari jumlah utas yang ingin Anda panggil saat membangun. Generelly, $ (NPROC) harus sama dengan jumlah inti yang dimiliki komputer Anda. Setelah langkah ini, Anda harus menemukan executable, seperti riscv64-tidak-tidak-elf-gcc, riscv64-tidak-tidak-elf-gdb, riscv64-tidak dikeluarkan-elf-oBjdump, dan banyak lainnya (dengan nama awalan "riscv64-tidak diketahui /") di /riscv64-bint-ef-ef-ef- ") di /jalur-ke-install-riscv .
4. Instal Emulator (Spike)
$ sudo apt-get install device-tree-compiler
$ git clone https://github.com/riscv/riscv-isa-sim.git
$ cd riscv-isa-sim
$ mkdir build
$ cd build
$ ../configure --prefix= $RISCV
$ make -j $( nproc )
$ sudo make installSetelah langkah ini, Anda harus menemukan executable seperti Spike, Spike-Dasm di direktori /Path-to-Install-RisCV-ToolChains /Bin Directory Anda.
5. Klon PKE Repo
$ git clone https://github.com/MrShawCode/riscv-pke.gitSetelah langkah ini, Anda akan memiliki direktori PKE yang berisi laboratorium PKE.
6. Build/Run PKE
$ make [run]7. (Opsional) Instal OpenOCD untuk debugging
$ git clone https://github.com/riscv/riscv-openocd.git
$ cd openocd
$ ./bootstrap (when building from the git repository)
$ ./configure --prefix= $RISCV
$ make -j $( nproc )
$ sudo make install Setelah menginstal OpenOCD, Anda dapat men -debug kernel PKE. Cukup gunakan perintah berikut:
$ make gdbDi lab ini, kita akan mempelajari prestiple dasar perangkap (juga disebut sebagai syscall di banyak buku teks).
Perangkap (misalnya, printf yang digunakan dalam penggunaan harian kami) umumnya dikeluarkan oleh aplikasi, dan ditangani secara terlarang oleh kernel. Sangat penting bagi OS untuk menyediakan fasilitas tersebut, karena aplikasi yang berjalan dalam mode yang kurang istimewa (misalnya, mode pengguna dalam RISC-V) perlu sering melakukan operasi hukum seperti I/OS yang perlu dilakukan dalam mode priviledge yang lebih tinggi (misalnya, penyelia atau mode mesin dalam RISC-V).
Lab1_1 memberikan aplikasi di "Pengguna/Lab1_1_Helloworld.c", yang fungsi utama () menyebut fungsi printu yang memiliki fungsionalitas yang sama seperti printf , tetapi dengan nama yang sedikit berbeda. Printu didefinisikan dalam "user/do_print.c", dan sebenarnya memohon perangkap dengan instruksi ecall (lihat rakitan inline dalam fungsi do_user_print ).
Struktur LAB1_1 tercantum sebagai berikut:
.
├── LICENSE.txt
├── Makefile
├── README.md
├── .spike.cfg
├── kernel
│ ├── config.h
│ ├── elf.c
│ ├── elf.h
│ ├── kernel.c
│ ├── kernel.lds
│ ├── machine
│ │ ├── mentry.S
│ │ └── minit.c
│ ├── process.c
│ ├── process.h
│ ├── riscv.h
│ ├── strap.c
│ ├── strap.h
│ ├── strap_vector.S
│ ├── syscall.c
│ └── syscall.h
├── spike_interface
│ ├── atomic.h
│ ├── dts_parse.c
│ ├── dts_parse.h
│ ├── spike_file.c
│ ├── spike_file.h
│ ├── spike_htif.c
│ ├── spike_htif.h
│ ├── spike_memory.c
│ ├── spike_memory.h
│ ├── spike_utils.c
│ └── spike_utils.h
├── user
│ ├── app_helloworld.c
│ ├── user.lds
│ ├── user_lib.c
│ └── user_lib.h
└── util
├── functions.h
├── load_store.S
├── snprintf.c
├── snprintf.h
├── string.c
├── string.h
└── types.h
Direktori root terutama berisi dokumen (yaitu, file MD), teks lisensi dan yang penting, file Make (dinamai sebagai Makefile ). Sub-direktori kernel berisi kernel OS, sedangkan sub-direktori pengguna berisi aplikasi yang diberikan (di app_helloworld.c ) serta file kode sumber yang berisi perutean pendukung, yang harus ditempatkan di pustaka pengguna dalam OS yang ditempatkan penuh seperti Linux.
Untuk memahami kernel PKE OS (dari Lab1_1) dan menyelesaikan lab, Anda harus mulai dari aplikasi yang diberikan. Oleh karena itu, kami memulai pariwisata dari pengguna/app_helloworld.c :
1 /*
2 * Below is the given application for lab1_1.
3 *
4 * You can build this app (as well as our PKE OS kernel) by command:
5 * $ make
6 *
7 * Or run this app (with the support from PKE OS kernel) by command:
8 * $ make run
9 */
10
11 #include " user_lib . h "
12
13 int main ( void ) {
14 printu ( "Hello world!n" );
15
16 exit ( 0 );
17 }Dari kode, kita dapat mengamati bahwa ada fungsi yang baru didefinisikan yang disebut printu , yang fungsinya sama dengan printf dari penggunaan harian kita. Alasan kami mendefinisikan fungsi baru alih-alih menggunakan printf adalah bahwa printf sudah didefinisikan dalam newlib rantai alat kompilasi lintas-V RISC-V.
Prototipe dan implementasi printu dapat ditemukan di pengguna/user.h dan pengguna/do_print.c masing -masing.
Setelah menyelesaikan laboratorium (dan melakukan solusi Anda), Anda dapat melanjutkan latihan laboratorium berikut. Misalnya, setelah menyelesaikan LAB1_1, Anda dapat melakukan solusi dengan:
$ git commit -a -m " your comments to lab1_1 "Kemudian, beralih ke lab berikutnya (lab1_2) dengan:
$ git checkout lab1_2_exceptiondan gabungkan solusi Anda di lab sebelumnya oleh:
$ git merge lab1_1_syscall -m " continue lab1_2 "Setelah semua ini, Anda dapat melanjutkan untuk bekerja di LAB1_2.
Catatan : Never Gabungan Laboratorium Tantangan, seperti Lab1_Challenge1_backtrace, Lab2_Challenge1_Pagefaults, dll.
Itu saja. Semoga Anda menikmati!