Linux启动过程
2010-06-04 18:05
148 查看
(
1
)打开
PC
电源
PC
加电后,一个特殊的硬件电路会触发
CPU
的
Reset
脚的逻辑值,然后一些
CPU
寄存器,如
CS
,
eip
等被给定一个值,接着
CPU
跳转到一个固定地址开始执行代码(
BIOS
);
(
2
)
BIOS
自检,按设置的设备启动
BIOS
对硬件进行一系列彻底的检查,如
CPU
类型、速度、缓存等,主板类型,内存速度、容量,硬盘大小、类型和工作模式,风扇速度等。
BIOS
完成自检后,查找一个可以引导的操作系统,并查看用户配置的启动设备(软盘、硬盘或者光盘启动)。发现合法的设备后(读取
CMOS
中的引导设备信息),
BIOS
就会把其第一扇区的内容(
MBR
)复制到内存中。然后跳至刚加载的地址并执行之。
(
3
)启动设备上安装的引导程序
LiLo
或
Grub
在
Linux
启动中,当
BIOS
发现是由硬盘引导系统后,就找到此硬盘的
MBR
,将
MBR
中保存的引导程序加载到内存中,然后将
CPU
的控制权交给
MBR
中的这段代码。
MBR
中的内容可分为三部分:
1
)真正的可执行代码,即
BootLoader
代码部分;
2
)一个
64
字节的分区表,包含四个分区记录;
3
)结束标识符(
0xAA55
),用来做
MBR
的有效性检测。
BootLoader
开始执行,它主要有
LiLo
,
Grub
。
(
4
)引导
Linux
内核映像
BootLoader
查找分区表中的活动分区(包含了真正分区的信息),通过这个信息找到真正的分区,然后从这个分区将
Linux
内核加载到内存,并
Initrd
文件系统到内存中。获得
CPU
控制权的内核开始执行:
1
)核心数据结构初始化
-- start_kernel()
函数,调用一系列初始化函数,完成
kernel
本身的设置,在其最后,通过调用
init
()函数,系统创建第一个核心线程,启动
init
过程;
2
)外设初始化—
init()
函数,首先调用
do_basic_setup()
完成外设及其驱动程序的加载和初始化,文件系统初始化和
root
文件系统的安装;
3
)
do_basic_setup()
函数返回
init()
后,
init()
打开
/dev/console
设备,重定
stdin
、
stdout
、
stderr
到控制台;
4
)最后,搜索文件系统中的
init
程序(或者由
init=
命令行参数指定的程序),并使用
execve()
系统调用
加载执行
Init
程序。到此
init()
函数结束,内核的引导部分也到此结束了。
(
5
)执行
Init
程序
Init
程序调用
rc.sysinit
和
rc
的等程序,完成系统初始化和运行服务后返回
Init
。
Init
程序执行的内容可以在
/etc/inittab
文件中定义。
A
.
Init
调用执行脚本文件
/etc/rc.d/rc.sysinit
,用来完成一些系统初始化的工作。包括:挂载进程文件系统
proc
、设定电脑名称和系统的时间、定义键盘、启用
swap
分区、检查根目录
(/)
有没有问题,并且挂载成可读可写的状态、设定系统的时间、加载一些其他的设备,如
RAID
和
LVM
等。当
rc.sysinit
程序执行完毕后,返回
Init
继续下一步。
B
.在
rc.sysinit
执行后,通常接下来会执行到
/etc/rc.d/rc
程序
,用来决定启用哪些服务。守护进程启动完成后,
rc
程序也就执行完了,然后又将返回
Init
继续下一步。
C
.这时,基本系统环境已经设置好了,各种守护进程也已经启动了。
Init
接下来会打开
6
个终端,以便用户登录系统。通过按
Alt+Fn(n
对应
1-6)
可以在这
6
个终端中切换。在
inittab
中的以下
6
行就是定义了
6
个终端:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
在
2
、
3
、
4
、
5
的运行级别中都将以
respawn
方式运行
mingetty
。
(
6
)
Init
启动
mingetty
,打开终端供用户登录系统
Mingetty
是
getty
的简化,
getty
的功能一般包括:
1
)打开终端线,并设置模式;
2
)输出登录界面及提示,接受用户名的输入;
3
)以该用户名作为
login
的参数,加载
login
程序。
(
7
)用户成功登录,进入
shell
,完成整个启动过程。
A
.
Login
程序判断
getty
传来的用户名,如果是
root
,则在
/etc/securetty
中指定的
tty
列表登录,否则失败;如果不是,查看是否存在
/etc/nologin
文件,存在则终止登录过程,不存在表示可以登录。
B
.分析完用户名后,
login
搜素
/etc/passwd
及
/etc/shadow
来验证密码。
C
.成功登录后,检查是否需要输出上次登录信息和提示邮件,然后设置
shell
的
UID
、
GID
和相应的环境变量。
D
.一切就绪后,为用户启动
shell
,如果没有设置,则默认是
/bin/bash
,工作目录默认是“
/
”。
Julia
1
)打开
PC
电源
PC
加电后,一个特殊的硬件电路会触发
CPU
的
Reset
脚的逻辑值,然后一些
CPU
寄存器,如
CS
,
eip
等被给定一个值,接着
CPU
跳转到一个固定地址开始执行代码(
BIOS
);
(
2
)
BIOS
自检,按设置的设备启动
BIOS
对硬件进行一系列彻底的检查,如
CPU
类型、速度、缓存等,主板类型,内存速度、容量,硬盘大小、类型和工作模式,风扇速度等。
BIOS
完成自检后,查找一个可以引导的操作系统,并查看用户配置的启动设备(软盘、硬盘或者光盘启动)。发现合法的设备后(读取
CMOS
中的引导设备信息),
BIOS
就会把其第一扇区的内容(
MBR
)复制到内存中。然后跳至刚加载的地址并执行之。
(
3
)启动设备上安装的引导程序
LiLo
或
Grub
在
Linux
启动中,当
BIOS
发现是由硬盘引导系统后,就找到此硬盘的
MBR
,将
MBR
中保存的引导程序加载到内存中,然后将
CPU
的控制权交给
MBR
中的这段代码。
MBR
中的内容可分为三部分:
1
)真正的可执行代码,即
BootLoader
代码部分;
2
)一个
64
字节的分区表,包含四个分区记录;
3
)结束标识符(
0xAA55
),用来做
MBR
的有效性检测。
BootLoader
开始执行,它主要有
LiLo
,
Grub
。
(
4
)引导
Linux
内核映像
BootLoader
查找分区表中的活动分区(包含了真正分区的信息),通过这个信息找到真正的分区,然后从这个分区将
Linux
内核加载到内存,并
Initrd
文件系统到内存中。获得
CPU
控制权的内核开始执行:
1
)核心数据结构初始化
-- start_kernel()
函数,调用一系列初始化函数,完成
kernel
本身的设置,在其最后,通过调用
init
()函数,系统创建第一个核心线程,启动
init
过程;
2
)外设初始化—
init()
函数,首先调用
do_basic_setup()
完成外设及其驱动程序的加载和初始化,文件系统初始化和
root
文件系统的安装;
3
)
do_basic_setup()
函数返回
init()
后,
init()
打开
/dev/console
设备,重定
stdin
、
stdout
、
stderr
到控制台;
4
)最后,搜索文件系统中的
init
程序(或者由
init=
命令行参数指定的程序),并使用
execve()
系统调用
加载执行
Init
程序。到此
init()
函数结束,内核的引导部分也到此结束了。
(
5
)执行
Init
程序
Init
程序调用
rc.sysinit
和
rc
的等程序,完成系统初始化和运行服务后返回
Init
。
Init
程序执行的内容可以在
/etc/inittab
文件中定义。
A
.
Init
调用执行脚本文件
/etc/rc.d/rc.sysinit
,用来完成一些系统初始化的工作。包括:挂载进程文件系统
proc
、设定电脑名称和系统的时间、定义键盘、启用
swap
分区、检查根目录
(/)
有没有问题,并且挂载成可读可写的状态、设定系统的时间、加载一些其他的设备,如
RAID
和
LVM
等。当
rc.sysinit
程序执行完毕后,返回
Init
继续下一步。
B
.在
rc.sysinit
执行后,通常接下来会执行到
/etc/rc.d/rc
程序
,用来决定启用哪些服务。守护进程启动完成后,
rc
程序也就执行完了,然后又将返回
Init
继续下一步。
C
.这时,基本系统环境已经设置好了,各种守护进程也已经启动了。
Init
接下来会打开
6
个终端,以便用户登录系统。通过按
Alt+Fn(n
对应
1-6)
可以在这
6
个终端中切换。在
inittab
中的以下
6
行就是定义了
6
个终端:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
在
2
、
3
、
4
、
5
的运行级别中都将以
respawn
方式运行
mingetty
。
(
6
)
Init
启动
mingetty
,打开终端供用户登录系统
Mingetty
是
getty
的简化,
getty
的功能一般包括:
1
)打开终端线,并设置模式;
2
)输出登录界面及提示,接受用户名的输入;
3
)以该用户名作为
login
的参数,加载
login
程序。
(
7
)用户成功登录,进入
shell
,完成整个启动过程。
A
.
Login
程序判断
getty
传来的用户名,如果是
root
,则在
/etc/securetty
中指定的
tty
列表登录,否则失败;如果不是,查看是否存在
/etc/nologin
文件,存在则终止登录过程,不存在表示可以登录。
B
.分析完用户名后,
login
搜素
/etc/passwd
及
/etc/shadow
来验证密码。
C
.成功登录后,检查是否需要输出上次登录信息和提示邮件,然后设置
shell
的
UID
、
GID
和相应的环境变量。
D
.一切就绪后,为用户启动
shell
,如果没有设置,则默认是
/bin/bash
,工作目录默认是“
/
”。
Julia
相关文章推荐
- 学习笔记3-跟踪分析Linux内核的启动过程
- 简要概述Linux的启动过程
- 系统构造-linux启动过程及系统初始化
- linux启动过程详解
- Linux启动过程详解
- Linux启动过程简略分析-start_kernel部分代码阅读
- Linux操作系统启动过程详解
- 跟踪分析Linux内核的启动过程
- 详解 ARM Linux启动过程分析
- Linux系统的启动,初始化及关机过程
- Linux系统开机启动过程分析
- Linux启动过程详解
- Linux开机启动过程
- Linux内核启动分析过程
- Linux的启动过程与常见故障排除 推荐
- linux启动过程
- Linux系统启动过程分析
- Linux系统启动过程详解
- linux的启动过程
- Linux 系统启动过程