实现在XV6系统调用

问题描述 投票:0回答:3

我想实现一个系统调用,被称为getprocs()返回实际的进程的数量。我已经实现了所有的必需品添加新的系统调用。这是什么系统调用的作用是获得表,并将它们复制的流程,以结构的数组。该结构被称为uproc,在其成员INT PID,INT PPID和char名。然后,我已经创造了交流转换器文件中的程序,试图打印进程树的格式,但我有麻烦刚打印过程name.I不知道从哪里何去何从。下面我重视我的代码,我定义getprocs(),该结构uproc,我的计划,试图打印的过程。我还包括它抛出我的错误。

getprocs()的定义中proc.c:

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在uproc.h:

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:陷阱14 ERR 4上CPU 1 EIP 0x6da地址0x42444cb - 杀PROC

c kernel xv6
3个回答
1
投票
  1. 对于qazxsw POI,改变了... qazxsw POI 至... qazxsw POI 因为你想获得的所有正在运行的进程。
  2. sys_getprocs,改变... if(!(ptr->state == UNUSED)) { continue; } 至... if((ptr->state == UNUSED)) { continue; } 因为过程已定义为一个指针

改变你的代码的这两部分应该使工作方案。


-1
投票

给1为printf的第一个参数。

e.g:

main

这就像在UNIX fprintf中,你需要给它的文件描述符。图1是标准输出。

我对陷阱最好的猜测是,当printf的尝试找到端口10或20,它访问映射的内存,你得到捕获器14,这是一个页缺失的代码。


-1
投票

您应该使用退出(),而不是返回0。它应该工作。

© www.soinside.com 2019 - 2024. All rights reserved.