Mit6.S081-实验2-System calls

一、System call tracing

1,实验准备

1)阅读xv6 book章节2、4.3、4.4;
2)system call的用户空间代码:user/user.h和user/usys.pl
3)system call的kernel空间代码:kernel/syscall.h和user/syscall.c
4)进程相关代码:kernel/proc.h和kernel/proc.c

2,实验要求

添加一个trace system call调用,可以实现跟踪system call。
此函数入参为一个数字,可以控制跟踪哪些system call。
如:
trace(1<<SYS_fork),trace(10b),trace(2)表示跟踪fork调用;
trace(1<<SYS_read),trace(10 0000b),trace(32),表示跟踪read调用;
trace(10 0010b),trace(34),表示跟踪fork、read调用;
达到的效果:trace 32 grep hello README,表示执行grep hello README时,read system call调用时,进行打印。
在这里插入图片描述

3,system call调用链路

1)在user/user.h做函数声明
2)Makefile调用usys.pl(perl脚本)生成usys.S,里面写了具体实现,通过ecall进入kernel,通过设置寄存器a7的值,表明调用哪个system call
3)ecall表示一种特殊的trap,转到kernel/syscall.c:syscall执行
4)syscall.c中有个函数指针数组,即一个数组中存放了所有指向system call实现函数的指针,通过寄存器a7的值定位到某个函数指针,通过函数指针调用函数

4,trace system call具体实现

1)在kernel/syscall.h中宏定义 #define SYS_trace 22
在这里插入图片描述
2)修改user/usys.pl中新增一个entry
在这里插入图片描述
3)在user/user.h中新增trace函数声明
在这里插入图片描述
3)在kernel/proc.h的proc结构体定义一个字节数组,用于存放mask码
在这里插入图片描述
5)将trace函数的具体实现写在kernel/sysproc.c中
在这里插入图片描述
6)kernel/syscall.c中新增sys_trace函数定义
在这里插入图片描述
7)kernel/syscall.c中函数指针数组新增sys_trace
在这里插入图片描述
8)kernel/syscall.c中新建一个数组存放system_call的名称
在这里插入图片描述
9)kernel/syscall.c中根据mask值打印system call
在这里插入图片描述
10)kernel/proc.c中fork函数调用时,子进程复制父进程的mask
在这里插入图片描述

4,执行效果

在这里插入图片描述
在这里插入图片描述

5,测试效果

在xv6-labs-2020中,执行下面指令,测试程序

./grade-lab-syscall trace

在这里插入图片描述

二、System call sysinfo

1,实验要求

添加一个sysinfo system call调用,可以实现打印可用空间(字节)、可用进程数。
达到的效果:sysinfo
在这里插入图片描述

2,sysinfo system call具体实现

1)在kernel/syscall.h中宏定义 #define SYS_sysinfo 23
在这里插入图片描述
2)修改user/usys.pl中新增一个entry
在这里插入图片描述
3)在user/user.h中新增sysinfo结构体、sysinfo函数声明
在这里插入图片描述
4)kernel/syscall.c中新增sys_trace函数定义
在这里插入图片描述
5)kernel/syscall.c中函数指针数组新增sys_trace;syscall_names新增一个"sysinfo"元素
在这里插入图片描述
6)kernel/proc.h中mask数组长度为24
在这里插入图片描述
7)kernel/kalloc.c中新增函数freemem_size,获取空闲内存数量
在这里插入图片描述
8)kernel/proc.c中新增函数proc_num,获取可用进程数目
在这里插入图片描述
8)kernel/defs.h做出函数声明
在这里插入图片描述
在这里插入图片描述
8)kernel/sysproc.c加入sysinfo.h的header头,新增sysinfo的实现
在这里插入图片描述
在这里插入图片描述
8)新写一个user/sysinfo.c的用户程序
在这里插入图片描述

3,执行效果

在这里插入图片描述

4,测试效果

在xv6-labs-2020中,执行下面指令,测试程序

./grade-lab-syscall sysinfo

在这里插入图片描述

  • 24
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 22
    评论
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值