web-dev-qa-db-ja.com

xv6にシステムコール/ユーティリティを追加するにはどうすればよいですか?

XV6でシステムコール/ユーティリティを追加する方法への参照を教えてもらえますか/教えてください

グーグルでの徹底的な検索は無駄であり、難しい方法をハッキングすることもこれまでのところ生産的ではありませんでした。

参考書には、助けを借りて始めるためのhelloworldの例もありませんでした。

15
sashank

これを読んでください: http://Zoo.cs.yale.edu/classes/cs422/2010/xv6-book/trap.pdf
それはそれを非常によく説明しています

5
madmaze

Xv6のシェルで呼び出すことができるシステムコールを追加するには、5つのファイルで何かを行う必要があります

  • sysproc.cここにメソッドの実際の実装を追加します
  • syscall.h実装に接続するシステムコールベクトルの位置を定義します
  • ser.hシェルを介して呼び出すことができる関数を定義します
  • syscall.c外部シェルとカーネルを接続する関数を定義します。syscall.hで定義された位置を使用して、システムコールベクトルに関数を追加します。
  • sys.Sマクロを使用して、ユーザーの呼び出しをシステムコール関数に接続することを定義します

  • defs.h新しいシステムコールの前方宣言を追加します

  • sysfunc.h「intsys_newsystemcall(void)」のように、このファイルにも新しいシステムコールハンドラーを追加します
48
Yang

Xv6でシステムコールを追加する簡単な例を説明します。

現在実行中のユーザープログラムのアドレススペースサイズを取得するには、システムコールを追加する必要があると想定します。システムコールにgetmysize()という名前を付けて、ユーザープログラム内からこのシステムコールを呼び出すことができます。

ユーザープログラムは次のように書くことができます。プログラム名をmyprog.c xv6にユーザープログラムを追加する方法を知っていると思います。したがって、トピックから外れるため、ここではこれらの手順については触れません。

#include "types.h"
#include "stat.h"
#include "user.h"

int main(void){
  printf(1,"The size of my address space is %d bytes\n", getmysize());
  exit();
}

このプログラムは、システムコールの動作を示すことのみを目的として作成されています。

次に、システムコールをxv6に追加します。

まず、ファイルの最後に次の行を追加しますsyscall.h

#define SYS_getmysize 23

ここでの23は、ファイルに追加する行の前に指定された番号によって変わる可能性があることに注意してください。つまり、追加する行の前の行のシステムコール番号が22の場合、その行の番号は23になります。そのように単純です。

ここで、次の行をsyscall.cファイルに追加します。

extern int sys_getmysize(void);

システムコールの配列で、に次の行を追加します。

[SYS_getmysize] sys_getmysize,

ファイルsysproc.cに、プロセス処理またはメモリ管理に関連するシステムコールの場合、システムコールの実装が行われる場所に、システムコールの実装を次のように記述します。

int 
sys_getmysize(void)
{
   return proc->sz;
}

sys.Sファイルに、次の行を追加します。

SYSCALL(getmysize)

次に、ser.hファイルに以下を追加します。これは、ユーザープログラムがシステムコールを認識する方法です。

int getmysize(void);

OK。これで、ユーザープログラムを実行して、システムコールがどのように実行されるかを確認する準備が整いました。

システムコールを呼び出すmyprog.cを実行すると、この同じプログラムのアドレススペースのサイズが、ここで実装した内容に従って返されます。

14