Mit6.S081-实验2-System calls

Mit6.S081-实验2-System calls

  • 一、System call tracing
    • 1,实验准备
    • 2,实验要求
    • 3,system call调用链路
    • 4,trace system call具体实现
    • 4,执行效果
    • 5,测试效果
  • 二、System call sysinfo
    • 1,实验要求
    • 2,sysinfo system call具体实现
    • 3,执行效果
    • 4,测试效果

一、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< trace(1< 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码
Mit6.S081-实验2-System calls_第1张图片
5)将trace函数的具体实现写在kernel/sysproc.c中
Mit6.S081-实验2-System calls_第2张图片
6)kernel/syscall.c中新增sys_trace函数定义
在这里插入图片描述
7)kernel/syscall.c中函数指针数组新增sys_trace
Mit6.S081-实验2-System calls_第3张图片
8)kernel/syscall.c中新建一个数组存放system_call的名称
Mit6.S081-实验2-System calls_第4张图片
9)kernel/syscall.c中根据mask值打印system call
Mit6.S081-实验2-System calls_第5张图片
10)kernel/proc.c中fork函数调用时,子进程复制父进程的mask
Mit6.S081-实验2-System calls_第6张图片

4,执行效果

在这里插入图片描述
Mit6.S081-实验2-System calls_第7张图片

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函数声明
Mit6.S081-实验2-System calls_第8张图片
4)kernel/syscall.c中新增sys_trace函数定义
在这里插入图片描述
5)kernel/syscall.c中函数指针数组新增sys_trace;syscall_names新增一个"sysinfo"元素
Mit6.S081-实验2-System calls_第9张图片
6)kernel/proc.h中mask数组长度为24
Mit6.S081-实验2-System calls_第10张图片
7)kernel/kalloc.c中新增函数freemem_size,获取空闲内存数量
Mit6.S081-实验2-System calls_第11张图片
8)kernel/proc.c中新增函数proc_num,获取可用进程数目
Mit6.S081-实验2-System calls_第12张图片
8)kernel/defs.h做出函数声明
Mit6.S081-实验2-System calls_第13张图片
在这里插入图片描述
8)kernel/sysproc.c加入sysinfo.h的header头,新增sysinfo的实现
在这里插入图片描述
Mit6.S081-实验2-System calls_第14张图片
8)新写一个user/sysinfo.c的用户程序
Mit6.S081-实验2-System calls_第15张图片

3,执行效果

在这里插入图片描述

4,测试效果

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

./grade-lab-syscall sysinfo

在这里插入图片描述

你可能感兴趣的:(操作系统)