引言¶
本章导读¶
注解
基于github classroom的开发方式
基于github classroom,可方便建立开发用的git repository,并可基于github的 codespace (在线版ubuntu +vscode)在线开发使用。整个开发环境仅仅需要一个网络浏览器。
在网络浏览器中用自己的 github id 登录 github.com
接收 第三个实验(os5)的github classroom在线邀请 ,根据提示一路选择OK即可。
完成第二步后,你的第三个实验的 github repository 会被自动建立好,点击此github repository的链接,就可看到你要完成的第一个实验了。
在你的第三个实验的网页的中上部可以看到一个醒目的 code 绿色按钮,点击后,可以进一步看到 codespace 标签和醒目的 create codesapce on main 绿色按钮。请点击这个绿色按钮,就可以进入到在线的ubuntu +vscode环境中
再按照下面的环境安装提示在vscode的 console 中安装配置开发环境:rustc,qemu等工具。注:也可在vscode的 console 中执行
make codespaces_setenv来自动安装配置开发环境(执行``sudo``需要root权限,仅需要执行一次)。在vscode的 console 中执行 make setupclassroom_test5 (该命令仅执行一次)配置githubclassroom 自动评分功能。
然后就可以基于在线vscode进行开发、运行、提交等完整的实验过程了。
上述的3,4,5步不是必须的,你也可以线下本地开发。
注:如果是本地的ubuntu中建立开发环境,可在shell中执行 make ubuntu_local_setenv 来自动安装配置开发环境(执行``sudo``需要root权限,仅需要执行一次)。
我们将开发一个用户 终端 (Terminal) 或 命令行 (Command Line Application, 俗称 Shell ) , 形成用户与操作系统进行交互的命令行界面 (Command Line Interface)。
为此,我们要对任务建立新的抽象: 进程 ,并实现若干基于 进程 的强大系统调用。
注解
任务和进程的关系与区别
第三章提到的 任务 是这里提到的 进程 的初级阶段,与任务相比,进程能在运行中创建 子进程 、 用新的 程序 内容覆盖已有的 程序 内容、可管理更多物理或虚拟 资源 。
实践体验¶
在 qemu 模拟器上运行`lab3(os5)参考框架: <https://github.com/LearningOS/rCore-Tutorial-Code-2022A/tree/main/os5>`_ :
$ git clone ``gitaddr of github-classroom-build-lab3``
$ cd ``github-classroom-build-lab3``
$ make setupclassroom_test5 //注意:这一步很重要,是用于github classroom自动评测你的工作。这一步只需在首次克隆项目仓库时执行一次,以后一般就不用执行了,除非 .github/workflows/classroom.yml发生了变化。
$ cd os5
$ make run
注解
实验名称 :实验编号
lab0-0 : test1
lab0-1:test2
lab1:test3
lab2:test4
lab3:test5
lab4:test6
lab5:test8
待内核初始化完毕之后,将在屏幕上打印可用的应用列表并进入shell程序:
[rustsbi] RustSBI version 0.2.0-alpha.4
.______ __ __ _______.___________. _______..______ __
| _ \ | | | | / | | / || _ \ | |
| |_) | | | | | | (----`---| |----`| (----`| |_) || |
| / | | | | \ \ | | \ \ | _ < | |
| |\ \----.| `--' |.----) | | | .----) | | |_) || |
| _| `._____| \______/ |_______/ |__| |_______/ |______/ |__|
[rustsbi] Implementation: RustSBI-QEMU Version 0.0.1
[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: 0x80000000 ..= 0x800fffff (rwx)
[rustsbi] pmp1: 0x80000000 ..= 0x807fffff (rwx)
[rustsbi] pmp2: 0x0 ..= 0xffffffffffffff (---)
[rustsbi] enter supervisor 0x80200000
[kernel] Hello, world!
/**** APPS ****
ch2b_bad_address
ch2b_bad_instructions
ch2b_bad_register
ch2b_hello_world
ch2b_power_3
ch2b_power_5
ch2b_power_7
ch3b_sleep
ch3b_sleep1
ch3b_yield0
ch3b_yield1
ch3b_yield2
ch5b_exit
ch5b_forktest
ch5b_forktest2
ch5b_forktest_simple
ch5b_forktree
ch5b_initproc
ch5b_user_shell
**************/
Rust user shell
>>
可以通过输入ch5b开头的应用来测试ch5实现的fork等功能:
>> ch5b_forktest_simple
sys_wait without child process test passed!
parent start, pid = 2!
ready waiting on parent process!
hello child process!
child process pid = 3, exit code = 100
Shell: Process 2 exited with code 0
lab3(os5)参考框架:¶
1├── os5
2 ├── build.rs(修改:基于应用名的应用构建器)
3 ├── ...
4 └── src
5 ├── ...
6 ├── loader.rs(修改:基于应用名的应用加载器)
7 ├── main.rs(修改)
8 ├── mm(修改:为了支持本章的系统调用对此模块做若干增强)
9 │ ├── address.rs
10 │ ├── frame_allocator.rs
11 │ ├── heap_allocator.rs
12 │ ├── memory_set.rs
13 │ ├── mod.rs
14 │ └── page_table.rs
15 ├── syscall
16 │ ├── fs.rs(修改:新增 sys_read)
17 │ ├── mod.rs(修改:新的系统调用的分发处理)
18 │ └── process.rs(修改:新增 sys_getpid/fork/exec/waitpid)
19 ├── task
20 │ ├── context.rs
21 │ ├── manager.rs(新增:任务管理器,为上一章任务管理器功能的一部分)
22 │ ├── mod.rs(修改:调整原来的接口实现以支持进程)
23 │ ├── pid.rs(新增:进程标识符和内核栈的 Rust 抽象)
24 │ ├── processor.rs(新增:处理器管理结构 ``Processor`` ,为上一章任务管理器功能的一部分)
25 │ ├── switch.rs
26 │ ├── switch.S
27 │ └── task.rs(修改:支持进程机制的任务控制块)
28 └── trap
29 ├── context.rs
30 ├── mod.rs(修改:对于系统调用的实现进行修改以支持进程系统调用)
31 └── trap.S
32
33cloc os
34-------------------------------------------------------------------------------
35Language files blank comment code
36-------------------------------------------------------------------------------
37Rust 29 180 138 2049
38Assembly 4 20 26 229
39make 1 11 4 36
40TOML 1 2 1 13
41-------------------------------------------------------------------------------
42SUM: 35 213 169 2327
43-------------------------------------------------------------------------------