2016-10-05 8 views
0

実際のプロセスの数を返すgetprocs()というシステムコールを実装しようとしています。私はすでに新しいシステムコールを追加するためのすべての必要性を実装しました。このシステムコールは、テーブル内のプロセスを取得し、それらを構造体の配列にコピーします。構造体はuprocと呼ばれ、メンバーはint pid、int ppid、およびchar nameです。その後、プロセスをツリー形式で印刷しようとするプログラムをa.cファイルに作成しましたが、プロセス名を印刷するだけでは問題があります。ここからどこに行くのかはわかりません。以下では、私がgetprocs()、構造体uproc、およびプロセスを印刷しようとするプログラムを定義する私のコードを添付しました。私はそれが私に投げるエラーも含めた。xv6でsyscallを実装する

getprocs()proc.cで定義:uproc.hで

int 
sys_getprocs(void) 
{ 
int max; 
struct uproc *p; 
int i = 0; 
argint(0, &max); 
argptr(1, (char **)&p, max*sizeof(struct uproc)); 
struct proc *ptr = ptable.proc; 
for(; ptr < &ptable.proc[NPROC]; ptr++) { 
    if(!(ptr->state == UNUSED)) { 
    continue; 
    } 
    p[i].pid = ptr->pid; 
    p[i].ppid = ptr->parent->pid; 
    strncpy(p[i].name, ptr->name, 16); 
    i++; 
} 
return i; 
} 

構造体uproc:pstree.cの処理を印刷しようと

struct uproc { 
    int pid; 
    int ppid; 
    char name[16]; 
}; 

プログラム:

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

int main() { 
    printf(20, "Made it into main\n"); 
    int maxElements = 64; 
    struct uproc *processes = malloc(maxElements*sizeof(struct uproc)); 
    int N = getprocs(maxElements, &processes); 
    int i = 0; 

    printf(10, "Starting\n"); 
    for(; i < N; i++) { 
    printf(16, processes[i].name);  
    } 

    return 0; 
} 

画面に何も印刷されず、pstreeを実行しようとすると次のエラーが表示されます。

PID 3 pstreeコマンド:CPU 1にトラップ14 ERR 4 EIP 0x6da ADDR 0x42444cb -

+1

あなたの 'printf'は本当に変です。 – user58697

+0

xv6を使用している場合は、cprintfを使用する必要があります。私はxv6のドキュメントにはアクセスできないが、トラップ14を参照してkillコマンドの原因を調べる – Turtle

答えて

0

はprintf関数の最初の引数として1を与えるPROCを殺します。

例えば:

printf(1, "NOPE"); 

それはあなたがそれをファイルディスクリプタを与える必要があり、UNIXにおけるfprintfのようなものです。 1は標準です。

トラップについては、printfがポート10または20を見つけようとすると、マップされていないメモリにアクセスし、ページフォールトのコードであるトラップ14が得られると推測します。

0

0を返す代わりにexit()を使用してください。正常に動作するはずです。

関連する問題