Этот проект поступает из репозитория 华中科技大学操作系统团队 / RISCV-PKE.
Как вы можете видеть в ветвях , каждая ветвь соответствует уровню с его кратким описанием.

Это не локальный пакет, потому что я не сделал никаких работ компиляции. Просто рассматривайте это как книгу ответов на контрольно -пропускные пункты в онлайн -оценке образования . Если вы хотите запустить этот проект локально, пожалуйста, прочитайте и найдите свой путь в официальной Readme .
Это предисловие будет отображаться только в филиале по умолчанию.
Документы на китайском языке можно найти здесь. По-прежнему нет специальных документов на английском языке, но в наших кодах в наших кодах встроенные комментарии, а также имена для самоочеки переменных и функций помогут в вашем путешествии PKE.
PKE - это проект с открытым исходным кодом (см. Лицензию. TXT для информации о лицензии) для образовательных целей инженерных курсов по производству операционной системы/компьютерной системы, предоставленных студентам, специализируемым в CS (компьютерные науки) или EECS (электротехника и компьютерные науки) в университетах.
PKE предоставляет серию лабораторий, которые охватывают инженерные знания операционной системы, а также некоторые из компьютерных организаций/архитектуры, в том числе:
LAB1 (3 основные лаборатории+2 Labs Challenge): ловушки (Syscalls), исключения и прерывания (IRQ в терминологии Intel).
Lab2 (3 основные лаборатории+2 Labs Challenge): Управление памятью.
LAB3 (3 основные лаборатории+2 Labs Challenge): процессы.
Lab4 (3 Basic Labs): устройство и файл (проводится на плате Pynq FPGA + Arduino Toy Car).
Эксперименты в репо могут быть разными (с более реальными лабораториями) из приведенного выше списка с прохождением времени.
С точки зрения образования по инженерной системе операционной системы, отличающиеся от многих известных образовательных проектов OS (например, XV6 (JOS, когда раньше), используемые в MIT 6.828 и UCORE, преподававшемся в университете Цинхуа), которые используют полные или почти полные ядра ОС, содержащие почти все, как управление процессами, файловые системы и многие другие модули, PKE не является полным OS Kernel (на самом деле, PKE никогда не намеревает.
PKE построен вокруг идеи ядра прокси (предлагаемой в PK, проекте с открытым исходным кодом экологии программного обеспечения RISC-V), который подчеркивает для построения «только что ядро ОС» для данного приложения. С такой идеей мы разрабатываем серию лабораторий в PKE, которые постепенно «обновляют» ядро ОС, давая набор приложений, от простых до сложных. Во время обновлений вы можете изучать все больше и более сложные идеи современных операционных систем и, что более важно, играть с ними, следуя лабораториям, один за другим.
В каждой лаборатории PKE начинается с приложения (помещенного в папку ./user/ , с префиксом «app_» и неполным ядро прокси -ОС. Во время лаборатории необходимо 1) понять взаимодействие между приложением и ядром прокси-ОС (иногда, а также машина RISC-V, эмулируемая с помощью SPIKE или платы FPGA с мягким ядром RISC-V); 2) Следуйте коду из данного приложения к ядру ОС на основе понимания; 3) Заполните ядро прокси -ОС, чтобы сделать приложение (или систему) для правильного и плавно выполнять.
В лабораториях PKE мы старались изо всех сил контролировать и минимизировать шкалу кода каждой лаборатории, надеясь помочь вам оставаться сосредоточенным на ключевых компонентах операционной системы и одновременно минимизировать усилия. Свяжитесь с нами, если у вас есть дальнейшие предложения по сокращению шкалы кода, заранее спасибо!
1. Установите операционную систему (виртуальная машина или подрыв Windows Linux)
(предпочтительный) Ubuntu 16.04lts или выше, 64-битный
2. Установить инструменты для строительства кросс-компилятора и эмлуатора
$ sudo apt-get install autoconf automake autotools-dev curl python3 libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex3. Установите кросс-компилятор 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 installВ вышеупомянутых командах $ (NPROC) означает количество потоков, которые вы хотите вызвать во время здания. Generelly, $ (nproc) должен равняться количеству ядер, которые есть у вашего компьютера. После этого шага вы должны найти исполняемых файлов, таких как RISCV64-unknown-elf-gcc, RISCV64-unknown-elf-gdb, RISCV64-Uncknown-Elf-objdump и многие другие (с префиксом «RISCV64-unknown-elf-elf») в вашем управлении /пате-in-install-riscv-toolchains /bin .
4. Установите эмулятор (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 installПосле этого шага вы должны найти исполняемые файлы, такие как Spike, Spike-Dasm в вашем каталоге /пути к установке-Riscv-Toolchains /Bin .
5. Clone Pke Repo
$ git clone https://github.com/MrShawCode/riscv-pke.gitПосле этого шага у вас будет каталог PKE, содержащий PKE Labs.
6. Стройте/запустить PKE
$ make [run]7. (необязательно) Установить OpenOCD для отладки
$ 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 После установки OpenOCD вы можете отлаживать ядро PKE. Просто используйте следующую команду:
$ make gdbВ этой лаборатории мы собираемся выучить основные предприниматели ловушки (также называемые Syscall во многих учебниках).
Ловушка (например, Printf , которая находится в нашем ежедневном использовании), обычно выдается приложением и эветально обрабатывается ядром. Для ОС очень важно предоставить такой объект, поскольку приложения, работающие в менее привилегированных режимах (например, пользовательский режим в RISC-V), необходимо часто выполнять юридические операции, такие как I/OS, которые требуются для проведения в режимах с более высокими приватными режимами (например, руководителя или машины в RISC-V).
LAB1_1 дает приложение в «user/lab1_1_helloworld.c», чья функция () функция вызывает функцию printu , которая имеет такую же функциональность, что и Printf , но под немного другим именем. Printu определяется в «user/do_print.c» и фактически вызывает ловушку по инструкции Ecall (см. Встроенные сборки в функции do_user_print ).
Структура LAB1_1 указана в следующем:
.
├── 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
Корневый каталог в основном содержит документы (т. Е. Файлы MD), текст лицензии и, что важно, файл MAKE (называемый как MakeFile ). Подразделение ядра содержит ядро ОС, в то время как пользовательский подраздел содержит заданное приложение (в APP_Helloworld.c ), а также файлы исходного кода, содержащие вспомогательные маршруты, которые следует размещать в пользовательской библиотеке в полнофункциональной ОС, таких как Linux.
Чтобы понять ядро Pke OS (из Lab1_1) и выполнить лабораторию, вы должны начать с данного приложения. Поэтому мы начинаем туризм с user/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 }Из кода мы можем заметить, что существует недавно определенная функция, называемая Printu , функциональность которой равна Printf нашего ежедневного использования. Причина, по которой мы определяем новую функцию вместо использования printf , заключается в том, что PrintF уже определен в Newlib цепочки инструментов кросс-компилирования RISC-V.
Прототип и реализацию Printu можно найти в пользователе/user.h и user/do_print.c соответственно.
После того, как вы закончили лабораторию (и совершили ваше решение), вы можете продолжить практику следующих лабораторий. Например, после завершения LAB1_1 вы можете совершить свое решение:
$ git commit -a -m " your comments to lab1_1 "Затем переключитесь на Next Lab (LAB1_2) by:
$ git checkout lab1_2_exceptionи объедините свое решение в предыдущей лаборатории:
$ git merge lab1_1_syscall -m " continue lab1_2 "После всего этого вы можете продолжить работу над LAB1_2.
Примечание : никогда не слияйте Labs Challenge, такие как LAB1_Challenge1_backtrace, Lab2_challenge1_pagefaults и т. Д.
Вот и все. Надеюсь, тебе понравится!