在xv6中实现系统调用

时间:2016-10-05 20:31:43

标签: c kernel xv6

我正在尝试实现一个名为getprocs()的系统调用,它返回实际进程的数量。我已经实现了添加新系统调用的所有必需品。这个系统调用的作用是获取表中的进程并将它们复制到结构数组中。该结构称为uproc,其成员是int pid,int ppid和char name。然后我在a.c文件中创建了一个程序,尝试以树格式打印进程,但是我只是打印进程名称时遇到问题。我不知道从这里开始。下面我附上了我的代码,我定义了getprocs(),struct 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中的struct uproc:

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

3 个答案:

答案 0 :(得分:0)

将1作为printf的第一个参数。

e.g:

printf(1, "NOPE");

它与unix中的fprintf类似,你需要给它一个文件描述符。 1是标准的。

我对陷阱的最佳猜测是,当printf尝试查找端口10或20时,它会访问未映射的内存,并且您将获得陷阱14,这是页面错误的代码。

答案 1 :(得分:0)

你应该使用exit()而不是return 0.它应该可以工作。

答案 2 :(得分:0)

  1. 对于sys_getprocs,请更改此...

    if(!(ptr->state == UNUSED)) {
        continue;
    }
    

    到...

    if((ptr->state == UNUSED)) {
        continue;
    }
    

    因为要获取所有正在运行的进程。

  2. main中,更改...

    int N = getprocs(maxElements, &processes);

    到...

    int N = getprocs(maxElements, processes);

    因为进程已经定义为指针

更改代码的这两部分可以使程序正常工作。