이 프로젝트는 저장소 华中科技大学操作系统团队 / riscv-pke에서 나옵니다.
지점 에서 볼 수 있듯이 각 지점은 간결한 설명이있는 레벨에 해당합니다.

이것은 로컬 런닝 가능한 패키지가 아니며 , 컴파일 작업을 수행하지 않았습니다. Educoder Online 평가에서 검문소의 답변서로 간주하십시오. 이 프로젝트를 현지에서 실행하려면 공식 Readme 에서 읽고 길을 찾으십시오.
이 서문은 기본 분기에만 표시됩니다.
중국어 문서는 여기에서 찾을 수 있습니다. 아직 영어로 된 전용 문서는 없지만 코드의 인라인 의견과 변수 및 기능에 대한 자체 설명 이름은 PKE의 여정에 도움이됩니다.
PKE는 대학의 CS (컴퓨터 과학) 또는 EECS (전기 공학 및 컴퓨터 과학)를 전공 한 학부생들에게 제공되는 운영 체제 엔지니어링/컴퓨터 시스템 엔지니어링 과정의 교육 목적을위한 오픈 소스 프로젝트 (라이센스 정보에 대한 License.txt 참조)입니다.
PKE는 운영 체제의 엔지니어링 측면 지식 포인트와 다음을 포함하여 일부 컴퓨터 조직/아키텍처를 다루는 일련의 실험실을 제공합니다.
Lab1 (3 Basic Labs+2 Challenge Labs) : 트랩 (Syscalls), 예외 및 인터럽트 (인텔 용어의 IRQ).
Lab2 (3 기본 실험실+2 챌린지 실험실) : 메모리 관리.
Lab3 (3 기본 실험실+2 챌린지 실험실) : 프로세스.
Lab4 (3 기본 실험실) : 장치 및 파일 (Pynq FPGA 보드 + Arduino 장난감 자동차에서 수행).
레포의 실험은 시간이 지남에 따라 상기 목록과 더 많은 실제 실험실과 다를 수 있습니다 (실제 실험실).
운영 체제 공학에 대한 교육 각도에서, Process Management, 파일 시스템 및 다른 많은 모듈과 같은 거의 모든 것을 포함하는 완전하거나 거의 완전한 OS 커널을 사용하는 MIT 6.828 및 Ucore는 Tsinghua University에서 사용한 MIT 6.828 및 UCORE와 같은 많은 유명한 OS 교육 프로젝트 (XV6 (JOS Where 이전))과는 달리 PKE는 완전한 OS 커널이 아닙니다 .
PKE는 주어진 응용 프로그램에 대한 "정당한"OS 커널을 구성하는 것을 강조하는 프록시 커널 (RISC-V 소프트웨어 생태학의 오픈 소스 프로젝트 인 PK에서 제안)을 중심으로 구축되었습니다. 이러한 아이디어를 통해 우리는 단순에서 복잡한 응용 프로그램 세트를 제공하여 OS 커널을 점차적으로 "업그레이드"하는 PKE로 일련의 실험실을 설계합니다. 업그레이드하는 동안 현대 운영 체제에 대한 점점 더 정교한 아이디어를 배울 수 있으며, 더 중요한 것은 실험실을 따라 가면서 함께 플레이 할 수 있습니다.
각 랩에서 PKE는 응용 프로그램 ( "APP_"접두사와 함께 ./user/ 폴더에 배치) 및 불완전한 프록시 OS 커널로 시작합니다. 실험실에서 1) 애플리케이션과 프록시 OS 커널의 상호 작용을 이해해야합니다 (때로는 Spike를 사용하여 모방 된 RISC-V 머신 또는 소프트 RISC-V 코어가있는 FPGA 보드); 2) 주어진 응용 프로그램에서 이해에 기초하여 OS 커널로의 코드를 따르십시오. 3) 프록시 OS 커널을 완료하여 응용 프로그램 (또는 시스템)이 올바르게 부드럽게 실행되도록합니다.
PKE 실험실에서는 각 랩의 코드 규모를 제어하고 최소화하기 위해 최선을 다해 운영 체제의 주요 구성 요소에 집중하고 동시에 노력을 최소화 할 수 있도록 최선을 다했습니다. 코드 척도 감소에 대한 추가 제안이 있으시면 미리 감사드립니다!
1. 운영 체제 설치 (가상 머신 또는 Windows Subversion Linux)
(우선) Ubuntu 16.04lts 이상, 64 비트
2. 크로스 컴파일러 및 emluator를 구축하기위한 도구를 설치하십시오
$ 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-GCC, RISCV64-unknown-elf-GDB, RISCV64-unknown-elf- Objdump 등의 실행 파일을 찾아야합니다.
4. 에뮬레이터 설치 (스파이크)
$ 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 과 같은 실행 파일을 찾아야합니다.
5. 복제 PKE Repo
$ git clone https://github.com/MrShawCode/riscv-pke.git이 단계 후에는 PKE 랩이 포함 된 PKE 디렉토리가 있습니다.
6. PKE 빌드/실행
$ make [run]7. (선택 사항) Debugging을 위해 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의 사용자 모드)로 실행되는 응용 프로그램은 더 높은 권한 모드 (예 : RISC-V의 감독자 또는 기계 모드)에서 수행 해야하는 I/OS와 같은 법적 운영을 자주 수행해야하기 때문에 OS가 이러한 시설을 제공하는 것이 매우 중요합니다.
Lab1_1은 "user/lab1_1_helloworld.c"에서 응용 프로그램을 제공하며, 그 main () 함수는 printf 와 동일한 함수를 갖지만 약간 다른 이름으로 함수 인 printu를 호출합니다. 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 )이 포함됩니다. 커널 하위 디렉토리에는 OS 커널이 포함되어 있으며, 사용자 하위 디렉토리에는 주어진 응용 프로그램 ( APP_Helloworld.c )과 지원 루팅이 포함 된 소스 코드 파일이 포함되어 있으며, 이는 Linux와 같은 본격적인 OS의 사용자 라이브러리에 배치해야합니다.
PKE OS 커널 (Lab1_1)을 이해하고 실험실을 달성하려면 주어진 응용 프로그램에서 시작해야합니다. 따라서 우리는 사용자/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 }코드에서 우리는 인쇄물 이라는 새로 정의 된 함수가 있음을 알 수 있습니다. Printf를 사용하는 대신 새 기능을 정의하는 이유는 Printf가 이미 RISC-V 교차 컴파일 도구 체인의 Newlib에 정의되어 있기 때문입니다.
Printu 의 프로토 타입 및 구현은 각각 사용자/user.h 및 user/do_print.c 에서 찾을 수 있습니다.
실험실을 마치고 (솔루션을 커밋 한 후) 다음 실험실의 연습을 계속할 수 있습니다. 예를 들어 Lab1_1을 마친 후에는 다음을 수행 할 수 있습니다.
$ git commit -a -m " your comments to lab1_1 "그런 다음 다음 실험실 (Lab1_2)으로 전환하십시오.
$ git checkout lab1_2_exception그리고 이전 실험실에서 솔루션을 다음과 같이 병합하십시오.
$ git merge lab1_1_syscall -m " continue lab1_2 "이 모든 후에는 Lab1_2에서 작업 할 수 있습니다.
참고 : lab1_challenge1_backtrace, lab2_challenge1_pagefaults 등과 같은 도전 실험실을 병합하지 마십시오.
그게 다야. 당신이 즐기기를 바랍니다!