2021-xv6实验记录(二)
xv6实验记录(二)
一、实验目的:
- 了解系统调用
二、实验内容:
- 完成
trace()
的新系统调用 - 完成
sysinfo()
的新系统调用
三、实验内容
(1)trace()系统调用的实现
(1)首先切换分支,保存实验记录,并清除编译记录
1 | git checkout syscall |
根据实验提示,在MakeFile文件中找到UPROGS
并添加$U/_trace\
打开user
目录可以看到存在一个user/trace.c
文件,观察该文件的源码:
1 | if (trace(atoi(argv[1])) < 0) { |
看到这一段代码中存在trace()
方法的调用【该方法来自user.h】,trace函数接收一个int 类型的整数,返回值类型也是int,如果执行失败返回值为-1。
(2)在user/user.h
中添加函数原型
1 | int trace(int); //NEW ADD |
在user/usys.pl
中添加trace的入口
1 | entry("trace"); //NEW ADD |
在syscall.h
中添加宏定义
1 |
(3)在proc结构体(在kernel/proc.h
)里面添加一个新变量用来存储跟踪号,然后在fork()的时候把结构体里新增加的变量也给复制过去,这样就达到了传参的目的。新的变量是不需要加锁的,因为只会被自己所在的进程使用,所以放在char name[16]
之后
修改kernel/proc.h
添加变量存储跟踪号
1 | // Per-process state |
打开kernel/sysproc.c
添加一个trace函数的具体实现
1 | uint64 //新添加的函数定义 |
打开kernel/proc.c
文件修改fork()
函数在函数中添加一句 safestrcpy(np->mask, p->mask, sizeof(p->mask));
即可
1 | int |
为了将trace打印出来,修改kernel/syscall.c
中的syscall()
函数
1 | extern uint64 sys_trace(void); //NEW ADD |
测试效果
1 | trace 32 grep hello README |
1 | ./grade-lab-syscall trace |
(2)sysinfo()系统调用的实现
(1)将$U/_sysinfotest
添加到 Makefile 中的 UPROGS
(2)在user/user.h
中声明sysinfo() 函数的原型,您需要预先声明struct sysinfo
的存在:修改user/user.h
需要在user.h里再声明一次struct sysinfo的原因是:在参数列表里的参数是看不见本文件外面定义的struct的。
1 | struct stat; |
(3)在user/usys.pl
中添加sysinfo的入口
1 | entry("sysinfo"); //NEW ADD |
(4)在syscall.h
中添加宏定义
1 |
(5)修改kernel/syscall.c
中的syscall()
函数
1 | extern uint64 sys_info(void); |
(6)编辑sysproc.c
文件,先添加函数体
1 | uint64 sys_info(void) { |
(7)打开sysproc.c
文件添加\#include "sysinfo.h"
(8)要获得空闲内存的数目,请向kernel/kalloc.c
添加一个函数kfreemem
1 | // get free memory bytes by count freelist |
(9)要获得进程的数量,请在kernel/proc.c
中添加一个函数proc_num()
1 | // get the number of processes whose state is not UNUSED |
(10)在kernel/defs.h
文件中添加函数原型
1 | uint64 proc_num(void); //NEW ADD |
(11)修改kernel/sysproc.c
文件的sys_info()
的函数体
1 | uint64 sys_info(void) { |
测试效果
1 | ./grade-lab-syscall sysinfo |
四、总测试
- 在xv6-lab-2021的目录下新建time.txt文件,之后输入一个整数代表你做实验的时间,单位是小时。之后就可以运行make grade来测试自己的成绩。
1 | make grade //用来测试自己的实验成绩 |
如果上述测试失败,检查错误原因是否是因为
trace的打印格式有无错误
机器硬件不行,测试时间长,qemu认为超时【解决方法打开目录下的
gradelib.py
文件调整timeout时间】
实验心得:
在Xv6操作系统中完成新增系统调用
trace()
和sysinfo()
的的实现不仅让我更深入地理解了操作系统内核的工作方式,还提供了一种方法来收集有关系统状态和进程信息的数据。查看源码的过程令我头疼的同时也令我切实的学会了一些东西,了解了系统的部分运行效果首先,实现
trace()
调用允许用户程序追踪其他进程的系统调用和退出情况。我学到了如何在进程控制块(PCB)中存储额外的信息,以便程序可以访问。这个经验提高了我对内核数据结构的理解另一个
sysinfo()
系统调用,提供了关于系统整体状态的信息,系统启动时间、总的调用次数等。实现这个系统调用,我了解了操作系统内核如何维护系统状态信息,并且学会了如何将这些信息传递给用户程序。这对于监控系统性能和行为非常有用。
- 标题: 2021-xv6实验记录(二)
- 作者: 忘记中二的少年
- 创建于 : 2023-10-11 17:00:00
- 更新于 : 2023-10-11 17:15:02
- 链接: https://github.com/HandsomeXianc/HandsomeXianc.github.io/2023/10/11/xv6实验记录(二)/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。