0

シンプルなトップ ユーティリティ xv6 を作成しようとしています。これを行うために、カーネル空間にアクセスできるようにするシステム コールを作成しました。システム コールの作成方法に関する多くのガイドに従っていますが、コードは問題なくコンパイルされます。

qemu で top を実行しようとすると、問題が発生します。構造体配列がカーネル空間にあるかユーザー空間にあるかに関係なく、構造体配列にアクセスしようとすると、トラップ 14 エラーが発生します。

物事を少し分解するために、top.cファイルがあります:

...
int main(){
  struct uproc table[MAX];//where MAX is defined as 10
  if(!getprocs(MAX, table))
     printf("YAY");
...

sysproc.c:

...
int
sys_getprocs(int max, struct uproc table[]){
    return gettable(table);
}

そしてprocs.cで

....
int gettable(struct uproc table[]){
    struct uproc u;
    struct proc *p;
    int i = 0;
    aquire(&ptable.lock);
    for(p->state.proc; p < &ptable.proc[NPROC];p++){
        if(//p->state is valid){
           u.state = p->state;
           ...
           table[i] = u;//where I get the trap 14 error
        }
    }
}

繰り返しますが、ユーザーからカーネルにテーブルを渡すとテーブルが破損していると思いますが、それを正しく渡す方法がわかりません。

4

1 に答える 1

0

すべての xv6sys_*関数はパラメーターなしです。argintargstr、および関数を読んで、argptrユーザー モードからカーネルにパラメーターを渡す方法を理解します。

于 2016-03-01T19:07:44.973 に答える