1.4 KiB
1.4 KiB
title | date | slug | description |
---|---|---|---|
Kernel, creation of new process | 2023-11-26T07:44:51.449Z | kernel-new-process-creation | Deep dive Linux Kernel #3 |
static int init(void * unused)
{
lock_kernel();
do_basic_setup();
/*
* Ok, we have completed the initial bootup, and
* we're essentially up and running. Get rid of the
* initmem segments and start the user-mode stuff..
*/
free_initmem();
unlock_kernel();
if (open("/dev/console", O_RDWR, 0) < 0)
printk("Warning: unable to open an initial console.\n");
(void) dup(0);
(void) dup(0);
/*
* We try each of these until one succeeds.
*
* The Bourne shell can be used instead of init if we are
* trying to recover a really broken machine.
*/
if (execute_command)
execve(execute_command,argv_init,envp_init);
execve("/sbin/init",argv_init,envp_init);
execve("/etc/init",argv_init,envp_init);
execve("/bin/init",argv_init,envp_init);
execve("/bin/sh",argv_init,envp_init);
panic("No init found. Try passing init= option to kernel.");
}
At open("/dev/console") is opens fd 0, and with two
dup(0), fd 0, 1, 2 as stdin, stdout, stderr opens. When
execve()or
fork()happens, it simply copies calling process's
task_struct` as process context, so all file descriptors are also passed down.
All processes' file descriptor 0, 1, 2 are all originates to init
's file descriptor, set up like above.