0

PintOS で既に定義されているシステム コール ( halt()、create()... で定義されている pintos/src/lib/user/syscall.c など) を実装したいと考えています。pintos/src/userprog/syscall.c の現在のシステム コール ハンドラは何もしません。システム コールを行うプロセスを作成するにはどうすればよいですか。さらに、いくつかのシステム コールを自分で追加する必要があります。どうすればそれを進めることができますか。しかし、まず既存のシステム コールを実装する必要があります。

4

1 に答える 1

4

pintos のデフォルトの実装は、呼び出しプロセスを終了します。
このリンクに移動します。システムコールを実装するためにコードを変更する場所についての説明があります。

「src/examples」ディレクトリには、いくつかのサンプル ユーザー プログラムが含まれています。
このディレクトリの "Makefile" は、提供されたサンプルをコンパイルします。これを編集して、独自のプログラムをコンパイルすることもできます。
このプログラム/プロセスは、実行時にシステムコールを行います。
gdb を使用して、そのようなプログラムの実行を追跡します。単純な printf ステートメントは、最終的に STDOUT ファイルへの書き込みシステム コールを呼び出します。
与えられたリンクには、gdb で pintos を実行する方法に関するポインタもあります。私の推測では、bochs または qemu のいずれかを使用していると思います。
これにより、システムコールがどのように行われるかがわかります。

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 の疑似コードです。ファイル システムに関連するすべてのシステム コールは非常に簡単です。open read write close などの Filesys が関連するシステム コールでは、ファイルを対応する 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 の実装は簡単ではありません...

乾杯 :)

于 2012-08-28T05:18:15.867 に答える