006.Vmware-Linux Kernel 引导加载过程

来源:互联网 发布:移动工作站笔记本知乎 编辑:程序博客网 时间:2024/06/05 03:45
Subject:Vmware-Linux Kernel 引导加载过程

Date:     4-Mar-2011

By:        Calvinlee1984@163.com

 

1. Linux 通过执行不同阶段的引导加载程序程序来引导操作系统,在完成内核等引导之后,最终会由调度器接管 CPU,其通过启用中断来周期性的抢占控制权,处理多个用户进程/客户进程。

 

2. Linux系统引导共分五步执行:

1)  BIOS,包括POSTRuntime服务;

2)  被称为Stage1的MBR位于BIOS配置的磁盘0柱面1扇区,用于启动Stage2;

3)  Stage2为Linux boot loader,主要有 LILO (Linux loader)和 GNU GRUB (Grand unified boot loader)两种 boot loader 程序,现主流为 GRUB;

4)  Linux kernel(及initrd函数)引导,负责加载并解压 zImage/bzImage kernel 及 initrd 映像,并开始执行 kernel 初使化和引导程序/过程;

5)  Init进程,用于启动 linux 配置的各项用户空间服务(demon)进程。

 

3.系统上电后首先被执行的是BIOS(Base Input/Output System),负责在一位于ROM/FLASH中预定地址开始执行引导程序,主要分二部分:

1)  POST(Power On Self Test),负责接通电源时对硬件检测,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等;

2)  Runtime,负责为操作系统提供主要与外设I/O有关的服务。

注:当 BIOS POST 执行完后,其将会从内存中清理,而 Runtime 服务会常驻内存,为操作系统提供一些底层的支持。最后 BIOS 将控制权交给MBR 程序。

 

4.MBR是一个512 Byte固定大小的映像,包括446 Byte的初始程序加载程序IPL的可执行代码和64 Byte的分区表(16 Byte * 4),最后以‘魔数’0xaa55结束

MBR引导程序会将扫描分区表,获得唯一活动分区后,将其中的引导程序读入 RAM 并开始执行。MBR启动的引导程序被称为第二阶段引导程序,是引导的主体,是引导加载的真正部分。Linux 中该阶段有两个流行的程序,LILO (较老)和 GRUB。通过 root 用户执行相关命令来通过 LILO/GRUB 生成默认配置的 MBR ,并写入到启动磁盘 0 柱面 1扇区位置上。

 

5.grub.conf分析 cat /boot/grub/grub.conf

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:  You have a /boot partition.  This means that

           //有一/boot分区

#          all kernel and initrd paths are relative to /boot/, eg.

           //所有的kernel及initrd都在/boot/下

#          root (hd0,0)

#          kernel /vmlinuz-version ro root=/dev/sda3

#          initrd /initrd-version.img

#boot=/dev/sda

default=0     //默认操作系统由default控制,0表第一个硬盘

timeout=5     //默认等待时间

splashimage=(hd0,0)/grub/splash.xpm.gz //启动菜单的背景图片xpm格式

hiddenmenu  

title Red Hat Enterprise Linux AS (2.6.9-5.EL) //启动项目的名称

        root (hd0,0) //GRUB 的root分区指保存linux内核的分区->第一硬盘,第一分区

        kernel /vmlinuz-2.6.9-5.EL ro root=LABEL=/  //指定载入的内核名称,后面是传递给内核的参数,ro表readonly

        initrd /initrd-2.6.9-5.EL.img   //指定initrd(初始化linux image)的位置

附:该Vmware-Linux分区表 fdisk -l

在LINUX下每个分区分别用一个目录名表示,从属于一个名为:“根目录”的目录中,用斜杠“/”表示,也称为根(root)。每个分区所在的目录称为该分区的“加载点”,表示计算机启动时将这个分区加载到该目录中。在安装过程中,必须划分一个分区用作根目录。

 

6.GRUB将默认的内核和initrd映像加载到内存中,接下来就是Kernel加载引导过程:

1)  执行对硬件作基本设置的例程: ./arch/x386/boot/header.S

2)  设置堆栈并清除BSS

3)  解压内核: ./arch/x386/boot/compressed/misc.c->decompress_kernel()

4)  启动swapper进程,初始化页表,启用CPU内存分页

5)  调用Linux kernel main函数,进入与体系结构无关的Linux内核部分./init/main.c这会调用一系列初始化函数来设置中断,执行进一步的内存配置,并加载已初始化的 RAM 盘。最后启动 init 进程,这是第一个用户空间进程(user-space process)./arch/x386/kernel/process.c ->kernel_thread()

6)  启动空任务,调度器接管控制权了(在调用 cpu_idle 之后)。通过启用中断,抢占式的调度器就可以周期性地接管控制权,从而提供多任务处理能力。