CPU_LWP_FORK(9) | Kernel Developer's Manual | CPU_LWP_FORK(9) |
cpu_lwp_fork
, child_return
,
lwp_trampoline
—
#include <sys/proc.h>
void
cpu_lwp_fork
(struct
lwp *l1, struct lwp
*l2, void *stack,
size_t stacksize,
void (*func)(void *),
void *arg);
void
child_return
(void
*arg);
cpu_lwp_fork
() is the machine-dependent portion of
fork1
() which finishes a fork operation, with child
lwp l2 nearly set up. It copies and updates the PCB and
trap frame from the parent l1, making the child ready to
run.
cpu_lwp_fork
() rigs the child's kernel
stack so that it will start in lwp_trampoline
().
lwp_trampoline
() does not have a normal calling
sequence and is entered by cpu_switchto
(). If an
alternate user-level stack is requested (with non-zero values in both the
stack and stacksize arguments),
the user stack pointer is set up accordingly.
After being entered by cpu_switchto
() and
while running in user context (within the kernel)
lwp_trampoline
() will invoke the function
func with the argument arg. If a
kernel thread is being created, the return path and argument are specified
with func and arg. If a user
process is being created, fork1
() will pass
child_return
() and l2 to
cpu_lwp_fork
() as func and
arg respectively. This causes the newly-created child
process to go directly to user level with an apparent return value of 0 from
fork(2), while the parent
process returns normally.
April 26, 2018 | NetBSD 9.0 |