2015-02-11 41 views
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操作系统,谢谢!

更新

我能得到它的工作,我也没必要使用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

指针不返回,但指向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; 
} 
+0

,所以如果我声明如下'结构procInfo * procInfo;',我在进行系统调用之前如何为它分配内存?现在我进行系统调用,但是我没有为结构分配任何内存。 – Ammar 2015-02-11 02:38:36

+1

'malloc(sizeof(struct procInfo))''。或者,您可以像堆栈中常用的那样将它分配到堆栈上(不使用'*'来定义它)。 – StenSoft 2015-02-11 02:39:59

+0

你是这样说的吗? 'struct procInfo * procInfo = malloc(sizeof(struct procInfo));'我不认为它的工作! – Ammar 2015-02-11 02:45:43