如何 return xv6 系统调用中的结构?
How to return a struct in xv6 syscalls?
我目前正在测试 xv6 并实现了一个新的系统调用。
据我所知,xv6 中的所有系统调用 return 都是一个 int。
这是必需的吗?为什么?
因为我想return一个C结构。
这可能吗?
我需要做什么才能实现这一目标?
来自系统调用的 return 值存储在 eax
寄存器中。
如 source 中所示:
proc->tf->eax = syscalls[num]();
这意味着 return 值将始终是单个 32 位值。
系统调用处理程序的函数类型也定义为 returning int
且不带参数:
static int (*syscalls[])(void)
在这种情况下 return 结构的正确方法是传递一个 user-space 指针作为系统调用参数。在验证它是有效的之后,它会将结构数据存储在该指针处。请注意,由于系统调用处理程序本身不接受任何参数,因此您必须使用像 argptr
这样的参数获取器,它会为您处理有效性检查。
我目前正在测试 xv6 并实现了一个新的系统调用。
据我所知,xv6 中的所有系统调用 return 都是一个 int。 这是必需的吗?为什么?
因为我想return一个C结构。
这可能吗? 我需要做什么才能实现这一目标?
来自系统调用的 return 值存储在 eax
寄存器中。
如 source 中所示:
proc->tf->eax = syscalls[num]();
这意味着 return 值将始终是单个 32 位值。
系统调用处理程序的函数类型也定义为 returning int
且不带参数:
static int (*syscalls[])(void)
在这种情况下 return 结构的正确方法是传递一个 user-space 指针作为系统调用参数。在验证它是有效的之后,它会将结构数据存储在该指针处。请注意,由于系统调用处理程序本身不接受任何参数,因此您必须使用像 argptr
这样的参数获取器,它会为您处理有效性检查。