我有这个作业:
实现一个系统调用,返回有关当前进程的信息(例如其进程 ID 和状态)。想想谁负责分配包含以下内容的内存 处理将返回的信息以及如何在使用后再次释放它(如果需要 被释放)。
但我坚持让系统调用产生任何有意义的输出......
这是我的内核空间中的代码,在sysproc.c中实现:
uint64
sys_getprocinfo(struct proc* user_pi)
{
struct proc *curproc = myproc();
struct proc pi;
acquire(&curproc->lock);
pi.pid = curproc->pid;
pi.state = curproc->state;
release(&curproc->lock);
if(copyout(curproc->pagetable, (uint64)user_pi, (char*)&pi, sizeof(pi)) < 0)
return -1;
return 0;
}
以及user/getproc.c中的用户空间程序
#include "user.h"
//#include "kernel/types.h"
//blueprint for proc info strukturen
struct proc {
int pid;
int state;
//evt annet?
};
//state nr tilsvarer nr i array her:
//enum procstate { UNUSED, USED, SLEEPING, RUNNABLE, RUNNING, ZOMBIE}
int main(void)
{
//info blir av typen proc info over
struct proc pi;
//kaller syscallet med &info som argument
int result = getprocinfo(&pi);
if (result < 0) {
printf("Error: Not able to access process information!\n");
} else {
printf("Process ID: %d, Process state: %d\n", pi.pid, pi.state);
}
exit(0);
}
当我使用 make qemu 运行 XV6 时,我只收到此消息:错误:无法访问进程信息!。我无法让它产生任何过程。请帮忙!!
我相信你使用 xv6-riscv 风格?
您的代码中有几个问题:
sys_getprocinfo
原型应该是int64 sys_getprocinfo(void)
:系统调用没有参数,必须使用argaddr(int, uint64 *);
pi
是在 sys_getprocinfo
本地定义的,但您可以在 copyout(...)
struct proc
定义:一个在 proc.h
的内核中,一个在您的 getproc.c
文件中。它们是不相容的。您应该在内核中声明一个具有不同名称的新结构。