FreeBSD的Loader和内核初始化( 五 )


第一个用户进程是init,由sysinit对象init建立:sys/kern/init_main.c:
static void
create_init(const void *udata __unused)
{
int error;
int s;
s = splhigh();
error = fork1(&proc0, RFFDG | RFPROC, &initproc);
if (error)
panic("cannot fork init: %dn", error);
initproc->p_flag |= P_INMEM | P_SYSTEM;
CPU_set_fork_handler(initproc, start_init, NULL);
remrunqueue(initproc);
splx(s);
}
SYSINIT(init,SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL)
create_init()通过调用fork1()分配一个新的进程,但并不将其标记为可运行 。
当这个新进程被调度器调度执行时,start_init()将会被调用 。
那个函数定义在init_main.c中 。它尝试装载并执行二进制代码init,
先尝试/sbin/init,然后是/sbin/oinit,/sbin/init.bak,
最后是/stand/sysinstall:sys/kern/init_main.c:
【FreeBSD的Loader和内核初始化】static char init_path[MAXPATHLEN] =
#ifdef INIT_PATH
__XSTRING(INIT_PATH);
#else
"/sbin/init:/sbin/oinit:/sbin/init.bak:/stand/sysinstall";
#endif

推荐阅读