目录
一、前言
MIT麻省理工学院本科操作系统课程,本次操作系统课程实践的任务是:借助现有的xv6环境,熟悉xv6内核相关代码,根据操作系统内核实现逻辑添加相关的系统调用,包括进程管理相关:ps()、pstree()、getprocount()、getppid()
,内存管理相关:getfreemem()、vmprint()
函数,文件管理相关:umask()、chmod()、ls()、ls -a、symlink、lseek、cdd()、pwd()、cat --help
等。
二、预备知识
2.1 用户程序的编写,以helloworld为例
Step 1: user/
路径下编写helloworld.c
用户程序
Step 2: 修改xv6-labs-2021
目录下的Makefile
文件。命令:vim Makefile
按照格式$U/_**\
完成配置工作:找到UPROGS,添加$U/_helloworld\
。
Step 3: 在xv6-labs-2021
目录下执行make qemu
,进行测试。
执行***
,得到运行结果。(注:***为编写的用户程序名)
注意!: 这里编写的用户程序与一般的C/C++有所区别,需要注意以下两点。
1.导库:与C/C++类似,这里常用的头文件包括"kernel/param.h"、"kernel/types.h"、"user/user.h"
2.不要return 0、要exit(0)
,否则编译会出错。
2.2 系统调用的编写,以ps系统调用为例
Step 1: 修改用户代码
user/usys.pl
添加系统调用函数的定义
user/user.h
添加入口entry("ps")
Step 2: 修改内核代码
kernel/syscall.h
定义系统调用号
kernel/syscall.h
syscalls函数指针数组中添加对应的函数
kernel/syspro.c
将系统调用与功能函数关联起来
kernel/pro.c
实现具体的系统调用函数功能
Step 3: 编写应用工具
user/ps.c
Step 4: 修改Makefile
,将$U/_ps\
添加到Makefile
的UPROGS
中
Step 5: make qemu
,然后测试
补充于3月10日,答辩PPT
三、Makefile深入解读
3.1 前言
在实验过程中,多次遇到 make:*** No rule to make target ‘user/_ps’,needed by ’fs.img’.Stop.
错误,导致在编写相关系统调用的过程中频频出错。因此,通过调用一些命令探究make qemu、make clean等命令的执行过程对分析问题是相当重要的,有助于我们进一步调试。
3.2 Makefile核心格式
Makefile的核心格式为:目标:目标的依赖1 目标的依赖2 【目标依赖得到满足后执行的代码】
定义一个目标,后面写明一个目标依赖,当这个目标依赖的目标已经存在时,便通过下面的命令来产生该目标。
我们先来拿一下例子来具体的理解一下Makefile内部的工作机理。
如下图右下角所示,我们需要完成的目标是包饺子,需要的依赖(材料)是饺子皮和肉馅,当二者满足后执行的操作是用饺子皮包裹肉馅。同时,对于目标饺子皮又有两个依赖:面粉和水,当两者满足时执行下面的操作。即和面和擀面,然后得到饺子皮,完成总目标的一个依赖,接下来再去完成肉馅这个依赖,依次下去。
我们可以发现这是一个深度遍历的过程,make也是通过类似的方式对Makefile执行深度遍历来解析这些依赖关系并生成它们。
3.3 xv6系统
对于xv6系统而言,总目标为:make qemu
,依赖于$K/kernel
以及fs.img
。Kernel
是负责生成内核的可执行文件,也就是最终编译得到的操作系统内核。fs.img
负责生成文件系统的镜像,用于存放所有用户程序的硬盘。
四、推荐MIT6.S081学习路线
- 编写第一个用户程序
- 阅读xv6代码,了解关于进程管理、内存管理、文件管理的内容
- 熟悉xv6系统用户程序与内核程序进行参数传递的几个函数
- 编写第一个系统调用
- 编写带参数的系统调用,例如
ls -a
可以参见下面的流程进行学习:
来源:答辩PPT