MIT 6.S081 实验2 笔记与心得

Lab 2:system calls (系统调用)

前言:在本练习中,您将向 xv6 添加一些新的系统调用,这将帮助您了解它们的工作原理,并向您介绍 xv6 内核的一些内部结构。你将在以后的实验室中添加更多系统调用。

准备:在开始编码之前,请阅读 xv6 本书的第 2 章、第 4 章的第 4.3 和 4.4 节以及相关的源文件。

若要启动实验室,请切换到 syscall 分支:

  $ git fetch
  $ git checkout syscall
  $ make clean

这里建议重新下载实验,进行操作:

	$ git clone git://g.csail.mit.edu/xv6-labs-2020
	Cloning into 'xv6-labs-2020'...
	...
	$ cd xv6-labs-2020
	$ git checkout syscall

1. System call tracing(系统调用跟踪)

Question :

在此实验中,你将添加一个系统调用跟踪功能,该功能可能会在调试以后的实验室时帮助你。您将创建一个将控制跟踪的新跟踪系统调用。它应该采用一个参数,一个整数"掩码",其位指定要跟踪的系统调用。例如,为了跟踪 fork 系统调用,程序调用 trace(1 << SYS_fork),其中 SYS_fork 是来自 kernel/syscall.h 的系统调用号。您必须修改 xv6 内核,以便在每个系统调用即将返回时打印出一行,前提是在掩码中设置了系统调用的号码。该行应包含进程 ID、系统调用的名称和返回值; 您不需要打印系统调用参数。跟踪系统调用应启用对调用它的进程及其随后分叉的任何子进程的跟踪,但不应影响其他进程。

Example:

在实验中提供了一个跟踪用户级程序,该程序运行另一个启用了跟踪的程序(请参阅 user/trace.c)。完成后,您应该看到如下输出:

$ trace 32 grep hello README
3: syscall read -> 1023
3: syscall read -> 966
3: syscall read -> 70
3: syscall read -> 0
$
$ trace 2147483647 grep hello README
4: syscall trace -> 0
4: syscall exec -> 3
4: syscall open -> 3
4: syscall read -> 1023
4: syscall read -> 966
4: syscall read -> 70
4: syscall read -> 0
4: syscall close -> 0
$
$ grep hello README
$
$ trace 2 usertests forkforkfork
usertests starting
test forkforkfork: 407: syscall fork -> 408
408: syscall fork -> 409
409: syscall fork -> 410
410: syscall fork -> 411
409: syscall fork -> 412
410: syscall fork -> 413
409: syscall fork -> 414
411: syscall fork -> 415
...
$   
Preparation:

这里将要注意的点列举一下:
(手册里面说的不是很全面,这里建议手动查找:当进行系统调用时,到底哪里进行修改了?)
我这里参考https://tnallen.people.clemson.edu/2019/03/04/intro-to-xv6.html
这篇文章的内核

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值