シンプルなトップ ユーティリティ 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
}
}
}
繰り返しますが、ユーザーからカーネルにテーブルを渡すとテーブルが破損していると思いますが、それを正しく渡す方法がわかりません。