这是我的第一个问题,欢迎建设性的批评:)
我正在努力为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
谢谢阅读!
syscalls静态数组定义如下(在syscall.c中):
static int (*syscalls[])(void) = {
这意味着添加到此数组的所有函数指针都应返回int类型,并且不应该期望参数。
您实现的新sys函数与上面的函数不匹配,因为您已经定义了它,因此它需要一个struct指针的参数。
修复该功能,使其不会收到任何参数。如果确实需要用户空间中的参数用于系统调用实现,则应将用户空间推送到其用户堆栈,并从sys_getpinfo包装器中的那里获取它。有关如何使用的更多信息,请参阅this question。