如何在 xv6 中添加系统调用/实用程序
Posted
技术标签:
【中文标题】如何在 xv6 中添加系统调用/实用程序【英文标题】:how do i add a system call / utility in xv6 【发布时间】:2011-12-22 17:37:35 【问题描述】:谁能告诉我/指出任何关于如何在 XV6 中添加系统调用/实用程序的参考
在 google 上进行详尽的搜索是徒劳的,而且到目前为止,用艰难的方式进行黑客攻击也没有成效。
参考书也没有任何 hello world 示例开头 非常感谢任何帮助
【问题讨论】:
【参考方案1】:我将解释一个在 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 调用你的系统调用时,这个程序的地址空间大小将根据我们这里实现的返回。
【讨论】:
【参考方案2】:要添加一个可以在 xv6 的 shell 中调用的系统调用, 您应该对这五个文件进行一些处理
sysproc.c 在此处添加您的方法的实际实现 syscall.h 定义连接到您的实现的系统调用向量的位置 user.h定义可以通过shell调用的函数 syscall.c外部定义连接shell和内核的函数,使用syscall.h中定义的位置将该函数添加到系统调用向量中usys.S使用宏定义连接用户调用到系统调用函数
defs.h为您的新系统调用添加前向声明
sysfunc.h 也将新的系统调用处理程序添加到此文件中,如“int sys_newsystemcall(void)”【讨论】:
对你是 Reut,defs.h 也是必需的。 你也可以在sysfile.c中实现系统调用。【参考方案3】:阅读:http://zoo.cs.yale.edu/classes/cs422/2010/xv6-book/trap.pdf 解释得很好
【讨论】:
以上是关于如何在 xv6 中添加系统调用/实用程序的主要内容,如果未能解决你的问题,请参考以下文章