经过几天的学习沉思终于把LINUX 的启动流程好好的整理了一下 下文如有表述不当的地方请给予指点 大家共同探讨
谈系统的启动流程之前我们要说说一个名称: “启动(bootstrap)”
什么是启动?
现实生活中我们能见到各种各样的启动,如汽车开车之前引擎的开启,火箭发射时最后倒计时的准备。在操作系统中有一个专业的术语表示把一部分操作系统加载到主存中并通知CPU处理器开始执行它,同时也是开始系统的初始化,其中包括一些用户进程的创建以及把控制权转移到某个进程。
计算机的启动是一个漫长的过程,在通电前所有的硬件设备都处于随机的、不可预知的状态,所以在启动过程上很大程度依赖于计算机的系统结构
下面开始逐一分析启动过程:
史前时代:BIOS
在计算机加电的前一刻所有硬件设备是毫无作用的,如同史前时代大地一片寂静 所有物体都处于随机、离散的状态,因为RAM芯片中所包含的都是些随机数, 所有操作系统在启动时都要调用BIOS 对计算机硬件设备进行初始化。随着宇宙大爆炸的生命随之诞生而来。
BIOS在启动过程中执行以下四个操作
1.linux 通过POST(power on selftest)通电自检测试现在都由哪些设备能正常工作
2.初始化硬件设备 根据计算机体系结构对硬件设备进行初始化
3.搜索一个操作系统系统来引导启动 。根据BIOS 的设置 在整个过程中讲从系统中软盘,硬盘,和CD-ROM 的第一个扇区 (引导扇区)来逐一查找。
4.只要找到一个有效的设备,就会把第一个扇区的内容拷贝到RAM中 然后开始通知CPU ,开始执行加载进来的数据
远古时代:引导装入程序
引导装入程序(boot loader) 是用来把操作系统的内核映像转载到RAM中调用的一个程序 ,引导程序有很多种 我们现在仅分析一种:可识别基于多个磁盘的文件系统GRUB:
在BIOS 启动的第四个阶段我们提到了一个词 “引导扇区” 什么是引导扇区? 我们知道现在的硬盘都是由盘面,磁道组成的 ,通过一个机械臂读取盘片上面的数据。而要使一个磁盘开始工作就要提供一个引导的引擎 我们称之为:MBR(master boot record)主引导记录 ,MBR 是一个由512个字节组成的一个扇区 位于磁盘的首个扇区上,前446字节用于引导磁盘,后64字节用于管理主分区列表 一个主分区需要16字节大小空间 所以说现在的硬盘最多只能有(64/16)=4块主分区 如下图所示:
他的作用是引导整块磁盘的启动
中世纪:kernel(激活)setup()
setup() 函数初始化计算机的硬件设备,并为内核程序的执行建立环境
内核的加载路径一般在 /boot/vmlinux... ... BOOT引导目录下
文艺复兴时间:init 引导启动 startup()
startup()初始化启动函数
(initrtd基于内存的根文件系统,虚拟根目录启动 inirtd启动外围设备无法做进内核)
load rootfs (以只读方式加载) -->/sbin/init(/etc/inittab
【检查根文件系统,以只读方式重新挂载rootfs;挂载/etc/fstab定义的尚未被挂载的其他文件系统
initrd的配合下直接加载了rootfs 然后启动了/sbin/init init 进程在 /etc/inittab 的配合下,实现了整个过程
inittab 的作用 定义默认级别 直接执行了BIN/BASH /etc/rc.d/rc.sysinit
现代: start_kernel()函数
start_kerne()函数完成Linux 的初始化工作
开始执行后会显示“Linux version 2.8.16....”版本信息,除此之外 init程序和 内核线程程序最后执行阶段还会显示大量的信息
至此:我们清楚的知道了两次转交过程的结束 ( BIOS --> bootloader(initrd) --> kernel 两次交换 ) 一切系统初始化基本完成
回顾前面:我们在inittab 中定义了mingetty 的调用方法 这时候就能用到了
mingetty 调用 login提示用户输入密码 如果用户存在 则调用 /etc/passwd 中用户相应的shell ,用户登录到自己的子shell 执行基本的操作
我们假设用户的账号信息和 ID 号对应的文件 没有放在 /etc/passwd 目录下 而 放在了 mysql 数据库中
login 怎么才能找到用户的账号信息呢 ? 账号保存在哪 ,本地文件系统中还是数据库中 ?
login 去查找用户账号和密码并不是想象中那么智能 我们定义了一种机制:NSswitch
名称服务开关 nsswitch : /etc/nsswitch.conf 账号和id 的对应关系 定义查找方式
在/etc/passwd 目录下 , 每一个用户 每一个进程都有相应的 ID 号 系统识别用户 就是靠Id号 来识别用户身份
名称解析 : 系统提供一种灵活的机制 在系统的配置 和一堆库文件查找 将用户账号密码转换过来
通过这种机制 login 可以很清楚的知道用户信息文件保存在哪儿 当用户提出请求时 就去对应的位置调用文件读写