西南能矿建设工程公司网站,免费的成品网站,wordpress 对比,全网最大的精品网站本Lab包括两个简单系统调用的实现#xff0c;进一步熟悉系统调用接口。 笔者用时约1.5h
概述
根据文档说明#xff0c;当我们添加一个系统调用时#xff0c;比如第一个任务是添加一个trace#xff0c;需要进行以下操作#xff1a;
首先将系统调用的原型添加到user/user…本Lab包括两个简单系统调用的实现进一步熟悉系统调用接口。 笔者用时约1.5h
概述
根据文档说明当我们添加一个系统调用时比如第一个任务是添加一个trace需要进行以下操作
首先将系统调用的原型添加到user/user.h中比如trace函数接收一个参数作为掩码其函数原型如下图所示。 然后添加一个存根到user/usys.pl中如下图所示。 将系统调用编号添加到kernel/syscall.h中如下图所示。 在kernel/sysproc.c中添加相关的系统调用函数即可如sys_trace函数实现对应的功能即可。 Tracing
该部分需要我们实现一个系统调用追踪功能需要一个参数mask进行系统调用掩码设置每一位表示是否追踪该编号的系统调用比如第1位为1则表示想要追踪系统调用编号为1的系统调用即fork系统调用编号定义在syscall.h文件中跟踪所设置的系统调用输出进程编号、系统调用名称和返回值等信息。
按照概述中的描述添加好必要的变量之后与函数声明之后需要实现kernel/sysproc.c中的sys_trace函数。 首先需要获取用户空间中的参数mask参考kernel/sysproc.c中其他函数的实现比如sys_exit函数不难看出使用argint函数即可获取整形参数。 获取到参数之后需要在进程状态结构体中定义在kernel/proc.c中多维护一个字段即当前的追踪掩码并修改fork函数定义在kernel/proc.c中使得子进程也继承这个掩码。 最后在syscall函数定义在kernel/syscall.c中即将返回时根据掩码判断当前系统调用的编号是否被追踪如果被追踪则输出相关信息即可需要添加一个系统调用名称数组方便输出。
Sysinfo
这一部分需要我们实现一个能够收集系统活跃进程数nprocstate字段不为UNUSED的进程数和系统剩余内存空间字节数freemem的系统调用。
同样按照概述所说在各个文件中添加信息然后开始实现sys_sysinfo函数。 首先利用预先定义好的结构体sysinfo定义在kernel/sysinfo.h中获取空闲内存量和进程数。 获取空闲内存量需要在kernel/kalloc.c中添加一个函数通过将结构体指针作为参数访问其中定义的kmem结构体中维护的一个链表链表中每一个节点都表示4096个字节的空间并计算空闲内存赋值给结构体指针指向的freemem进行空闲内存量的返回。 获取进程数需要在kernel/proc.c中添加一个函数也是通过将结构体指针作为参数遍历系统中维护的进程数组计算活跃进程数并赋值给指针指向的nproc进行返回即可。