Linux カーネル プロジェクトに取り組んでいます。私のプロジェクトでは、カーネルを変更しcopy_process
て、proc ファイル エントリへの書き込みに応答するモジュールの 1 つから呼び出されるようにしました。本質的に、物事は次のように見えます。
int procfile_write(struct file *file, const char *buffer, unsigned long count,
void *data)
{
//...more code
copy_process(...);
//...more code
}
int init_module()
{
/* create the /proc file */
Our_Proc_File = create_proc_entry(PROCFS_NAME, 0644, NULL);
// more code
Our_Proc_File->write_proc = procfile_write;
return 0; /* everything is ok */
}
copy_process
私の問題は、次の行に到達したときにカーネルが内部でハングすることです。
write_lock_irq(&tasklist_lock);
これで、この関数が から常に呼び出されていることがわかりましたdo_fork
。これはシステムコール内で発生します。
私の質問:
- これは、procファイルエントリとシステムコールへの書き込みに関係していると考えていますか?
- proc ファイルのエントリへの書き込みに関係する IRQ は何ですか?
- procファイルエントリへの書き込みは、実際にはシステムコールとは異なりますか? つまり、それが処理される方法と、それが呼び出されるコンテキストでですか?
ありがとうございました!
更新: コードの呼び出し方法を、proc ファイルへの書き込み処理中に呼び出される方法から、システム コールから呼び出される方法に変更しました。何も変わっていません。同じ行に到達すると、まだハングします (つまり、tasklist_lock をロックします)。さて、私の問題は、なぜそこにぶら下がっているのですか?この問題を解決するにはどうすればよいですか?