C 如何在xv6系统调用中返回结构?

C 如何在xv6系统调用中返回结构?,c,struct,system-calls,xv6,C,Struct,System Calls,Xv6,我目前正在测试xv6,并实现了一个新的系统调用 就我所见,xv6中的所有系统调用都返回int。 需要这样做吗?为什么 因为我想返回一个C结构 这可能吗? 要实现这一点,我必须做什么?系统调用的返回值存储在eax寄存器中 如图所示: 这意味着返回值将始终是单个32位值 系统调用处理程序的函数类型也定义为返回int且不带参数: static int (*syscalls[])(void) 在这种情况下,返回结构的正确方法是将用户空间指针作为syscall参数传递给。在验证其有效性后,它将在该指针处

我目前正在测试xv6,并实现了一个新的系统调用

就我所见,xv6中的所有系统调用都返回int。 需要这样做吗?为什么

因为我想返回一个C结构

这可能吗?
要实现这一点,我必须做什么?

系统调用的返回值存储在
eax
寄存器中

如图所示:

这意味着返回值将始终是单个32位值

系统调用处理程序的函数类型也定义为返回
int
且不带参数:

static int (*syscalls[])(void)

在这种情况下,返回结构的正确方法是将用户空间指针作为syscall参数传递给。在验证其有效性后,它将在该指针处存储结构数据。请注意,由于syscall处理程序本身不接受任何参数,因此必须使用参数获取程序,如
argptr
,它为您处理有效性检查。

我要补充的是,这样的系统调用应该为要返回的结构提供两个参数:您提到的指针,以及结构的预期大小。这对于家庭作业来说并不重要,但在生产操作系统中,您必须担心用户空间和内核之间的不匹配(出于几个不同的原因)。其他系统调用能够处理多个参数,因此您可以使用这些参数获取器以与它们相同的方式来处理。但是,如果您假设大小可能不一致,您如何知道结构中的字段都位于正确的位置。虽然我不太熟悉其他操作系统是如何处理这个问题的,但我会假设用户空间必须符合操作系统的规范。如果您假设所有字段都位于同一位置且大小相同,但结构上可能存在尾随填充,然后我才能真正看到,如果操作系统中的大小大于用户空间中的大小,并且如果编译器出于某种原因弄乱了填充的内容,那么这就是一个问题,或者,如果结构正好位于进程地址空间的边缘,那么在生产中出现这种情况的最常见情况是,系统调用自引入以来增加了新功能,因此操作系统版本的结构中的字段比旧用户空间二进制文件所期望的要多。使用size参数,内核可以避免在旧二进制文件的分配结束后写入字段。非常正确。不管怎样,这只是另一个论点。你如何选择实施这些事情取决于你自己。
static int (*syscalls[])(void)