`
adrift
  • 浏览: 18140 次
  • 性别: 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系统启动过程

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

    Linux启动过程综述

    一.Bootloader 二.Kernel引导入口 三.核心数据结构初始化--内核引导第一部分 四.外设初始化--内核引导第二部分 五.init进程和inittab引导指令 六.rc启动脚本 七.getty和login 八.bash

    ARM_Linux启动分析.pdf

    提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options()) 控制台初始化(为输出信息而先于PCI初始化,console_init()) 剖析器数据结构初始化(prof_buffer和prof_len变量) ...

    嵌入式系统/ARM技术中的关于Linux的启动和核心

    Linux是一类Unix计算机操作系统的... 这里分为四部分内容: 一、Linux核心源码结构介绍 二、编译和配置的过程 三、系统启动顺序的相关文件 四、核心改造的一些经验 一、 当安装好一个Linux系统,通常核心源码存放在/u

    深入分析Linux内核源代码

    自由软件Linux 操作系统源代码的开放...也包括对Linux 整体结构的把握、Linux 的启动过程的分析及Linux 独具特色的模块机制的 分析与应用等。其中重点剖析了Linux 内核中最基础的部分:进程管理、内存管理及文件管 理。

    深入分析Linux_内核源代码

    自由软件 Linux 操作系统源代码...也包括对 Linux 整体结构的把握、Linux 的启动过程的分析及 Linux 独具特色的模块机制的 分析与应用等。其中重点剖析了 Linux 内核中最基础的部分:进程管理、内存管理及文件管 理。

    Linux内核解析案例详解

    内核启动过程:了解Linux内核的启动过程,包括引导加载程序(bootloader)加载内核镜像、初始化内核数据结构、设置中断向量表等。 设备驱动程序:分析和理解Linux内核中的设备驱动程序,包括字符设备驱动、块设备...

    Linux面试题的汇总

    什么是Linux ...Linux 开机启动过程? 1、主机加电自检,加载 BIOS 硬件信息。 2、读取 MBR 的引导文件(GRUB、LILO)。 3、引导 Linux 内核。 4、运行第一个进程 init (进程号永远为 1 )。 5、进入相应的运

    基于嵌入式Linux的视频监控系统

    其次,将介绍Bootloader的启动原理及运行过程,并分析在ARM平台上嵌入式Linux的源代码以及内核的组成和编译过程,文件系统的制作,接着论述了如何在ARM硬件平台上进行Bootloader、嵌入式Linux内核和文件系统的移植。...

    Linux管理员指南

    第7章介绍的是Linux系统的开机和关机流程,以及如何设置Linux操作系统的开机启动管理程序LILO。第8章转向介绍如何对硬盘进行操作,讨论如何对硬盘进行管理、怎样建立分区以及设定硬盘的使用限额。第9章涉及到作为一...

    Linux从入门到精通

    E.6.17 我安装Linux时没有遇到错误, 但是在重启动时, 我只能得到L, LI 和其他一个项目. 为什么? E.7 使用Red Hat Linux E.7.1 我不能运行我编译的任何程序, 因为 我得到一个"command not found"出错信息. 我在目录...

    嵌入式Linux C编程入门(第2版) PPT

    3.2.2 bootloader启动流程分析 89 3.2.3 u-boot概述 89 3.2.4 u-boot源码导读 90 3.3 编译嵌入式linux内核 91 3.4 linux内核目录结构 95 3.5 制作文件系统 95 本章小结 97 动手练练 97 第4章...

    《Linux从入门到精通》

    E.6.17 我安装Linux时没有遇到错误, 但是在重启动时, 我只能得到L, LI 和其他一个项目. 为什么? E.7 使用Red Hat Linux E.7.1 我不能运行我编译的任何程序, 因为 我得到一个"command not found"出错信息. 我在目录...

    linux系统安装图文教程详解(保姆级)

    linux安装教程:首先linux分为实体机安装和虚拟机安装...我也没有一一介绍的必要,因为所有发行版的核心都是linux,所以安装过程也基本一致。因此,我这里以CentOS为例以图文并茂的方式详细介绍下linux系统的安装过程。

    鸟哥的Linux私房菜基础学习篇(第二版PDF)02

    目录 第一部分 认识Linux及Linux主机规划安装  第1章 什么是Linux   第2章 如何学习Linux  ... 第26章 Linux核心编译与管理  附录A GNU的GPL条款  附录B ext2/ext3文件系统 共有两部分,要都下了才能解压~

    Linux的使用

    Linux的启动和关闭 启动 关闭 shutdown –h now 关机 (推荐) shutdown –r now 重启 (推荐) halt 系统停机 .../boot目录下面存放着和系统启动有关系的各种文件,包括系统的引导程序和系统核心部分。

    Xilinx Zynq SoC与嵌入式Linux设计实战指南

    内容包括Zynq初体验、Zynq集成开发环境、Zynq启动流程及镜像制作、GPIO原理及实现、中断原理及实现、定时器原理及实现、通用异步收发器原理及实现、OLED原理及实现、Zynq双核运行原理及实现、嵌入式Linux系统构建、...

    《精通Linux 设备驱动程序开发》.(Sreekrishnan).pdf

    2.1 启动过程11 2.1.1 bios-provided physical ram map12 2.1.2 758mb lowmem available14 2.1.3 kernel command line: ro root=/dev/hda114 2.1.4 calibrating delay...1197.46 .bogomips (lpj=2394935...

    linux从入门到精通.chm

    E.6.17 我安装Linux时没有遇到错误, 但是在重启动时, 我只能得到L, LI 和其他一个项目. 为什么? E.7 使用Red Hat Linux E.7.1 我不能运行我编译的任何程序, 因为 我得到一个"command not found"出错信息. 我在目录...

Global site tag (gtag.js) - Google Analytics