15

谁能告诉我/指出任何关于如何在 XV6 中添加系统调用/实用程序的参考资料

在 google 上进行详尽的搜索是徒劳的,而且到目前为止,用艰难的方式进行黑客攻击也没有成效。

参考书也没有任何 hello world 示例开始,非常感谢任何帮助

4

3 回答 3

51

要添加可以在 xv6 的 shell 中调用的系统调用,您应该对这五个文件进行一些操作

  • sysproc.c在此处添加您的方法的实际实现
  • syscall.h定义连接到您的实现的系统调用向量的位置
  • user.h定义了可以通过shell调用的函数
  • syscall.c外部定义连接外壳和内核的函数,使用syscall.h中定义的位置将函数添加到系统调用向量中
  • ussys.S使用宏定义连接用户调用到系统调用函数

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

  • sysfunc.h 也将新的系统调用处理程序添加到此文件中,如“int sys_newsystemcall(void)”
于 2012-11-03T01:24:54.083 回答
15

我将解释一个在 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();
}

编写此程序的目的只是为了演示系统调用的工作。

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

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

#define SYS_getmysize 23

请注意,此处的 23 可能会根据您要添加到文件中的行之前给出的数字而改变。也就是说,如果系统调用号是您要添加的行之前的行中的 22,那么您的行应该有 23 号。就这么简单。

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

extern int sys_getmysize(void);

并在系统调用数组中,附加以下行。

[SYS_getmysize] sys_getmysize,

在文件sysproc.c中,如果它是与进程处理或内存管理相关的系统调用,则系统调用的实现所在的位置,将我们的系统调用的实现如下所示。

int 
sys_getmysize(void)
{
   return proc->sz;
}

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

SYSCALL(getmysize)

然后在user.h文件中,添加以下内容。这就是您的用户程序如何看待您的系统调用。

int getmysize(void);

行。现在您已准备好运行您的用户程序并查看您的系统调用是如何运行的。

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

于 2016-05-28T11:22:53.323 回答
5

阅读:http: //zoo.cs.yale.edu/classes/cs422/2010/xv6-book/trap.pdf
它解释得很好

于 2012-02-23T08:09:30.850 回答