【问题标题】:Implementing a syscall in xv6在 xv6 中实现系统调用
【发布时间】:2017-02-14 10:34:23
【问题描述】:

我正在尝试实现一个名为 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 中构造 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:cpu 1 eip 0x6da addr 0x42444cb--kill proc 上的陷阱 14 err 4

【问题讨论】:

  • 你的printf真奇怪。
  • 如果你使用的是 xv6,你应该使用 cprintf。我无权访问 xv6 文档,但查找陷阱 14 并查看导致 kill 命令的原因
  • 我投票决定将此问题作为题外话结束,因为这显然是一个家庭作业问题,而提出问题的人几乎没有做任何工作来解决问题。

标签: c kernel xv6


【解决方案1】:
  1. 对于sys_getprocs,更改此...

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

    到...

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

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

  2. main,改...

    int N = getprocs(maxElements, &amp;processes);

    到...

    int N = getprocs(maxElements, processes);

    因为进程已经定义为指针

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2022-01-13
      • 2011-12-22
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-28
      • 2022-01-23
      • 2015-04-28
      • 2019-04-22
      相关资源
      最近更新 更多