forkソース概要分析

2005 ワード

forkはシステム呼び出しに属し、まずユーザ状態からカーネル状態に切り替える.このプロセスは前述したように、カーネル状態になったらsys_を呼び出す.fork()を呼び出しdo_を呼び出しますfork():
asmlinkage int sys_fork(struct pt_regs regs)
{
	return do_fork(SIGCHLD, regs.esp, &regs, 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);