15

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

グーグルでの徹底的な検索は無益であり、困難な方法でのハッキングもこれまでのところ生産的ではありませんでした.

参考書には、助けを借りて始めるためのハローワールドの例もありませんでした。

4

3 に答える 3

51

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

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

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

  • sysfunc.hは、「int sys_newsystemcall(void)」のように、このファイルにも新しいシステム コール ハンドラを追加します。
于 2012-11-03T01:24:54.083 に答える
15

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);

syscalls の配列に、次の行を追加します。

[SYS_getmysize] sys_getmysize,

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

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

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

SYSCALL(getmysize)

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

int getmysize(void);

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

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

于 2016-05-28T11:22:53.323 に答える
5

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

于 2012-02-23T08:09:30.850 に答える