【问题标题】:How to implement a system call that has structure parameter?如何实现具有结构参数的系统调用?
【发布时间】:2015-04-11 07:20:05
【问题描述】:

我想实现一个系统调用,在其中传递对结构变量的引用,然后我想在同一个文件中显示这些值。

例如我有以下结构。

struct procInfo{
int processID[64]; // the PID of each process
};

假设我要实现的系统调用是int getProcessIds(struct procInfo*),我在一个名为pcid.c 的文件中调用它。

我希望系统调用从 proc.c 文件中的调度程序中获取进程 ID,以便我可以在我的 pcid.c 文件中打印它们。

我知道如何创建没有输入参数的常规系统调用。我也知道如何在proc.c 文件中使用此系统调用打印进程ID,但是我不知道如何在pcid.c 文件中打印它们。我不明白结构指针是如何返回的,所以我可以在pcid.c 中打印它。

我遵循了类似的系统调用int fstat(int fd, struct stat*),但我看不到结构指针是如何返回的。

希望我的问题很清楚,我使用的是 XV6 操作系统,谢谢!

更新

我能够让它工作,我不需要使用 malloc 来分配内存。奇怪的是,我在结构中添加了另一个变量,所以它变成了这样。

struct procInfo{
int processID[64]; // the PID of each process
char processname[64][16] // the name of each process
};

proc.c 文件中的系统调用之后,这是我打印值的方式。

printf(1,"Name = %s\n" ,procInfo->processname[0]);
printf(1,"PID = %d\n" , procInfo->processID[0] );

但奇怪的是我得到了trap 14 err 4 on cpu 1 eip 0x510 addr 0x7417ba08--kill proc,但是我尝试只打印一个值并且它起作用了。

printf(1,"Name = %s\n" ,procInfo->processname[0]);
//printf(1,"PID = %d\n" , procInfo->processID[0] );

或者

//printf(1,"Name = %s\n" ,procInfo->processname[0]);
printf(1,"PID = %d\n" , procInfo->processID[0] );

为什么当我只打印其中一个时它会起作用?我打印正确吗?

【问题讨论】:

    标签: unix operating-system system-calls xv6


    【解决方案1】:

    指针没有返回,而是指向系统调用将写入的分配内存。在调用系统调用之前,调用者需要分配内存。

    如果在proc.c 中已经分配了这样的结构,您应该使用memcpy 将其复制到提供的缓冲区。永远不要将内核内存的引用传递给用户空间程序,除了存在巨大的安全风险之外,它还可能在程序不知情的情况下随时更改,或者位于程序无法访问的内存区域中。

    一个典型的用法是这样的:

    用户空间部分:

    struct procInfo info;
    getProcessIds(&info);
    

    内核空间部分:

    int getProcessIds(struct procInfo *info)
    {
        struct procInfo *localInfo = getProccessInfoFromScheduler();
        memcpy(info, localInfo, sizeof(struct procInfo));
        return 0;
    }
    

    【讨论】:

    • 所以如果我声明以下struct procInfo *procInfo;,在进行系统调用之前我将如何为其分配内存?现在我进行系统调用,但我没有为结构分配任何内存。
    • malloc(sizeof(struct procInfo))。或者你可以像 fstat 常用的那样在堆栈上分配它(定义它没有*)。
    • 你是这样说的吗? struct procInfo *procInfo= malloc(sizeof(struct procInfo));我觉得不行!
    • 当我在proc.c系统调用后尝试打印procInfo->processID[0]时,我收到此错误trap 14 err 4 on cpu 1 eip 0x7000631 addr 0x7000631--kill proc
    • 陷阱意味着您的指令指针可能由于某些缓冲区溢出/不足而损坏。我猜系统调用永远不会成功返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多