标题:
X86架构下Linux启动过程分析
[打印本页]
作者:
苹果也疯狂
时间:
2015-6-30 21:15
标题:
X86架构下Linux启动过程分析
1
、
X86
架构下的从开机到
Start_kernel
启动的总体过程
这个过程简要概述为:
开机——
>BIOS
——
>GRUB/LILO
——
>Linux Kernel
其运行的流程图和重要函数如下图所示:
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 +--------------------------+ <--- __start
函数开始执行地址
| Kernel boot sector | The kernel legacy boot sector.
090000 +--------------------------+ <--- header.S
| Protected-mode kernel | The bulk of the kernel image.
010000 +--------------------------+
| Boot loader | <- Boot sector entry point 0000:7C00
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://bbs.eccn.com/)
Powered by Discuz! 7.0.0