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

时间:2011-11-05 17:08:05

标签: operating-system system-calls xv6

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

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

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

3 个答案:

答案 0 :(得分:48)

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

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

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

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

答案 1 :(得分:13)

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

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

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

DF
    RS     Pub_SNP   SNP    B     newB
    rs_1    G         G     0.1   0.1
    rs_2    C         A    -0.2   0.2
    rs_3    A         T     0.3   0.3
    rs_4    T         C    -0.4   0.4
    rs_5    T         G     0.5  -0.5

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

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

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

#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();
}

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

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

#define SYS_getmysize 23

并在系统调用数组中,在。

中追加以下行
extern int sys_getmysize(void);

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

[SYS_getmysize] sys_getmysize,

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

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

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

SYSCALL(getmysize)

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

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

答案 2 :(得分:5)