我想实现一个系统调用,我传入一个结构变量的引用,然后我想在同一个文件中显示值。
例如,我有以下结构。
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] );
当我只打印其中一个时,为什么会有效?我打印得正确吗?
答案 0 :(得分: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;
}