Lab 3: User Process

负责助教:陈可

在本实验中,我们将完善 Lab2 中实现的进程概念,在系统中运行简单的用户态进程。

1. 更新

  • 更新了信号量的规则,引入了信号量的锁定和解锁机制,便于借助信号量实现更丰富的同步功能。详见 common/sem.ccommon/sem.h 。不影响原有代码,但是你可能需要注意一些使用信号量和锁带来的并发问题。

  • 在通过 Lab2 的测试后,请将activate_proc中 「若thisproc()->state==ZOMBIE则panic」 的规则去除(如果你是这样写的话)。如果thisproc()->state==ZOMBIE,请不做任何操作,并返回false。这项改动有助于你编写kill函数。

  • 在时钟中断上抽象出了CPU定时器的概念。详见 kernel/cpu.ckernel/cpu.h

  • sched 函数中添加了 attach_pgdir(&next->pgdir) ,用于在进入用户态时设置页表。

  • 修复了 common/list.cqueue_push 没有增加 x->sz 的问题。

2. 服务器操作

运行以下命令进行代码的拉取与合并

# 拉取远端仓库
git fetch --all

# 提交你的更改
git add .
git commit -m "your commit message"

# 切换到新lab的分支
git checkout lab3

# 新建一个分支,用于开发
git checkout -b lab3-dev

# 引入你在上个lab的更改
git merge lab2-dev

如果合并发生冲突,请参考错误信息自行解决。

3. 页表

理论课中已经学习过分页内存管理的概念。AArch64将64位虚拟地址分为0xffff开头的和0x0000开头的两部分,分别成为高地址和低地址。在我们的实验中,内核代码使用的内存被映射到高地址,用户代码使用的内存被映射到低地址。

高地址的页表基地址寄存器为ttbr1,低地址的页表基地址寄存器为ttbr0。这两个寄存器都只能在内核模式下访问,他们保存相应页表的物理地址。在我们的实验中,默认使用4KB页大小的4级页表,你可以参考ARM Manual,了解此类页表的具体结构,对于实验中出现的简单情况,也可以参考上课时的讲解。页表中的大多数特性我们的实验并没有用到,但了解详细情况有助于你后续扩展功能。

4. 系统调用

系统调用(system call),指运行在用户空间的程序向操作系统内核请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。大多数系统交互式操作需求在内核态执行。如设备IO操作或者进程间通信。

用户程序运行在受限的上下文下,如需访问系统资源,需要通过系统调用陷入内核态,由内核处理请求。系统调用类似于一种特殊的异常,用户程序执行系统调用指令(svc)后,陷入内核态,内核在trap_global_handler中识别出类型,然后执行相应操作。

我们的实验采用通用的系统调用约定:x8寄存器存放请求的系统调用id,x0-5寄存器存放系统调用的六个参数。系统调用返回时,设置x0寄存器为系统调用的返回值。

5. 任务

我们在user_proc.c中编写了用户页表和用户进程相关的测试代码,在cpu.c中通过CPU定时器添加了CPU定时输出消息的代码。如果一切正常,你将看到vm_test PASSuser_proc_test PASS

测试还会输出4个CPU和22个进程的工作量,请确认CPU和进程间的相对工作量是否分别基本平衡。

6. 提交

提交方式:将实验报告提交到 elearning 上,格式为 学号-lab3.pdf

注意:从lab1开始,用于评分的代码以实验报告提交时为准。如果需要使用新的代码版本,请重新提交实验报告。

截止时间10月25日23:59

报告中可以包括下面内容

  • 代码运行效果展示

  • 实现思路和创新点

  • 对后续实验的建议

  • 其他任何你想写的内容

    你甚至可以再放一只可爱猫猫

报告中不应有大段代码的复制。如有使用本地环境进行实验的同学,请联系助教提交代码(最好可以给个git仓库)。使用服务器进行实验的同学,助教会在服务器上检查,不需要另外提交代码。

在服务器上操作的同学,此次实验完成后请提交(或者说创建一个新分支)到 lab3-submission 分支,助教会使用你在此分支上提交记录来批作业。如果此分支最后提交时间晚于实验报告提交时间,助教会选择此分支上在实验报告提交时间前的最后一个提交作为批改代码。

提交操作

# 提交最后的代码
git add .
git commit -m "your final commit message"

# 新建一个分支,用于提交
git checkout -b lab3-submission

Last updated