`
adrift
  • 浏览: 19137 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Linux的核心启动流程

 
阅读更多
下面以RedHat Fedora Core5(Linux 2.6.15-1.2054_FC5)为基础说说Linux的启动流程。
打开计算机电源后,第一个执行的程序是ROM BIOS,该程序根据设置选择一个引导设备,比如软盘、硬盘、光盘或者USB盘等,然后读入引导设备上的一小段程序(称为BootLoader,常见的有lilo,grub等)。
BootLoader会读入相关的引导选单并执行。一般的引导选单上会指定从哪个设备的哪个分区读入操作系统内核,给操作系统传入哪些命令行参数(cmdline)、初始的RAMDISK(initrd)等等。BootLoader将系统核心以及initrd读入内存并传递好cmdline/initrd后就结束了自己的使命,控制权转移到Linux kernel。
我采用的BootLoader是grub,被安装在第一个SCSI盘的第一个分区上,其上的grub.conf内容如下(#后的注释是我加的,下同):
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
title Fedora Core (2.6.15-1.2054_FC5)
        root (hd0,0) # 指定操作系统内核(Kernel)文件所在的磁盘和分区
        kernel /vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ # 指定操作系统的文件名称以及cmdline
        initrd /initrd-2.6.15-1.2054_FC5.img # 指定initrd
title MiniLinux-USB (2.6.15-1.2054_FC5)
        root (hd1,0)
        kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=/dev/ram0
        initrd /boot/initrd-minilinux-usb.img
操作系统内核(Kernel)会执行各种必要的初始化如内存页表、进程表等等数据结构,初始化被编译到Kernel的内核模块以及设备驱动等等,很多初始化都需要分析cmdline以便在多个策略中选择。
接下来的启动流程分为两个分支:
1) 如果BootLoader指定了initrd,则解压initrd指定的初始RAM DISK映像到/dev/ram0并挂装/dev/ram0作为根文件系统,然后执行/init。
/init的目的一般是装载最终的根文件系统所必须的文件系统内核模块,建立一些设备特别文件并挂装最终的根文件系统(如果不是/dev/ram0)。
我安装的RedHat FC5的initrd-2.6.15-1.2054_FC5.img文件是个gzip压缩过的cpio文件,在启动完成后位于/boot目录下(因为启动分区被安装在/boot目录下, 参见下篇“linux的应用启动流程”一文)。我们可以执行下述命令提取其内容
mkdir -p xxx
cd xxx
gunzip -c /boot/initrd-2.6.15-1.2054_FC5.img | cpio -idv
我们可以看到下面有很多目录和文件:
bin/ dev/ etc/ init* lib/  proc/ sbin@ sys/ sysroot/
./bin:
insmod* modprobe@ nash*
./dev:
console null ram@ ram1 systty tty0 tty10 tty12 tty3 tty5 tty7 tty9  ttyS1 ttyS3
mapper/ ptmx ram0 rtc  tty    tty1 tty11 tty2  tty4 tty6 tty8 ttyS0 ttyS2 zero
./dev/mapper:
./etc:
./lib:
BusLogic.ko  ext3.ko  jbd.ko  scsi_mod.ko  sd_mod.ko
./proc:
./sys:
./sysroot:
其中/init内容如下:
#!/bin/nash #由/bin/nash解释执行
mount -t proc /proc /proc #挂装proc文件系统
setquiet #安静模式
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys #挂装sysfs文件系统
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67 #以上创建必要的设备特别文件
echo Setting up hotplug.
hotplug # 设置可以热插拔的设备插拔时的处理程序
echo Creating block device nodes.
mkblkdevs # 利用sysfs文件系统自动创建当前发现的块设备的特别文件,关于sysfs将是另一篇文章的内容了
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading scsi_mod.ko module"
insmod /lib/scsi_mod.ko
echo "Loading sd_mod.ko module"
insmod /lib/sd_mod.ko
echo "Loading BusLogic.ko module"
insmod /lib/BusLogic.ko # 前面几个insmod装载接下来挂装最终的根文件系统所必需的驱动程序模块
mkblkdevs # 创建刚刚这些驱动程序发现并注册到sysfs文件系统中的块设备的特别文件
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro /dev/root # 分析kernel cmdline寻找根文件设备并创建一个特别文件指向该设备(如果是以“LABEL=”开始则自动寻找分区表上对应该LABEL的分区)并加入到/etc/fstab中
echo Mounting root filesystem.
mount /sysroot #将最终的根文件系统临时挂装到/sysroot下
echo Setting up other filesystems.
setuproot # 设置proc,sys等文件系统到/sysroot下
echo Switching to new root and running init.
switchroot # 将/sysroot切换为最终的根文件系统,并执行其上的/init,见后
2) 如果BootLoader没有指定initrd,直接挂装cmdline上指定的root设备作为根文件系统,接下来按照下面的顺序寻找init程序并建立第一个进程:
run_init_process("/sbin/init"); // 找到就建立第一个进程(pid=0),不会返回了,下面三行同此
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控制转入应用启动流程,这个待下篇文章再说吧。
分享到:
评论

相关推荐

    Linux内核启动过程分析.pdf

    Linux内核在80x86平台上的启动流程主要包括以下几个阶段: ##### 1. BIOS启动 当PC机开机时,CPU自动进入实模式,并从ROM-BIOS的固定地址(通常是0xFFFF0)开始执行代码。BIOS会进行一系列的自检操作,如内存检测...

    Linux 的启动流程

    Linux操作系统的启动流程是指从计算机开启电源到操作系统完全启动并可以进行操作的整个过程。这个流程可以分为多个步骤,每个步骤都是启动过程中不可或缺的部分,涉及了从硬件的初始化到内核的加载,再到系统服务的...

    linux 2.6 启动流程分析

    Linux 2.6 启动流程是操作系统启动过程的关键部分,它涉及到内核加载、硬件初始化、设备驱动程序启动等多个环节。在这个过程中,内核能够接收一个字符串命令行,允许用户自定义启动参数以控制内核的行为。让我们深入...

    Linux启动过程综述

    本文旨在详细介绍80x86平台上的Linux启动流程,将其分为四个阶段:硬件启动阶段、内核引导阶段、内核运行与系统初始化阶段以及Init进程运行阶段。 #### 二、启动过程详解 ##### 2.1 硬件启动阶段 此阶段主要由...

    Linux启动流程3-3

    - 这就是“Linux启动流程3-3”的核心。SysV服务脚本位于/etc/init.d目录下,用于控制启动、停止、重启服务。 - 每个服务都有一个对应的脚本,脚本定义了如何启动、停止服务以及进行其他维护操作。 7. **运行级...

    linux2.4的启动过程

    图1是一个函数调用流程图,描述了内核启动的过程。如图所示,内核初始化经过多个不同的阶段,从最基本的硬件初始化开始,到内核启动 `/bin/init` 和其他用户程序结束。图中的虚线表示 `init()` 函数是以一个内核线程...

    Linux内核启动流程

    Linux内核启动流程是操作系统核心运行的起点,它涉及了一系列复杂的步骤,确保系统能够正确地加载和执行。这里,我们将详细探讨从自解压到CPU初始化,再到`start_kernel`函数的整个过程。 1. **BIOS启动**:当...

    linux系统启动全过程.pdf

    需要注意的是,由于文档是扫描识别生成的,某些文字可能无法准确识别,但是整体内容依然清晰,讲述了一个完整的Linux系统从启动到用户登录的全部流程,并指导了如何配置和解决问题的方法。文档的结构化布局和内容的...

    剖析Linux系统启动过程

    剖析Linux系统启动过程 今日,我们将深入剖析 Linux 系统启动过程,从用户打开电源到屏幕出现命令行提示符的整个过程。 1. BIOS 开机自检 当用户打开 PC 的电源,BIOS 开机自检,按 BIOS 中设置的启动设备...

    linux_启动过程详解

    Linux 系统的启动流程是一个复杂而有序的过程,涉及多个步骤,从硬件初始化到操作系统核心的加载,再到用户空间服务的启动。以下是对这个过程的详细解析: 1. BIOS 初始化: - BIOS(基本输入输出系统)首先进行...

    linux 2.6.22启动过程分析

    通过对Linux 2.6.22内核启动过程的详细解析,我们可以看到,整个启动流程涉及到了硬件初始化、内存管理和子系统初始化等多个方面。每一步都至关重要,确保了内核能够高效稳定地运行。虽然2.6.22版本已不再是最新的,...

    Linux系统启动过程

    Linux开机过程: (1) 加载BIOS硬件信息,并取得第一个开机装置代号 (2) 读取第一个开机装置的MBR的boot Loader(grub)开机信息 (3) 加载Kernel操作系统核心信息,Kernel开始解压缩,并且尝试驱动所有硬件装置 ...

    linux内核启动流程.doc

    Linux内核启动流程是计算机启动过程中的一个重要步骤,它涉及到硬件检测、引导程序加载、内核初始化等多个方面。在本文中,我们将对 Linux 内核启动流程进行详细的分析和说明。 一、硬件检测 机器加电后,BIOS...

    linux系统启动过程分析.ppt

    接着,`init`进程作为第一个用户级进程启动,它是系统启动过程中的核心。`inittab`文件(在某些现代发行版中被Systemd替代)定义了系统的运行级别和启动服务,比如设置终端和登录提示。`init`会根据配置调用`getty`...

    linux2.6内核启动流程

    Linux 2.6 内核的启动流程是一个复杂但有序的过程,涉及到多个关键步骤。从自解压缩到最终启动应用程序,每一步都至关重要。理解这些步骤对于深入学习Linux内核工作原理及系统启动机制有着重要意义。

    Linux启动过程分析

    Linux 启动过程分析是嵌入式 Linux 系统的核心组成部分,理解 Linux 启动过程对嵌入式系统的开发和应用至关重要。本文将详细分析 Linux 启动过程,包括 bootloader 的执行流程和 ARM Linux 的启动过程。 1. Linux ...

    linux启动流程分析.pdf

    ### Linux启动流程分析 #### 一、Bootloader启动内核过程 Linux系统启动时的核心流程之一便是由Bootloader引导内核。在这个过程中,Bootloader负责完成一系列基础设置,并最终将控制权交给内核。以下是对...

Global site tag (gtag.js) - Google Analytics