Реализация системного вызова в xv6

#c #kernel #xv6

#c #ядро #xv6

Вопрос:

Я пытаюсь реализовать системный вызов, называемый getprocs(), который возвращает количество фактических процессов. Я уже реализовал все необходимое для добавления нового системного вызова. Что делает этот системный вызов, так это получает процессы в таблице и копирует их в массив структур. Структура называется uproc, где ее членами являются int pid, int ppid и char name. Затем я создал программу в файле .c, которая пытается распечатать процессы в формате дерева, но у меня возникли проблемы с простой печатью имени процесса.Я не знаю, куда идти дальше. Ниже я приложил свой код, в котором я определяю getprocs() , структуру uproc и мою программу, которая пытается распечатать процессы. Я также включил ошибку, которую он выдает мне.

определение getprocs() в proc.c:

 int 
sys_getprocs(void)
{
int max;
struct uproc *p;
int i = 0;
argint(0, amp;max);
argptr(1, (char **)amp;p, max*sizeof(struct uproc));
struct proc *ptr = ptable.proc;
for(; ptr < amp;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 mainn");
  int maxElements = 64;
  struct uproc *processes = malloc(maxElements*sizeof(struct uproc));
  int N = getprocs(maxElements, amp;processes);
  int i = 0;

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

  return 0;
 }
  

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

pid 3 pstree: ошибка trap 14 4 на cpu 1 eip 0x6da addr 0x42444cb — процесс уничтожения

Комментарии:

1. Ваш printf действительно странный.

2. если вы используете xv6, вы должны использовать cprintf. У меня нет доступа к документам xv6, но я просматриваю ловушку 14 и вижу, что вызывает команду kill

3. Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, потому что это явно вопрос домашнего задания, и задающий его человек практически не работал над решением проблемы.

Ответ №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 . Это должно сработать.