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

Unix 如何实现具有结构参数的系统调用?,unix,operating-system,system-calls,xv6,Unix,Operating System,System Calls,Xv6,我想实现一个系统调用,在这里我传入一个对结构变量的引用,然后我想在同一个文件中显示这些值 例如,我有以下结构 struct procInfo{ int processID[64]; // the PID of each process }; 假设我要实现的系统调用是intgetprocessids(struct procInfo*),我在名为pcid.c的文件中调用它 我希望系统调用从proc.c文件中的调度程序中获取进程ID,这样我就可以在pcid.c文件中打印它们 我知道如何创建没有输入参

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

例如,我有以下结构

struct procInfo{
int processID[64]; // the PID of each process
};
假设我要实现的系统调用是
intgetprocessids(struct procInfo*)
,我在名为
pcid.c
的文件中调用它

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

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

我执行了一个类似的系统调用
intfstat(intfd,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] );
但奇怪的是,我在cpu 1 eip 0x510 addr 0x7417ba08上得到了
陷阱14 err 4--kill proc
,但是我尝试只打印一个值,结果成功了

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


为什么我只打印其中一张就行了?我打印正确吗

指针不会返回,而是指向系统调用将写入的已分配内存。在调用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;
}
内核空间部分:

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
。您是这样说的吗<代码>结构procInfo*procInfo=malloc(sizeof(struct procInfo))我认为它不起作用!在系统调用
proc.c
后,当我试图打印
procInfo->processID[0]
时,我在cpu 1 eip 0x7000631 addr 0x7000631上得到了这个错误
trap 14 err 4--kill proc
这个陷阱意味着您的指令指针可能被某个缓冲区过/欠运行损坏了。我猜系统调用永远不会成功返回。