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

时间:2019-02-28 17:37:36

标签: pointers compiler-errors system-calls incompatibletypeerror xv6

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

我正在努力向xv6添加系统调用。我之前已经做过,但从未遇到过此特定错误。我收到的错误:

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

我在Google上搜索了一下,看起来问题可能是我没有在应有的地方定义系统调用(通常是sysfunc.h),或者我在其中一个定义中使用了不同的返回类型。问题是,我检查并重新检查了返回类型,并在我能想到的所有地方添加了系统调用,而我仍然遇到此错误。

我想知道是否有一种方法可以强制转换指针类型?无论如何,如果您知道为什么这种情况仍在发生或如何解决,我将非常感激。

在这里定义了我的系统调用的所有地方:

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

感谢阅读!

1 个答案:

答案 0 :(得分:0)

syscalls静态数组的定义如下(在syscall.c中):

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

这意味着添加到此数组的所有函数指针都应返回int类型,并且不应包含参数。

您实现的新sys函数与上面的函数不匹配,因为您已对其进行定义,因此它需要结构指针的参数。

修复此函数,使其不接收任何参数。如果确实需要用户空间中的参数来进行系统调用,则应使用户空间将其压入其用户堆栈,然后在sys_getpinfo包装器中从那里获取它。有关操作方法的更多信息,请参见this question