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

Operating system 如何在xv6中添加系统调用/实用程序,operating-system,system-calls,xv6,Operating System,System Calls,Xv6,有人能告诉我/告诉我如何在XV6中添加系统调用/实用程序吗 在谷歌上进行彻底的搜索是徒劳的,艰难的黑客攻击到目前为止也没有效果 这本参考书也没有任何hello world的例子 非常感谢您的帮助请阅读以下内容: 它很好地解释了添加一个可以在xv6的shell中调用的系统调用, 你应该用这五个文件做点什么 sysproc.c在此处添加方法的实际实现 syscall.h定义连接到实现的系统调用向量的位置 user.h定义可以通过shell调用的函数 syscall.c外部定义连接shell和内核的

有人能告诉我/告诉我如何在XV6中添加系统调用/实用程序吗

在谷歌上进行彻底的搜索是徒劳的,艰难的黑客攻击到目前为止也没有效果

这本参考书也没有任何hello world的例子 非常感谢您的帮助

请阅读以下内容:

它很好地解释了添加一个可以在xv6的shell中调用的系统调用, 你应该用这五个文件做点什么

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

  • defs.h为新系统调用添加转发声明

  • sysfunc.h将新的系统调用处理程序添加到此文件中,类似于“int sys\u newsystemcall(void)”

我将解释一个在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);
在syscalls数组中,在中追加以下行

[SYS_getmysize] sys_getmysize,
在文件sysproc.c中,如果系统调用是与进程处理或内存管理相关的系统调用,那么系统调用的实现就是在该文件中进行的,请按如下方式放置系统调用的实现

int 
sys_getmysize(void)
{
   return proc->sz;
}
现在在usys.S文件中,添加行

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

int getmysize(void);
嗯。现在,您已经准备好运行用户程序,并查看系统调用如何运行


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

没错,您是Reut,还需要defs.h。您也可以在sysfile.c中实现系统调用。