2010-12-28 14 views
2

私は、次の学期に予定されている宿題に取り組んでいます。 ucontext APIを使用して独自のコンテキスト切り替え/スレッドライブラリを実装する必要があります。教授はそれを行うコードを提供しますが、スレッドが戻る前に手動で作業を行いISRを呼び出すISRを呼び出し、使用するスレッドとスワップコンテキストを見つけるISRを呼び出します。makecontext segfault?

割り当てのポイントは、コンテキストのuc_linkフィールドを使用して、戻り値に達したときに作業を処理することです。私は以前に関数が行った作業(クリーンアップしてからISRを呼び出す)だけを行う関数(void/void args型)を作成しました。教授は彼がこれを望んでいると言った。

残っているのは、uc_linkフィールドのコンテキストのどこかにあるmakecontextを実行してスレッドを実行することです。もし、私がucontext_tと関数の外見上の任意の組み合わせでmakecontextを実行すると、segfaultを取得し、gdbは助けを得ません。makecontextをスキップすることができ、私のプログラムは、おそらく)uc_linkフィールドが正しく設定されていない(これは私がやろうとしていることです)。

なぜmakecontextがsegfaultになるのかについては何も見つかりません。誰も助けることができますか?

stack2.ss_sp = (void *)(malloc(STACKSIZE)); 
if(stack2.ss_sp == NULL){ 
printf("thread failed to get stack space\n"); 
exit(8); 
} 
stack2.ss_size = STACKSIZE; 
stack2.ss_flags = 0; 

if(getcontext(&main_context) == -1){ 
perror("getcontext in t_init, rtn_env"); 
exit(5); 
} 

//main_context.uc_stack = t_state[i].mystk;                             
main_context.uc_stack = stack2; 
main_context.uc_link = 0; 
makecontext(&main_context, (void (*)(void))thread_rtn, 0); 

私もちょうどthread_rtn、& thread_rtnや他のものを試してみました。 thread_rtnはvoid thread_rtn(void)として宣言されています。

、各スレッドで。 run_envはタイプucontext_tは次のとおりです。 ...

t_state[i].run_env.uc_link = &main_context; 
+1

コードをここに記入するか、pastebinのようなものに記入してください。 –

+0

あなたの大きさはどれくらいですか? – nos

答えて

0

あり、多くがここで起こっているが、私は私の最高の考えを与えるでしょう。私は宿題を解決せずに質問に答えようとしています。

thread_rtnはどのようなコンテキストで宣言されていますか?また、非静的変数を使用していますか?
segfaultは、割り振られたが利用できなくなった(コンテキスト外または解放された)メモリによって発生している可能性があります。

main_contextがスレッドコンテキストと同じであるかどうかわかりませんが、2つは異なるはずです。

各スレッドは独自のスタックを必要としているようですが、メインのスタックのスタック(またはほかのスレッドのスタックと同じsam)と同じであってはいけません。各スレッドがスタックとして使用するメモリを取得できる場所について考えてみましょう。どのような条件の下でmalloc(STACKSIZE)返信NULL

メインコンテキストにスレッドコンテキストを追加する場合は、main_context.uc_linkをインクリメントする必要があります。 main_context.uc_linkは、メインコンテキストにリンクされているスレッドの数を記録しているようです。カウントが減少したときに何が起こるかを考えてください(私は、減少するカウントについて何をすべきかを言うよりも、コースに関連するいくつかの思いつきを残そうとしています)。特別な値が0であることに注意してください。これは、このメインコンテキストに関連するスレッドがなくなったことを意味します。 main_context.uc_linkの最大値はありますか?

これが役に立ちます。