【发布时间】:2020-05-08 13:30:24
【问题描述】:
我目前正在测试 xv6 并实现了一个新的系统调用。
据我所知,xv6 中的所有系统调用都返回一个 int。 是否需要这样做?为什么?
因为我想返回一个 C 结构。
这可能吗? 为了实现这一目标,我需要做什么?
【问题讨论】:
标签: c struct system-calls xv6
我目前正在测试 xv6 并实现了一个新的系统调用。
据我所知,xv6 中的所有系统调用都返回一个 int。 是否需要这样做?为什么?
因为我想返回一个 C 结构。
这可能吗? 为了实现这一目标,我需要做什么?
【问题讨论】:
标签: c struct system-calls xv6
系统调用的返回值存储在eax 寄存器中。
如source中所见:
proc->tf->eax = syscalls[num]();
这意味着返回值将始终是单个 32 位值。
系统调用处理程序的函数类型也定义为返回int并且不带参数:
static int (*syscalls[])(void)
在这种情况下返回结构的正确方法是将用户空间指针作为系统调用参数传递。在验证它是否有效后,它将把结构数据存储在该指针处。请注意,由于系统调用处理程序本身不接受任何参数,因此您必须使用像 argptr 这样的参数 getter,它会为您处理有效性检查。
【讨论】:
sizeof(T) 在用户空间和内核之间不匹配(有几个不同的原因)。