Linux 系统启动流程

经过几天的学习沉思终于把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 可以很清楚的知道用户信息文件保存在哪儿  当用户提出请求时 就去对应的位置调用文件读写  



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值