1

宿題のために Minix でシステム コールを作成する必要があります。ほとんどのセットアップが完了しましたが、何らかの理由で、システム コールが実際に呼び出している関数が正しく検出されません。(不適切な言葉遣いの選択を許してください。これを説明するのに最適な言葉はわかりません)。

次のコードmylib.h/usr/include(および)を作成しました。/usr/src/include

#include <lib.h>
#include <unistd.h>
#include <stdio.h>

int mycall(){
    message m;
    return (_syscall(PM_PROC_NR, MYCALL, &m));
}

mylib.h私も適切に追加しましたMakefile

で定義MYCALLし、の対応するスロットに/usr/src/include/minix/callnr.h追加しました。do_mycall/usr/src/servers/pm/table.h

に追加int do_mycall(void);/usr/src/servers/pm/proto.h、 に簡単な関数宣言を追加しましたmisc.c

int do_mycall(void){
    printf("I've been called");
    return 0;
}

また、そのディレクトリ.cに追加した独自のファイルに配置しようとしました。Makefile

、 、、に出演makeしました。/usr/src/servers/pm//usr/src/includemake includes/usr/src/releasetools

ただし、 を呼び出しmycall()て戻り値をキャッチすると、-1 になります。

私はいくつかのプリントを追加しました. の関数が呼び出されていることがわかります. mylib.hMYCALL は のインデックスとして正しく定義されていtable.hますtable.h .do_mycall実行時にそこにあります)。したがって、私が言えることは、 in がその_syscall関数do_mycallに正しくマッピングされていないということだけです。

photo.hのプロトタイプをのコードだけに置き換えようとしましたがmisc.c(そのため、プロトタイプは失われます)、何もmake変わらず、文句も言いませんでした。

これを引き起こしている原因を特定するのを手伝ってくれる人はいますか?

がどこで定義されているかを誰かが知っていれば_syscall、それが役立つかもしれません。

4

1 に答える 1

1

特定の原因を見つけることはできませんでしたが、見つけたすべてのオプションを使い果たした後、問題は仮想マシンにあったようです. VirtualBox の代わりに VMware Player でシステム コールをセットアップするために行ったすべてのことを繰り返したところ、すべて正常に機能しました。

于 2013-02-28T01:36:46.050 に答える