forkソース概要分析
2005 ワード
forkはシステム呼び出しに属し、まずユーザ状態からカーネル状態に切り替える.このプロセスは前述したように、カーネル状態になったらsys_を呼び出す.fork()を呼び出しdo_を呼び出しますfork():
do_fork機能の概要:
1、サブプロセスにpidを割り当てる.
2、copy_を呼び出すプロセス()関数は一連のcopyを行う
3、サブプロセスをプロセススケジューリングキューに入れ、cpuのスケジューリングを待つ
copy_プロセス()機能概要:
1、サブプロセスにPCBを申請する(task_struct)
呼び出しdup_task_struct()関数は、一般的に8 kの物理ページを割り当て、1 kはtask_を保存するために使用されるstruct(PCB)、他の部分はサブプロセスのカーネルスタックとして使用される
2、PCBの初期化、例えばスピンロック、タイマー
3、親プロセスのコピーメモリをmm_管理するstruct,ファイル記述子files,ファイルシステムfs,信号,信号処理関数
ここではレジスタの値もcopyと初期化を行い、eaxの値を0(したがってサブプロセス戻り値は0)にし、EIPをret_に設定するfrom_forkの開始アドレス(サブプロセスはここから実行)
4、sched_を呼び出すfork()は、サブプロセスの静的優先度を初期化し、サブプロセスをTASK_に設定します.RINNING状態
asmlinkage int sys_fork(struct pt_regs regs)
{
return do_fork(SIGCHLD, regs.esp, ®s, 0, NULL, NULL);
}
このプロセスは、いくつかの信号値とレジスタを伝達します.do_fork機能の概要:
1、サブプロセスにpidを割り当てる.
2、copy_を呼び出すプロセス()関数は一連のcopyを行う
3、サブプロセスをプロセススケジューリングキューに入れ、cpuのスケジューリングを待つ
copy_プロセス()機能概要:
1、サブプロセスにPCBを申請する(task_struct)
呼び出しdup_task_struct()関数は、一般的に8 kの物理ページを割り当て、1 kはtask_を保存するために使用されるstruct(PCB)、他の部分はサブプロセスのカーネルスタックとして使用される
p = dup_task_struct(current);
if (!p)
goto fork_out;
2、PCBの初期化、例えばスピンロック、タイマー
INIT_LIST_HEAD(&p->children);
INIT_LIST_HEAD(&p->sibling);
p->vfork_done = NULL;
spin_lock_init(&p->alloc_lock);
spin_lock_init(&p->proc_lock);
clear_tsk_thread_flag(p, TIF_SIGPENDING);
init_sigpending(&p->pending);
3、親プロセスのコピーメモリをmm_管理するstruct,ファイル記述子files,ファイルシステムfs,信号,信号処理関数
if ((retval = copy_semundo(clone_flags, p)))
goto bad_fork_cleanup_audit;
if ((retval = copy_files(clone_flags, p)))
goto bad_fork_cleanup_semundo;
if ((retval = copy_fs(clone_flags, p)))
goto bad_fork_cleanup_files;
if ((retval = copy_sighand(clone_flags, p)))
goto bad_fork_cleanup_fs;
if ((retval = copy_signal(clone_flags, p)))
goto bad_fork_cleanup_sighand;
if ((retval = copy_mm(clone_flags, p)))
goto bad_fork_cleanup_signal;
if ((retval = copy_keys(clone_flags, p)))
goto bad_fork_cleanup_mm;
if ((retval = copy_namespace(clone_flags, p)))
goto bad_fork_cleanup_keys;
ここではレジスタの値もcopyと初期化を行い、eaxの値を0(したがってサブプロセス戻り値は0)にし、EIPをret_に設定するfrom_forkの開始アドレス(サブプロセスはここから実行)
retval = copy_thread(0, clone_flags, stack_start, stack_size, p, regs);
if (retval)
goto bad_fork_cleanup_namespace;
4、sched_を呼び出すfork()は、サブプロセスの静的優先度を初期化し、サブプロセスをTASK_に設定します.RINNING状態
sched_fork(p);