Внедрение syscall в xv6

Я пытаюсь реализовать syscall, называемый getprocs (), который возвращает количество фактических процессов. Я уже внедрил все необходимое, чтобы добавить новый syscall. То, что этот syscall делает, - это получить процессы в таблице и скопировать их в массив структур. Строка называется uproc, где ее членами являются int pid, int ppid и имя char. Затем я создал программу в ac-файле, которая пытается распечатать процессы в древовидном формате, но у меня возникли проблемы с простое имя процесса. Я не знаю, куда идти отсюда. Ниже я прикрепил свой код, где я определяю 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;
}

struct uproc in 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
");
  int maxElements = 64;
  struct uproc *processes = malloc(maxElements*sizeof(struct uproc));
  int N = getprocs(maxElements, &processes);
  int i = 0;

  printf(10, "Starting
");
  for(; i < N; i++) {
    printf(16, processes[i].name);     
  }

  return 0;
 }

На экране ничего не печатается, и я получаю следующую ошибку после попытки запустить pstree:

pid 3 pstree: trap 14 err 4 на cpu 1 eip 0x6da addr 0x42444cb - kill proc

c,kernel,xv6,

0

Ответов: 2


0

Дайте 1 в качестве первого аргумента printf.

например:

printf(1, "NOPE");

Это как fprintf в unix, вам нужно дать ему файловый дескриптор. 1 является стандартным.

Мое лучшее предположение о ловушке заключается в том, что, когда printf пытается найти порт 10 или 20, он обращается к немаркированной памяти, и вы получаете ловушку 14, которая является кодом для файла.


0

Вы должны использовать exit () вместо возврата 0. Он должен работать.

с, ядро, xv6,
Похожие вопросы