不兼容的指针类型添加系统调用 xv6 -- 使用一致的 return 类型,在 sysfunc.h 中定义

Incompatible pointer type adding system call xv6 -- using consistent return type, defined in sysfunc.h

这是我的第一个问题,欢迎建设性的批评:)

我正在努力添加对 xv6 的系统调用。我以前做过这个,但我从来没有 运行 进入这个特定的错误。我得到的错误:

kernel/syscall.c:106:16: error: initialization from incompatible pointer type [-Werror=incompatible-pointer-types]
 [SYS_getpinfo] sys_getpinfo,

我用谷歌搜索了一下,看起来问题应该是我没有在我应该定义的地方定义我的系统调用(通常 sysfunc.h),或者我使用了不同的 return 输入定义之一。问题是,我检查并重新检查了 return 类型,并在我能想到的所有地方添加了系统调用,但我仍然收到此错误。

我想知道是否有办法只转换指针类型?无论如何,如果您知道为什么仍然会发生这种情况,或者如何解决它,我将不胜感激。

这里是我定义系统调用的地方:

sysproc.c:

int sys_getpinfo(struct pstat* p){
    //implementation
}

sysfunc.h:

int sys_getpinfo(struct pstat*);

user.h:

int getpinfo(struct pstat*);

usys.S:

SYSCALL(getpinfo)

syscall.c:

[SYS_getpinfo] sys_getpinfo,

syscall.h:

#define SYS_getpinfo 22

感谢阅读!

系统调用静态数组定义如下(在syscall.c):

static int (*syscalls[])(void) = {

这意味着添加到此数组的所有函数指针都应return int 类型并且不应期望参数。

您实现的新 sys 函数与上面的不匹配,因为您已经定义了它,所以它需要结构指针的参数。

修复函数,使其不再接收任何参数。如果您确实需要来自用户 space 的参数用于系统调用实现,您应该让用户 space 将其推送到其用户堆栈并在 sys_getpinfo 包装器中从那里获取它。请参阅 了解更多信息。