【问题标题】:How to return a struct in xv6 syscalls?如何在 xv6 系统调用中返回结构?
【发布时间】:2020-05-08 13:30:24
【问题描述】:

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

据我所知,xv6 中的所有系统调用都返回一个 int。 是否需要这样做?为什么?

因为我想返回一个 C 结构。

这可能吗? 为了实现这一目标,我需要做什么?

【问题讨论】:

    标签: c struct system-calls xv6


    【解决方案1】:

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

    source中所见:

    proc->tf->eax = syscalls[num]();
    

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

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

    static int (*syscalls[])(void)
    

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

    【讨论】:

    • 我要补充一点,像这样的系统调用应该采用 两个 参数来返回结构:您提到的指针,以及结构的预期大小。这对于家庭作业来说并不重要,但在生产操作系统中,您必须担心sizeof(T) 在用户空间和内核之间不匹配(有几个不同的原因)。
    • 其他系统调用能够处理多个参数,因此您可以通过使用这些参数获取器以与它们相同的方式来执行此操作。但是,如果您假设大小可能不对齐,您怎么知道结构中的字段都在正确的位置。虽然我不太熟悉其他操作系统如何处理这个问题,但我认为这取决于用户空间是否符合操作系统的规范。
    • 如果您假设所有字段都位于同一个位置并且具有相同的大小,但结构上可能存在尾随填充,那么我只能在以下情况下真正看到这是一个问题操作系统中的大小大于用户空间中的大小,并且如果编译器由于某种原因弄乱了该填充的内容,或者该结构正好位于进程地址空间的边缘。
    • 生产环境中最常见的情况是系统调用自引入以来增加了新功能,因此操作系统版本的结构中的字段比旧的用户​​空间二进制文件多预计。使用 size 参数,内核可以避免写入超出旧二进制文件分配末尾的字段。
    • 非常正确。不管怎样,这只是另一个论点。您选择如何实施事情取决于您。
    猜你喜欢
    • 2019-04-22
    • 2022-01-13
    • 2017-02-14
    • 2015-04-28
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多