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

问题描述 投票:0回答:1

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

我正在努力为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

谢谢阅读!

pointers compiler-errors system-calls incompatibletypeerror xv6
1个回答
0
投票

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

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

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

您实现的新sys函数与上面的函数不匹配,因为您已经定义了它,因此它需要一个struct指针的参数。

修复该功能,使其不会收到任何参数。如果确实需要用户空间中的参数用于系统调用实现,则应将用户空间推送到其用户堆栈,并从sys_getpinfo包装器中的那里获取它。有关如何使用的更多信息,请参阅this question

© www.soinside.com 2019 - 2024. All rights reserved.