这是我的第一个问题,欢迎建设性的批评:)
我正在努力向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
感谢阅读!
答案 0 :(得分:0)
syscalls静态数组的定义如下(在syscall.c中):
static int (*syscalls[])(void) = {
这意味着添加到此数组的所有函数指针都应返回int类型,并且不应包含参数。
您实现的新sys函数与上面的函数不匹配,因为您已对其进行定义,因此它需要结构指针的参数。
修复此函数,使其不接收任何参数。如果确实需要用户空间中的参数来进行系统调用,则应使用户空间将其压入其用户堆栈,然后在sys_getpinfo包装器中从那里获取它。有关操作方法的更多信息,请参见this question。