2011-11-05 956 views
12

任何一个可以告诉我/点我如何在XV6我如何在XV6添加一个系统调用/实用

添加一个系统调用/效用的任何引用

在谷歌穷举搜索是徒劳和黑客硬盘的方式到目前为止还没有生产力。

参考书也没有任何的hello world例子开始与 任何帮助非常感谢

回答

39

要添加一个系统调用,可以是称为XV6的外壳, 你应该这样东西与五档

  • sysproc.c添加真正的实现你这里的方法
  • syscall.h定义连接到您的实现
  • user.h定义可通过外壳调用该函数的系统调用矢量的位置
  • syscall.c外部限定连接所述外壳和内核的功能,使用于syscall.h限定的位置到函数添加到系统调用矢量
  • 个usys.S使用宏来定义用户的呼叫连接到系统调用函数

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

  • sysfunc.h添加新的系统调用处理程序也进入这个文件,比如“int sys_newsystemcall(void)”
+3

defs.h怎么样? –

+0

正确的你是Reut,defs.h也是必需的。 – itzhaki

5

我将解释一个在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调用你的系统调用时,这个程序的地址空间大小将根据我们在这里实现的内容返回。

相关问题