📜  Xv6操作系统-添加新的系统调用

📅  最后修改于: 2021-08-27 07:27:09             🧑  作者: Mango

先决条件– 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"