Skip to content

Commit 8bbbde8

Browse files
fix: Update hint style
1 parent 6e46977 commit 8bbbde8

File tree

1 file changed

+36
-42
lines changed

1 file changed

+36
-42
lines changed

docs/lab/lab3.md

Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -52,43 +52,38 @@ git merge lab2-dev
5252

5353
## 5. 任务
5454

55-
{% hint style="success" %}
56-
**任务1**
57-
58-
完成页表配置的相关代码。我们在`Proc`中添加了`pgdir`项,存储进程的用户态内存空间的相关信息。`pgdir`是定义在`pt.h`中的结构体,`pgdir.pt`指向进程的用户页表。如果进程是纯内核态进程,则`pgdir.pt`可以为空。该结构体在后续实验中还会加入内容,我们这里暂时不用关心。
59-
60-
* 你需要完成`pt.c`中的`get_pte`函数。该函数遍历给定的`pgdir`,从中找到对应于指定虚拟地址的页表项,并返回页表项的指针。如果页表项不存在(即其所在的页表未创建),若alloc标记为true,则创建和配置页表项所在的页表及其上级页表(如果需要),然后返回有效的页表项指针,否则返回NULL。(返回的指针指向的页表项可以是无效的。请注意区分页表项和它所引用的物理页。)
61-
* 你需要完成`pt.c`中的`free_pgdir`函数。该函数释放给定的`pgdir`。请注意只要释放页表本身所占的空间,不要释放页表所引用的物理页。(页表所引用的物理页目前由测试代码直接管理。在后续实验中,我们会逐渐完成相关的代码,本次实验只要求大家完成页表本身的操作。)
62-
* 你可能需要在`proc.c``init_proc`中加入`init_pgdir`,在`exit`中加入`free_pgdir`
63-
{% endhint %}
64-
65-
{% hint style="success" %}
66-
**任务2**
67-
68-
完成系统调用的相关代码。我们在`trap.c`中已经提供了在系统调用时调用`syscall_entry`的代码,你需要完成`syscall.c`中的`syscall_entry`函数。该函数传入UserContext作为参数,请从中提取出相应的寄存器,查询`syscall_table`,执行指定的系统调用,并将系统调用的返回值保存到指定的寄存器。
69-
{% endhint %}
70-
71-
{% hint style="success" %}
72-
**任务3**
73-
74-
修改你的UserContext。你需要保证UserContext中有spsr、elr、sp(`sp_el0`)寄存器,并结合你的UserContext 添加 `test/user_proc.c` 中的 TODO 部分。
75-
{% endhint %}
76-
77-
{% hint style="success" %}
78-
**任务4**
79-
80-
完成结束进程相关的代码。结束进程的逻辑参考了xv6和Linux的设计。我们在`proc.c`中添加了一个函数`kill`。调用kill会设置指定进程的killed标记,并唤醒进程,阻止进程睡眠。进程在返回用户态时会检查killed标记,若有则调用exit退出。
81-
82-
* 实现`proc.c`中的`kill`函数。该函数遍历进程树,搜索指定pid且状态不为unused(可参考`sched.c`中给出的`is_unused`,访问调度信息时加锁是个好习惯,但这里其实不加锁也没啥事)的进程,如果进程不存在,返回-1。对于找到的进程,设置`struct proc``killed`标记,并调用`activate_proc`唤醒进程。完成之后,返回0。请注意使用进程树的锁。
83-
* 修改你的`sched`代码,使其能够保证,如果当前进程带有killed标记,且new state不为zombie,则调度器直接返回,不做任何操作。(为什么?)
84-
*`aarch64/trap.c``trap_global_handler`函数的末尾加上检查,如果当前进程有killed标记且即将返回到用户态,则调用`exit(-1)`
85-
{% endhint %}
86-
87-
{% hint style="success" %}
88-
**任务5**
89-
90-
改进你的调度器。Lab2的内核进程调度是非抢占式的,Lab3要求大家进行抢占式的调度,你可能需要在调度器中加入时钟中断相关的代码,并注意**调度的公平性问题**。另请注意:我们现在在时钟中断的基础上封装了一层CPU定时器的抽象,**请使用CPU定时器**
91-
{% endhint %}
55+
> [!success]
56+
> **任务1**
57+
>
58+
> 完成页表配置的相关代码。我们在`Proc`中添加了`pgdir`项,存储进程的用户态内存空间的相关信息。`pgdir`是定义在`pt.h`中的结构体,`pgdir.pt`指向进程的用户页表。如果进程是纯内核态进程,则`pgdir.pt`可以为空。该结构体在后续实验中还会加入内容,我们这里暂时不用关心。
59+
>
60+
> * 你需要完成`pt.c`中的`get_pte`函数。该函数遍历给定的`pgdir`,从中找到对应于指定虚拟地址的页表项,并返回页表项的指针。如果页表项不存在(即其所在的页表未创建),若alloc标记为true,则创建和配置页表项所在的页表及其上级页表(如果需要),然后返回有效的页表项指针,否则返回NULL。(返回的指针指向的页表项可以是无效的。请注意区分页表项和它所引用的物理页。)
61+
> * 你需要完成`pt.c`中的`free_pgdir`函数。该函数释放给定的`pgdir`。请注意只要释放页表本身所占的空间,不要释放页表所引用的物理页。(页表所引用的物理页目前由测试代码直接管理。在后续实验中,我们会逐渐完成相关的代码,本次实验只要求大家完成页表本身的操作。)
62+
> * 你可能需要在`proc.c``init_proc`中加入`init_pgdir`,在`exit`中加入`free_pgdir`
63+
64+
> [!success]
65+
> **任务2**
66+
>
67+
> 完成系统调用的相关代码。我们在`trap.c`中已经提供了在系统调用时调用`syscall_entry`的代码,你需要完成`syscall.c`中的`syscall_entry`函数。该函数传入UserContext作为参数,请从中提取出相应的寄存器,查询`syscall_table`,执行指定的系统调用,并将系统调用的返回值保存到指定的寄存器。
68+
69+
> [!success]
70+
> **任务3**
71+
>
72+
> 修改你的UserContext。你需要保证UserContext中有spsr、elr、sp(`sp_el0`)寄存器,并结合你的UserContext 添加 `test/user_proc.c` 中的 TODO 部分。
73+
74+
> [!success]
75+
> **任务4**
76+
>
77+
> 完成结束进程相关的代码。结束进程的逻辑参考了xv6和Linux的设计。我们在`proc.c`中添加了一个函数`kill`。调用kill会设置指定进程的killed标记,并唤醒进程,阻止进程睡眠。进程在返回用户态时会检查killed标记,若有则调用exit退出。
78+
>
79+
> * 实现`proc.c`中的`kill`函数。该函数遍历进程树,搜索指定pid且状态不为unused(可参考`sched.c`中给出的`is_unused`,访问调度信息时加锁是个好习惯,但这里其实不加锁也没啥事)的进程,如果进程不存在,返回-1。对于找到的进程,设置`struct proc``killed`标记,并调用`activate_proc`唤醒进程。完成之后,返回0。请注意使用进程树的锁。
80+
> * 修改你的`sched`代码,使其能够保证,如果当前进程带有killed标记,且new state不为zombie,则调度器直接返回,不做任何操作。(为什么?)
81+
> *`aarch64/trap.c``trap_global_handler`函数的末尾加上检查,如果当前进程有killed标记且即将返回到用户态,则调用`exit(-1)`
82+
83+
> [!success]
84+
> **任务5**
85+
>
86+
> 改进你的调度器。Lab2的内核进程调度是非抢占式的,Lab3要求大家进行抢占式的调度,你可能需要在调度器中加入时钟中断相关的代码,并注意**调度的公平性问题**。另请注意:我们现在在时钟中断的基础上封装了一层CPU定时器的抽象,**请使用CPU定时器**
9287
9388
我们在`user_proc.c`中编写了用户页表和用户进程相关的测试代码,在`cpu.c`中通过CPU定时器添加了CPU定时输出消息的代码。如果一切正常,你将看到`vm_test PASS``user_proc_test PASS`
9489

@@ -102,11 +97,10 @@ git merge lab2-dev
10297

10398
**截止时间**:<mark style="color:red;">**11月7日23:59**</mark>。
10499

105-
{% hint style="danger" %}
106-
**逾期提交将扣除部分分数**
107-
108-
计算方式为 $$\text{score}_{\text{final}} = \text{score} \cdot \left(1 - n \cdot 20\% \right)$$,其中 $$n$$ 为迟交天数,不满一天按一天计算)。
109-
{% endhint %}
100+
> [!danger]
101+
> **逾期提交将扣除部分分数**
102+
>
103+
> 计算方式为 $$\text{score}_{\text{final}} = \text{score} \cdot \left(1 - n \cdot 20\% \right)$$,其中 $$n$$ 为迟交天数,不满一天按一天计算)。
110104
111105
报告中可以包括下面内容
112106

0 commit comments

Comments
 (0)