技术开发 频道

Linux驱动开发必看:详解神秘内核

  2.1.11 INIT: version 2.85 booting

  所有Linux进程的父进程init是内核完成启动序列后运行的第1个程序。在init/main.c的最后几行,内核会搜索一个不同的位置以定位到init:

if (ramdisk_execute_command) { /* Look for /init in initramfs */
  run_init_process(ramdisk_execute_command);
}

if (execute_command) { /* You may override init and ask the kernel
                          to execute a custom program using the
                          "init=" kernel command-line argument. If
                          you do that, execute_command points to the
                          specified program
*/
  run_init_process(execute_command);
}

/* Else search for init or sh in the usual places .. */
run_init_process(
"/sbin/init");
run_init_process(
"/etc/init");
run_init_process(
"/bin/init");
run_init_process(
"/bin/sh");
panic(
"No init found. Try passing init= option to kernel.");

  init会接受/etc/inittab的指引。它首先执行/etc/rc.sysinit中的系统初始化脚本,该脚本的一项最重要的职责就是激活对换(swap)分区,这会导致如下启动信息被打印:

  Adding 1552384k swap on /dev/hda6

  让我们来仔细看看上述这段话的意思。Linux用户进程拥有3 GB的虚拟地址空间(见2.7节),构成“工作集”的页被保存在RAM中。但是,如果有太多程序需要内存资源,内核会释放一些被使用了的RAM页面并将其存储到称为对换空间(swap space)的磁盘分区中。根据经验法则,对换分区的大小应该是RAM的2倍。在本例中,对换空间位于/dev/hda6这个磁盘分区,其大小为1 552 384 KB。

  接下来,init开始运行/etc/rc.d/rcX.d/目录中的脚本,其中X是inittab中定义的运行级别。runlevel是根据预期的工作模式所进入的执行状态。例如,多用户文本模式意味着runlevel为3,X Windows则意味着runlevel为5。因此,当你看到INIT: Entering runlevel 3这条信息的时候,init就已经开始执行/etc/rc.d/rc3.d/目录中的脚本了。这些脚本会启动动态设备命名子系统(第4章中将讨论udev),并加载网络、音频、存储设备等驱动程序所对应的内核模块:

  Starting udev: [ OK ]

  Initializing hardware... network audio storage [Done]

  ...

  最后,init发起虚拟控制台终端,你现在就可以登录了。

0
相关文章