`
pengpeng
  • 浏览: 82477 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

[转]linux的启动

阅读更多

           -------学习Linux时,同事总结的,也许从linux的启动过程可以看出Linux的发展过程;

史前时代:BIOS-计算机的启动过程

  1. 加电 电源加电,主板芯片组像CPU发粗RESET信号,使CPU恢复到初始状态。当芯片组检测到电源开始稳定供电时会撤去RESET信号(松开重启建类似),这是CPU从0xfff0除开始执行指令。该地址位于BIOS寻址范围内。BIOS厂商通常在该地址放一条跳转指令,跳到真正BIOS启动代码除。
  2. 自检 BIOS启动代码首先进行POST(Power-On Self Test,上电自检),POST的主要任务是检测系统中一些关键设备是否存在和能否正常工作, 例如内存和显卡等。如果系统BIOS在POST过程中发现致命错误,如未找到内存或内存有问题(640K内的常规内存),系统会直接控制喇叭报告错误,声音的长短和次数代表错误的类型。
  3. 设备初始化 POST完成后BIOS会查找显卡的BIOS,存放显卡BIOS的ROM芯片的起始地址通常设在0xC0000处,找到显卡BIOS后,调用其初始代码,由显卡BIOS来初始化显卡, 此时多数显卡会在屏幕上显示出一些初始化信息,介绍生产厂商,图形芯片等内容。类似地,BIOS会查找其它设备的BIOS程序,调用这些BIOS内部的初始化代码来初始化相关设备。
  4. 测试设备 查找完所遇其它设备的BIOS之后,系统BIOS将显示自己的启动画面,其中包括系统BIOS类型,序列号和版本号等内容。接着BIOS将检测和显示CPU的类型和工作频率,然后开始测试所有的RAM,并同时在屏幕上显示内存测试的进度。 内存测试通过后,系统BIOS将开始检测系统中安装的一些标准硬件设备,包括硬盘,光驱,串口,并口,软驱等,另外绝大多数较新版本的BIOS在这一过程中回自动检测和设置内存的定时参数,硬盘参数和配置系统中安装的即插即用设备,没找到一个设备之后,BIOS会在屏幕上显示出设备的名称和型号等信息,同时为该设备分配中断,DMA通道和I/O端口。
  5. 更新ESCD 所有硬件检测配置完毕后,多数BIOS会重新清屏,并在屏幕上方显示出一个表格,其中概略的列出系统中安装的各种标准硬件设备,以及他们使用的资源和一些相关工作参数。接下来系统BIOS将更新ESCE(Extended System Configration Data, 扩展系统配置数据)。ESCD是系统BIOS用来与操作系统交换硬件配置信息的一种手段,这些数据被存放在CMOS(Complementary metal oxide Semiconductor,互补金属氧化物半导体)之中。
  6. 启动操作系统 ESCD更新完毕后,系统BIOS的启动代码将进行他的最后一项工作,即根据用户指定的启动顺序从软盘,硬盘或光驱启动操作系统。系统BIOS将启动盘的第一个扇区读入到内存的0x7C00除,并检查0x7dfe地址的内存,如果其内容是0xaa55,跳转到0x7c00处执行MBR(Master Boot Record,主引导记录),MBR从分区表中找到第一个活动分区,按照类似方式读取并执行这个活动分区的引导扇区,该引导扇区负责读取并执行bootloader(windows下C盘中的NTLDR),由bootloader加载系统内核

远古时代:Bootloader

引导装入程序(Bootloader)是BIOS将操作系统内核映像装载到RAM中执行的第一个程序。
软盘启动与磁盘启动过程稍有不同,软盘启动时,BIOS将启动软盘的第一扇区指令装载到RAM中,由于通常现代内核都大于一个扇区大小(512B),因此第一扇区的指令通常是将包含内核映像的扇区加载到RAM中。
从硬盘启动时,硬盘的第一个扇区MBR中包含分区表和一小段程序,这段小程序用来装载被启动的操作系统所在分区的第一个扇区。Win98采用MBR中的小程序加载操作系统内核,而Linux在用一种更灵活的加载方式,bootloader。
Linux2.4及以前的版本,在第一个512字节有一个最小的引导程序,因此在第一扇区拷贝一个内核镜像就可以使软盘启动,但在2.6内核中不再有该引导程序,要想在软盘中启动,必须采用与磁盘类似的方式,在第一个扇区中装入一个引导程序。
Bootloader通常被安装在MBR上代替上面负责引导的小程序。Bootloader通常由于大于一个扇区,会被分为两部分,在BIOS将Bootloader的第一部分加载到RAM的0x00007c00处开始执行,bootloader自己加载到0x00096a00,建立实模式站(0x00098000~0x000969ff),并将bootloader的第二部分装入到0x00096c00开始的RAM中。
第二部分一次从此版读取操作系统映射表,提示给用户,用户可以选择要启动的系统,引动程序将相应分区的引导扇区拷贝到RAM中并执行,或直接将内核拷贝到RAM中。
Bootloader的主要执行过程:

  1. 调用BIOS输出"Loading..."
  2. 调用BIOS从磁盘装入内核映像的第一个扇区(512B),从0x00090000装入RAM,并将setup()函数的代码从0x00090200开始装入RAM。
  3. 调用一个BIOS从磁盘装入其余内核映像,并把内核映像放入从0x00010000(低装载,适用于make zImage的小内核映像)或0x00100000(高装载,make bzImage的大内核映像)
  4. 跳转执行setup()

奴隶社会:setup()

setup()函数有汇编实现放在内核映像文件的偏移量0x200处,bootloader将其装载到0x00090200开始的RAM中。
setup()函数的主要工作是初始化计算机中的硬件设备,并为内核程序的执行建立环境。尽管BIOS已经完成大部分设备的初始化,但是Linux并不依赖与BIOS,而已自己的方式重新初始化设备,以增强可移植性和健壮性。
@TO-DO setup()过程

封建社会:startup_32()

存在两个startup_32函数,setup()的最后是跳转执行的是arch/i386/boot/compressed/head.S中的startup_32(),此时startup_32已经被移动到0x00100000或0x00001000,对应于高装载或低装载。该函数的主要工作是解压内核。
解压完的内核映像从arch/i386/kernel/head.S开始执行。该文件中包含另一个startup_32函数。改startup_32为Linux的第一个进程(pid=0)建立执行环境。
@TO-DO startup_32()过程

民国时代:start_kernel()

startup_32函数最后回跳转执行start_kernel(),start_kernel完成内核初始化工作。start_kernel开始执行后会显示"Linux version 2.6.11..."
该函数中最主要的一个步骤是调用kernel_thread()为进程1创建内核线程。这个线程回创建其它线程并执行/sbin/init程序。该程序会在控制台输出初始化信息,直至最后出现登录提示符,或X登录窗口。通知用户内核已启动,正在运行。

新中国:启动脚本

(该部分只适用Redhat系,如RHEL,CentOS,Fedora等,Debian/Ubuntu启动过程与此不同,后期会有分析)

inittab

/sbin/init(进程1)会利用/etc/inittab获取运行级,并根据不同运行级的配置启动不同的服务项目。
inittab配置文件格式

[设置项目]:[run level]:[init的操作行为]:[命令项目]
设置项目:最多4个字符,表示init的主要目的,就是一个名字
run level:该条目的运行级别
init操作行为:
	主要可选值如下:
		initdefault:表示默认的运行级别值
		sysinit:系统初始化操作项目
		ctrlaltdel:表示[ctrl+alt+del
		wait:表示必须等待后面的命令执行完才可以执行后续操作
		respawn:表示后面的操作会重新启动
命令项目:执行该项目的命令,通常为一个脚本命令
系统初始化(rc.sysinit)

inittab中的有个条目是

si::sysinit:/etc/rc.d/rc.sysinit

按上述条目解释,系统初始化时会执行/etc/rc.d/rc.sysinit脚本,该脚本的主要功能如下:
1.获取网络环境与主机名
2.测试与载入内存设备/proc以及USB设备/sys
3.决定是否启动SELinux
4.检测接口设备与即插即用设备参数
5.用户自定义模块加载
6.加载核心的相关设置
7.设置系统时间
8.设置终端控制台字体
9.设置RAID与LVM等硬盘功能
10.fsck检查磁盘文件系统
11.进行磁盘配额quota的转换
12.重新怡可读取模式载入系统磁盘
13.启动quota功能
14.启动系统随机设备(产生随机数)
15.清除启动过程的临时文件
16.将启动相关信息加载到/var/log/dmesg文件中

启动相关运行级服务

inittab中包含

id:3:initdefault:

l3:3:wait:/etc/rc.d/rc 3

第一行表示默认运行级为3,第二行表示第3级运行时以wait方式执行/etc/rc.d/rc 参数为3。
rc脚本的主要功能是调用相应运行级X的配置脚本目录/etc/rcX.d/下的脚本。例如3级时对应的脚本目录是/etc/rc3.d/目录。
脚本目录下的脚本名分为两类:一类是以K开头的,用于kill相应服务;另一类是以S开头的,用于开启相应服务。文件中还包含一个两位数字和服务名。rc脚本负责按照数字有小到大先kill所有服务然后开启所有服务的顺序执行。
每个rcX.d的目录下的脚本都是链接到init.d目录下的脚本的软连接。并且均包含一个S99local->../rc.local,该脚本表示最后执行../rc.local脚本。
rc.local即用户自定义的启动项配置脚本。可以在其中添加想开机启动的命令。比如想自动挂载一个windows下的分区,可以在rc.local中添加

mount -ntfs /dev/sda5 /media/disk5
启动终端

根据inittab中的配置,需要等待/etc/rc 3 运行完成。rc.local时期最后一个脚本。在rc.local执行完之后,继续按照inittab执行

# Run gettys in standard runlevels
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

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon

该段配置表示在2,3,4,5运行级下执行/sbin/mingetty开启终端,并且执行六次,由此可知为何会有6个纯文本终端。最后的x:5:respawn:/etc/X11/prefdm -nodaemon表示在运行级5时开启X Window。

分享到:
评论

相关推荐

    NC5系列linux转window启动文件

    NC5系列linux转window启动文件,直接覆盖就可以用.......

    Linux启动过程综述 [转].pdf

    Linux启动过程综述 [转].pdf

    如何玩转Linux操作系统下的启动盘

    为什么需要Linux启动盘?有很多理由来说明这个问题:首先它可用于启动Linux系统。其次,当系统发生错误,需要进行系统恢复时 我们需要用到它。还有,如果你喜欢经常更新系统内核的话,那么一张启动盘则是必不可少的...

    Linux内核启动过程分析

    结合Linux内核代码, 分析了 80x86平台上Linux操作系统内核的启动过程, 特别对内核的动态加载、 CPU工作模式的转换以及内存分页机制最终启动的全过程做了较为细致的阐述。该分析有助于更深入地了解 Linux 内核的...

    ARM_Linux启动分析.pdf

    本文以Redhat 6.0 Linux 2.2.19 for Alpha/AXP为平台,描述了从开机到登录的 Linux 启动全过程。该文对i386平台同样适用。 一. Bootloader 在Alpha/AXP 平台上引导Linux通常有两种方法,一种是由MILO及其他类似的...

    linux系统中使用shell脚本自启动tomcat

    linux系统中使用shell脚本自启动tomcat 在/etc/init.d下新建文件tomcat 命令:vi /etc/init.d/tomcat tomcat文件新建完毕后,检查文件格式是否为unix,如果格式为dos,需要先将文件格式切换成Unix 强制切换为unix...

    linux系统快速启动十大秘诀

    可是一旦需要,Linux启动常常是缓慢的。幸好有一些加速的办法。其中一些方法不太难。咱们瞧一瞧吧。 #1: 撤消多余的服务 根据机器的用途,很多服务是不需要的。要是Linux只用作桌面,就不需要sendmail、httpd和另外...

    linux系统管理.doc

    本文以Redhat 6.0 Linux 2.2.19 for Alpha/AXP为平台,描述了从开机到登录的 Linux 启动全过程。该文对i386平台同样适用。 在Alpha/AXP平台上引导Linux通常有两种方法,一种是由MILO及其他类似的引导程序引导,另一...

    LINUX网站建设技术指南

    本书介绍如何在Linux下建立,运行并维护站点的综合技术,它适合于有一定的Linux或Linux基本操作基础的网络建立者。 本书从建站的准备工作开始,写到建立功能强大的INTERNET网站,层层深入,涉及到网站建设中所遇到的...

    Windows转向Linux的基础操作.docx

    包括:Linux目录详解、CentOS 7解决firefox及pycharm无法启动ibus中文输入的问题、vi/vim的基本用法、find与grep查找文件、如何查找文件安装路径等内容。作为从Windows转到Linux的用户,这个都是要面临和掌握的基本...

    LINUX系统下多进程的创建与通信

    (2)软件包含前、后台两个程序,用户启动前台程序时,前台程序自行启动后台程序。前台程序提供界面,负责接收用户输入,对输入进行转换,并向后台程序发出实际要执行的指令,后台负责执行实际的指令,并将指令执行...

    linux 课程设计,windows与Linux 命令

    软件包含前、后台两个程序,用户启动前台程序时,前台程序自行启动后台程序。前台程序提供界面,负责接收用户输入,对输入进行转换,并向后台程序发出实际要执行的指令,后台负责执行实际的指令。

    Linux管理员指南

    第7章介绍的是Linux系统的开机和关机流程,以及如何设置Linux操作系统的开机启动管理程序LILO。第8章转向介绍如何对硬盘进行操作,讨论如何对硬盘进行管理、怎样建立分区以及设定硬盘的使用限额。第9章涉及到作为一...

    Linux期末考试(题多 有点难度)

    在每日早晨8:00之前开机后即可自动启动crontab。 6.设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式yymmdd_etc,yy为年,mm为月,dd为日。Shell程序...

    企业级Linux服务攻略

    第1章 Linux服务器的搭建与测试 1.1 Linux的安装 1.1.1 Linux简介 1.1.2 Red Hat Enterprise Linux 5新特性介绍 1.1.3 Red Hat Enterprise Linux 5的安装 1.2 常规网络配置 1.2.1 配置主机名 1.2.2 使用ifconfig...

    嵌入式Linux C编程入门(第2版) PPT

    第8章 嵌入式linux c语言基础——arm linux内核常见数据结构 225 8.1 链表 226 8.1.1 链表概述 226 8.1.2 单向链表 226 8.1.3 双向链表 233 8.1.4 循环链表 234 8.1.5 arm linux中链表使用实例 ...

    RED HAT LINUX 6大全

    本书全面系统地介绍了Red Hat Linux 6。全书共分为五个部分,包括35章和四个附录。第一部分为Red Hat Linux的介绍和安装;第二部分为服务配置;第三部分为系统管理;第四部分为Linux编程;第五部分为附录。本书内容...

    LINUX安装与配置简明手册

    本书详细介绍如何在个人电脑上安装配置Caldera和Red Hat两种发行版本的Linux操作系统,并能帮助用户解决安装和配置过程中出现的各种问题。本书既能指导你进行基本的安装步骤,也能指导你定制独具特色的Linux 操作...

    Linux Shell高级技巧实战总结

    Linux Shell高级技巧实战总结 一、将输入信息转换为大写字符后再进行条件判断 二、为调试信息设置输出级别 三、判断参数是否为数字 四、判断整数变量的奇偶性 ...Linux Shell经典实例解析--Oracle启动脚本(下)

    LINUX 20招

    重装Win9x后lilo失效无法启动Linux  只须先用软盘启动Linux然后运行一次lilo即可。对于RedHat可以用命令mkbootdisk来制作启动盘,例如: mkbootdisk--devices/dev/fd0 2.0.34-1。其中2.0.34-1是/lib/modules...

Global site tag (gtag.js) - Google Analytics