如何在xv6中添加系统调用/实用程序

sas*_*ank 15 operating-system system-calls xv6

任何人都可以告诉我/指出如何在XV6中添加系统调用/实用程序

谷歌上的详尽搜索是徒劳的,而且通过艰难的方式进行黑客攻击到目前为止还没有成效.

参考书也没有任何帮助世界的例子,从任何帮助开始,非常感谢

Yan*_*ang 48

要添加可以在xv6的shell中调用的系统调用,你应该使用这五个文件

  • sysproc.c在这里添加方法的真实实现
  • syscall.h定义连接到您的实现的系统调用向量的位置
  • user.h定义可以通过shell调用的函数
  • syscall.c external定义连接shell和内核的函数,使用syscall.h中定义的位置将函数添加到系统调用向量
  • usys.S使用宏来定义连接用户对系统调用函数的调用

  • defs.h为新系统调用添加前向声明

  • sysfunc.h将新的系统调用处理程序添加到此文件中,就像"int sys_newsystemcall(void)"

  • 怎么样defs.h? (3认同)

小智 14

我将解释一个在xv6中添加系统调用的简单示例.

假设您必须添加系统调用以获取当前运行的用户程序的地址空间大小.您可以将系统调用命名为getmysize(),并在用户程序中调用此系统调用.

您可以按如下方式编写用户程序.让程序名称为myprog.c我假设您知道如何将用户程序添加到xv6.所以我将在这里略过提及这些步骤,因为它将脱离主题.

#include "types.h"
#include "stat.h"
#include "user.h"

int main(void){
  printf(1,"The size of my address space is %d bytes\n", getmysize());
  exit();
}
Run Code Online (Sandbox Code Playgroud)

编写本程序的目的只是为了演示系统调用的工作原理.

现在我们将系统调用添加到xv6.

首先在文件syscall.h的末尾添加以下行.

#define SYS_getmysize 23
Run Code Online (Sandbox Code Playgroud)

请注意,此处的23可能会更改,具体取决于您要在文件中添加的行之前给出的数字.也就是说,如果系统调用号码在您要添加的行之前的行中为22,那么您的行应该具有数字23.简单就是这样.

现在将以下行添加到syscall.c文件中.

extern int sys_getmysize(void);
Run Code Online (Sandbox Code Playgroud)

并在系统调用数组中,追加以下行.

[SYS_getmysize] sys_getmysize,
Run Code Online (Sandbox Code Playgroud)

在文件sysproc.c中,如果系统调用是与进程处理或内存管理相关的系统调用,那么系统调用的实现就是这样,请按如下方式调用系统调用的实现.

int 
sys_getmysize(void)
{
   return proc->sz;
}
Run Code Online (Sandbox Code Playgroud)

现在在usys.S文件中添加行,

SYSCALL(getmysize)
Run Code Online (Sandbox Code Playgroud)

然后在user.h文件中添加以下内容.这是您的用户程序看到您的系统调用的方式.

int getmysize(void);
Run Code Online (Sandbox Code Playgroud)

好.现在,您已准备好运行用户程序并查看系统调用的运行方式.

当您运行调用系统调用的myprog.c时,将根据我们在此处实现的内容返回此相同程序的地址空间大小.