先决条件– Xv6操作系统-添加用户程序
在上一篇文章中,我们了解了如何在Xv6操作系统中添加用户程序。现在,您将在此处看到如何在Xv6操作系统中添加新的系统调用。
向xv6添加新的系统调用:
系统调用是程序与操作系统进行交互的方式。当计算机程序向操作系统的内核发出请求时,便会进行系统调用。系统调用用于硬件服务,创建或执行进程以及与内核服务进行通信,包括应用程序和进程调度。
概述 :
您将实现名为getyear的系统调用,该调用将始终从内核返回1975。 Unix版本6是在那年发布的。为了在xv6中定义自己的系统调用,您需要对5个文件进行更改。即,这些文件如下。
为了在xv6中定义自己的系统调用,您需要对5个文件进行更改。即,这些文件如下。
创建系统调用以返回Unix版本6已发布的年份:
您可以从syscall.h文件开始工作,该文件已为该Xv6系统中的每个系统调用分配了编号。如您所见,此文件中已经定义了21个系统调用。让我们继续,为您自己的系统调用添加以下行,以重新存储系统调用号。
#define SYS_getyear 22
接下来,您需要在syscall.c文件中添加指向系统调用的指针。该文件包含一个函数指针数组,该函数指针使用上面定义的数字(索引)作为指向在不同位置定义的系统调用的指针。为了添加您的自定义系统调用,请在此文件中添加以下行。
[SYS_getyear] sys_getyear
这里会发生什么变化?
这意味着,当系统调用系统调用号22出现,函数指向的函数指针sys_getyear将被调用。因此,您必须实现此函数。但是,此文件不是您要实现它的地方。您只需将函数原型放在此文件中。
因此,在此文件内找到合适的位置并添加以下行。您可以看到所有其他21个系统调用函数的定义都是类似的。
需要添加到syscall.c文件中的函数原型如下。
extern int sys_getyear(void)
接下来,您将实现系统调用函数。为此,请打开定义了系统调用函数的sysproc.c文件。
//return the year of which
//Unix version 6 was released
int
sys_getyear(void)
{
return 1975;
}
现在您只需要编辑两个小文件,这些文件将包含用户程序访问系统调用的界面。打开名为usys.S的文件,并在下面添加以下行。
SYSCALL(getyear)
接下来,打开名为user.h的文件并添加以下行。这是函数,用户程序将被调用。如您现在所知,系统中没有实现此类函数。相反,从用户程序对下面函数的调用将被简单地映射到系统调用号22,该系统调用号定义为SYS_getyear预处理程序指令。系统知道此系统调用确切是什么以及如何处理它。
int getyear(void);
如果已完成上述所有过程,则已成功将新的系统调用添加到xv6。但是,为了测试其功能,您需要添加调用此系统调用的用户程序。
用户程序可以如下:
#include "types.h"
#include "stat.h"
#include "user.h"
int main(void)
{
printf(1, "Note: Unix V6 was released in year %d\n", getyear());
exit();
}
为了将此用户程序添加到xv6,您需要按照上述步骤添加用户程序。最后,在qemu窗口中运行用户程序,该程序可以通过在终端上运行命令make qemu获得。
成功执行所有操作后,您将进入终端。
输出:
"Note:Unix V6 was released in year 1975"