| 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.2 |