Реализация системных вызовов в Pintos

Я хочу реализовать уже определенные системные вызовы в PintOS ( halt(), create()... и т. Д., Определенные в pintos/src/lib/user/syscall.c). Текущий обработчик системного вызова в pintos/src/userprog/syscall.c ничего не делает. Как мне сделать процесс, который делает системные вызовы. Далее мне нужно самому добавить несколько системных вызовов. Как мне поступить в этом тоже. Но сначала мне нужно реализовать существующие системные вызовы.

1 ответ

Реализация по умолчанию в pintos завершает вызывающий процесс.
перейдите по этой ссылке. Существует объяснение того, где можно изменить код для реализации системных вызовов.

Каталог "src/examples" содержит несколько примеров пользовательских программ.
"Makefile" в этом каталоге компилирует предоставленные примеры, и вы также можете редактировать его, компилируя ваши собственные программы.
Эта программа / процесс при запуске вызовет системный вызов.
Используйте gdb, чтобы следить за выполнением одной такой программы, простой оператор printf в конечном итоге вызовет запись системного вызова в файл STDOUT.
Приведенная ссылка также содержит указатели о том, как запускать пинто на GDB. Я предполагаю, что вы используете либо bochs, либо qemu. В любом случае, просто запустите GDB один раз с помощью простой программы hello world, работающей на пинто.
Это даст вам представление о том, как выполняется системный вызов.

static void
syscall_handler (struct intr_frame *f)// UNUSED) 
{
  int *p=f->esp;
 switch(*p)
case *p=SYS_CREATE  // NUMBER # DEFINED

      const char *name=*(p+1); //extract the filename 
      if(name==NULL||*name==NULL)
            exit(-1);

      off_t size=(int32_t)*(p+2);//extract file size

      f->eax=filesys_create(name,size,_FILE); //call filesys_create
      //eax will have the return value
}

Это псевдокод для sys_create. Все системные вызовы, связанные с файловой системой, очень тривиальны. Системные вызовы Fileys, такие как open read write close, требуют, чтобы вы преобразовали файл в соответствующий им fd (дескриптор файла). Вам необходимо добавить таблицу файлов для каждого процесса, чтобы отслеживать это, это могут быть как данные предварительной обработки, так и глобальные данные (выбор UR),

case (*p==SYS_WRITE)
    {
    //  printf("wite syscall\n");
      char *buffer=*(p+2); 
     unsigned size=*(p+3);
     int fd=*(p+1);
      // getiing the fd of specified file       
     struct file *fil= thread_current()->fdtable[fd];/ my per thread fdtable
     if(fd==1)  goto here;

     if(is_directory(fil->inode)){
      exit(-1);
      goto done;
     }
 here:
  if(buffer>=PHYS_BASE)exit(-1);
  if(fd<0||fd>=128){exit(-1);}
  if(fd==0){exit(-1);} // writing to STDIN
  if(fd==1)     //writing to STDOUT
  {
    int a=(int)size;
    while(a>=100)
    {
      putbuf(buffer,100);
      buffer=buffer+100;
      a-=100;
    }
    putbuf(buffer,a);
    f->eax=(int)size;
  }
  else 
      if(thread_current()->fdtable[fd]==NULL)
        {f->eax=-1;}
     else
     {
        f->eax=file_write(thread_current()->fdtable[fd],buffer,(off_t)size);
     }
done: ;

  }//printf("write");}                  /* Write to a file. */

Открыть - добавляет новую запись в fdtable и возвращает номер fd, который вы даете файлу,
закрыть - удалить эту запись из таблицы fd
читать - похоже на запись.

Process_create, wait не просто реализовать...

Ура:)

Другие вопросы по тегам