私は、次の学期に予定されている宿題に取り組んでいます。 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;
コードをここに記入するか、pastebinのようなものに記入してください。 –
あなたの大きさはどれくらいですか? – nos