在 xv6 中实现系统调用
Implementing a syscall in xv6
我正在尝试实现一个名为 getprocs() 的系统调用,其中 returns 实际进程的数量。我已经实现了添加新系统调用的所有必要条件。这个系统调用的作用是获取 table 中的进程并将它们复制到一个结构数组中。该结构称为 uproc,其成员为 int pid、int ppid 和 char name。然后我在 a.c 文件中创建了一个程序,试图以树格式打印流程,但我在打印流程时遇到了麻烦 name.I 不知道从这里去哪里。下面我附上了我定义 getprocs() 的代码、结构 uproc 和我尝试打印进程的程序。我还包含了它向我抛出的错误。
proc.c 中的 getprocs() 定义:
int
sys_getprocs(void)
{
int max;
struct uproc *p;
int i = 0;
argint(0, &max);
argptr(1, (char **)&p, max*sizeof(struct uproc));
struct proc *ptr = ptable.proc;
for(; ptr < &ptable.proc[NPROC]; ptr++) {
if(!(ptr->state == UNUSED)) {
continue;
}
p[i].pid = ptr->pid;
p[i].ppid = ptr->parent->pid;
strncpy(p[i].name, ptr->name, 16);
i++;
}
return i;
}
在 uproc.h 中构造 upproc:
struct uproc {
int pid;
int ppid;
char name[16];
};
试图在 pstree.c 中打印进程的程序:
#include "types.h"
#include "stat.h"
#include "user.h"
#include "uproc.h"
int main() {
printf(20, "Made it into main\n");
int maxElements = 64;
struct uproc *processes = malloc(maxElements*sizeof(struct uproc));
int N = getprocs(maxElements, &processes);
int i = 0;
printf(10, "Starting\n");
for(; i < N; i++) {
printf(16, processes[i].name);
}
return 0;
}
屏幕上没有打印任何内容,尝试 运行 pstree 后出现以下错误:
pid 3 pstree: trap 14 err 4 on cpu 1 eip 0x6da addr 0x42444cb--kill proc
你应该使用 exit() 而不是 return 0。它应该可以工作。
对于 sys_getprocs
,更改此...
if(!(ptr->state == UNUSED)) {
continue;
}
到...
if((ptr->state == UNUSED)) {
continue;
}
因为你想得到所有的运行进程。
在main
中,更改...
int N = getprocs(maxElements, &processes);
到...
int N = getprocs(maxElements, processes);
因为进程已经定义为指针
更改代码的这两部分应该可以使程序运行。
我正在尝试实现一个名为 getprocs() 的系统调用,其中 returns 实际进程的数量。我已经实现了添加新系统调用的所有必要条件。这个系统调用的作用是获取 table 中的进程并将它们复制到一个结构数组中。该结构称为 uproc,其成员为 int pid、int ppid 和 char name。然后我在 a.c 文件中创建了一个程序,试图以树格式打印流程,但我在打印流程时遇到了麻烦 name.I 不知道从这里去哪里。下面我附上了我定义 getprocs() 的代码、结构 uproc 和我尝试打印进程的程序。我还包含了它向我抛出的错误。
proc.c 中的 getprocs() 定义:
int
sys_getprocs(void)
{
int max;
struct uproc *p;
int i = 0;
argint(0, &max);
argptr(1, (char **)&p, max*sizeof(struct uproc));
struct proc *ptr = ptable.proc;
for(; ptr < &ptable.proc[NPROC]; ptr++) {
if(!(ptr->state == UNUSED)) {
continue;
}
p[i].pid = ptr->pid;
p[i].ppid = ptr->parent->pid;
strncpy(p[i].name, ptr->name, 16);
i++;
}
return i;
}
在 uproc.h 中构造 upproc:
struct uproc {
int pid;
int ppid;
char name[16];
};
试图在 pstree.c 中打印进程的程序:
#include "types.h"
#include "stat.h"
#include "user.h"
#include "uproc.h"
int main() {
printf(20, "Made it into main\n");
int maxElements = 64;
struct uproc *processes = malloc(maxElements*sizeof(struct uproc));
int N = getprocs(maxElements, &processes);
int i = 0;
printf(10, "Starting\n");
for(; i < N; i++) {
printf(16, processes[i].name);
}
return 0;
}
屏幕上没有打印任何内容,尝试 运行 pstree 后出现以下错误:
pid 3 pstree: trap 14 err 4 on cpu 1 eip 0x6da addr 0x42444cb--kill proc
你应该使用 exit() 而不是 return 0。它应该可以工作。
对于
sys_getprocs
,更改此...if(!(ptr->state == UNUSED)) { continue; }
到...
if((ptr->state == UNUSED)) { continue; }
因为你想得到所有的运行进程。
在
main
中,更改...int N = getprocs(maxElements, &processes);
到...
int N = getprocs(maxElements, processes);
因为进程已经定义为指针
更改代码的这两部分应该可以使程序运行。