首页 文章

如何实现具有结构参数的系统调用?

提问于
浏览
1

我想实现一个系统调用,我传入一个结构变量的引用,然后我想在同一个文件中显示值 .

例如,我有以下结构 .

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操作系统,谢谢!

Updated

我能够让它工作,我不需要使用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] );

当我只打印其中一个时,为什么它可以工作?我打印得正确吗?

1 回答

  • 1

    指针未返回,但指向syscall将写入的已分配内存 . 在调用syscall之前,调用者需要分配内存 .

    如果在 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;
    }
    

相关问题