1

構造体変数への参照を渡すシステム コールを実装し、同じファイルに値を表示したいと考えています。

たとえば、次の構造があります。

struct procInfo{
int processID[64]; // the PID of each process
};

実装したいシステムコールがint getProcessIds(struct procInfo*)であり、 というファイル内で呼び出すとしましょうpcid.c

システムコールでファイル内のスケジューラからプロセス ID を取得してproc.c、ファイル内に出力できるようにしpcid.cます。

入力パラメーターを持たない通常のシステム コールを作成する方法を知っています。ファイル内でこのシステム コールを使用してプロセス ID を出力する方法も知っていproc.cますが、ファイル内でそれらを出力する方法がわかりませんpcid.c。構造体ポインターがどのように返されるのか理解できないので、pcid.c.

同様のシステム コールint fstat(int fd, struct stat*)を実行しましたが、構造体ポインタがどのように返されるかわかりません。

私の質問が明確であることを願っています。私は XV6 オペレーティング システムを使用しています。ありがとう!

更新しました

メモリを割り当てるために malloc を使用する必要はありませんでした。これは奇妙なことですが、構造体に別の変数を追加したので、次のようになりました。

struct procInfo{
int processID[64]; // the PID of each process
char processname[64][16] // the name of each process
};

proc.cファイル 内のシステムコールの後、値を出力する方法を次に示します。

printf(1,"Name = %s\n" ,procInfo->processname[0]);
printf(1,"PID = %d\n" , procInfo->processID[0] );

しかし、奇妙なことに、 が得られますがtrap 14 err 4 on cpu 1 eip 0x510 addr 0x7417ba08--kill proc、値を 1 つだけ出力してみましたが、うまくいきました。

printf(1,"Name = %s\n" ,procInfo->processname[0]);
//printf(1,"PID = %d\n" , procInfo->processID[0] );

または

//printf(1,"Name = %s\n" ,procInfo->processname[0]);
printf(1,"PID = %d\n" , procInfo->processID[0] );

そのうちの 1 つだけを印刷したときに機能したのはなぜですか? 正しく印刷されていますか?

4

1 に答える 1

1

ポインタは返されませんが、syscall が書き込む割り当てられたメモリを指します。メモリは、syscall が呼び出される前に、呼び出し元によって割り当てられる必要があります。

内にそのような構造体が既に割り当てられているproc.c場合は、提供されたバッファにコピーする必要がありますmemcpy。カーネル メモリへの参照をユーザー空間プログラムに渡すことは絶対に避けてください。大きなセキュリティ リスクになることは別として、プログラムの知識なしにいつでも変更されたり、プログラムがアクセスできないメモリ領域にある可能性があります。

典型的な使用法は次のとおりです。

ユーザー空間部分:

struct procInfo info;
getProcessIds(&info);

カーネル空間部分:

int getProcessIds(struct procInfo *info)
{
    struct procInfo *localInfo = getProccessInfoFromScheduler();
    memcpy(info, localInfo, sizeof(struct procInfo));
    return 0;
}
于 2015-02-11T02:31:12.257 に答える