x86架构linux内核引导过程分析,X86架构下Linux启动过程分析

1、X86架构下的从开机到Start_kernel启动的总体过程

这个过程简要概述为:

开机——>BIOS——>GRUB/LILO——>Linux Kernel

其运行的流程图和重要函数如下图所示:

c9f3b42c73b894e20b05ddc0ca036bb6.png

2、加载Linux内核(基于X86)的内存布局图

|          |

0A0000 +--------------------------+

|  Reserved for BIOS    | Do not use. Reserved for BIOS EBDA.

09A000 +--------------------------+

|  Command line    |

|  Stack/heap    | For use by the kernel real-mode code.

098000 +--------------------------+

|  Kernel setup    | The kernel real-mode code.

090200 +--------------------------+

|  Kernel boot sector    | The kernel legacy boot sector.

090000 +--------------------------+

|  Protected-mode kernel | The bulk of the kernel image.

010000 +--------------------------+

|  Boot loader    |

001000 +--------------------------+

|  Reserved for MBR/BIOS |

000800 +---------------------------+

|  Typically used by MBR |

000600 +--------------------------+

|  BIOS use only        |

000000 +--------------------------+

3、启动

2、BIOS启动引导阶段

BIOS调用Bootloader来把操作系统的内核映像加载到系统RAM中。

(1)、当PC的电源打开后,80x86架构的cpu将自动进入实模式,并从地址0xFFFF0(CS:0xFFFF,IP:0x0)开始自动执行程序代码,这个地址通常是BIOS的地址。

(2)、BIOS的首先进行POST(Power On Self Test即加电后自检),检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。此时显卡还没有初始化,如果发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),BIOS会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。

(3)、然后物理地址0处开始初始化中断向量(注意:这个BIOS的中断向量很重要,后边的很多和硬盘等的交互都是通过此中断向量完成的)。

(4)、此后,BIOS将启动设备的第一个扇区(第0磁道第一个扇区被称为MBR即主引导记录,它的大小是512字节,里面存放了用汇编语言编写的预启动信息、分区表信息、魔数0x55AA),读入内存绝对地址0x7C00处,并跳转到这个地址并执行。其实被复制到物理内存0x7C00处的内容就是Boot Loader,对于较早的内核不靠grub启动的,它就是bootsect.S程序,而对于现在PC多数使用grub引导启动的,就是lilo或者grub了。

3、Bootloader阶段

Bootloader程序是为计算机加载(load)计算机OS内核的。bootloader程序通常位于硬盘上,被BIOS调用,用于加载内核。在PC机上常见的bootloader主要有grub和lilo等。

GRUB(GRand Unified Bootloader)是当前linux诸多发行版本默认的引导程序。嵌入式系统上,最常见的bootloader是U-BOOT。这样的bootloader一般位于MBR的最前部。在linux系统中,bootloader也可以写入文件系统所在分区中。比如,grub程序就非常强大。Gurb运行后,将初始化设置内核运行所需的环境。然后加载内核镜像。grub磁盘引导全过程:

(1)stage1、grub读取磁盘的第一个512字节的主引导记录MBR。

(2)stage1.5、识别各种不同的文件系统格式,目的是为了grub能识别到文件系统。

(3)stage2、加载系统引导菜单(/boot/grub/menu.lst或grub.lst),加载内核vmlinuz和RAM磁盘initrd。

4、Linux内核启动过程

内核映像文件vmlinuz:包含有linux内核的静态链接的可执行文件,传统上,vmlinux被称为可引导的内核镜像。vmlinuz是vmlinux的压缩文件。其构成包括:

1、第一个512字节的bootsect(第一个块)

2、第二个是setup代码,若干不多个512字节(一会再说它多大)

3、保护模式下的内核代码

bzImage文件:使用make bzImage命令编译内核源代码,可以得到采用zlib算法压缩的zImage文件,即big zImage文件。老的zImage解压缩内核到低端内存,bzImage则解压缩内核到高端内存(1M(0x100000)以上),在保护模式下执行。

bzImage文件由setup和vmlinux两部分组成,setup是实模式下的代码,vmlinux是保护模式下的代码。具体包含vmlinuz、bootsect.o、setup.o、解压缩程序misc.o、以及其他一些相关文件(如piggy.o)。

initramfs(或initrd)文件:initrd是initialized ram disk的意思。主要用于加载硬件驱动模块,辅助内核的启动,挂载真正的根文件系统。

原文:http://blog.csdn.net/yuesichiu/article/details/38419601

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值