第一个用户进程是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
推荐阅读
- 农行贷记卡和信用卡的区别
- 香菜白粉病的防治
- 开心一日游的句子
- 百年康欣保2020是消费型的吗
- 我的6680使用一个月感受
- 33朵红玫瑰的花语是什么?
- FreeBSD系统安装与配置之准备篇
- FreeBSD的磁盘和BIOS的关系
- 视频的水印可以去掉吗
- 各种维生素的作用