在本文中,我们按电源按钮简要叙述,以便能够登录到系统,在此期间,系统和计算机硬件是如何一起工作。既作为自己整理知识的摘要,有可能linux0绍,高手请略过。

一般来说linux的启动能够分成三个阶段:BIOS阶段,系统引导阶段,系统启动阶段。

一、BIOS阶段

BIOS(基本输入输出系统),是固化在电脑ROM中的一段程序。这是安装电脑前都已经固化好的。

对电脑有一些了解的同学应该都知道电脑是由cpu,内存,硬盘,显示器等再加一个铁盒子封装起来,而电脑的执行都是由CPU一条条指令执行并指挥着其它硬件一起协作来完毕电脑的正常执行。

当我们按电脑开机键的时候。电脑的电源部件就会给CPU以及其它硬件上电,然后CPU開始执行第一条指令。而这第一条指令的地址就是BIOS所在的地址。也即BIOS是电脑中执行的第一个程序,还在操作系统(linux,windows,osx等)之前。再说一下这个“地址”,CPU的指令地址是由CPU中的两个寄存器来标识的(CS:IP),而CPU的硬件逻辑被设计成加电之后置CS为全F,置IP为全0,所以这个“地址”就是0xFFFF0(计算方法:CS
× 16 + IP)

BIOS的主要功能是检測电脑的基本硬件是否满足执行要求,以及初始化硬件状态、中断向量表、中断服务程序等。依据获取的硬件信息去载入可引导介质(眼下都是硬盘)的首扇区(MBR)到内存中执行,并把控制权转交给此程序,这样就到了执行的第二个阶段。

二、系统引导阶段

MBR是一个512字节大小的映射,具体信息能够參考下图(图片来自linux引导过程内幕):

Bootloader: 引导程序

Partition table: 硬盘分区信息

Magic Number: MBR标识,正常值为:0xAA55

事实上这里的Bootloader并非引导程序的所有,而仅仅是引导程序可运行的一小部分(由于MBR的空间太小装不下整个引导程序)我们称为第一阶段引导程序。主要工作是为了载入引导程序的剩余部分,称其为第二阶段引导程序。

第二阶段引导程序的主要功能就是载入操作系统,并将控制权转交给内核。

常见的引导程序有LILO,GRUB等。

三、系统执行启动阶段

linux内核代码如今已经非常是庞大。编译好之后一般都还有5M左右,所以都是用bzImage方式压缩。早期代码的运行顺序能够看linux引导过程内幕linux启动过程综述

本文写作时内核已经3.17版本号了,在新版本号中:

1,内核代码的入口是arch\x86\boot\header.S,此汇编代码通过调用同文件夹下的main.c中的main函数,从实模式(16位)转换到保护模式(32位)。

2。protected_mode_jump(boot_params.hdr.code32_start, (u32)&boot_params + (ds() << 4));函数的调用会跳转到x86/boot/compressed/head_32.S中的startup_32标号处运行。此代码会调用decompress_kernel函数解压内核(bzImage)映像文件。

具体的跳转过程能够參考:linux
kernel boot process

3,并跳转到x86/kernel/head_32.S中的startup_32标号处运行。此代码会调用i386_start_kernel函数,而i386_start_kernel会调用linux内核的主函数start_kernel。

注意:64位有对应的head_64.S汇编代码。流程非常类似。

4。将linux比作一个应用程序的话,start_kernel就是linux的main函数。前面的那些代码仅仅是为了linux的执行而做的准备工作。

在此函数中才開始我们熟悉的初始化内核各模块的动作。像锁机制。进程调度,文件系统等等的初始化工作。

最后调用kernel_thread(kernel_init,
NULL, CLONE_FS | CLONE_SIGHAND);去运行linux系统下的第一个进程“init”进程。

5,linux应用层的初始化都是由init调用启动脚本来完毕的,最后调用一个login的进程能够显示我们的登录界面。这里最常见的init有sysvinit,
upstart, systemd。

版权声明:本文博主原创文章。博客,未经同意不得转载。

linux系统启动的更多相关文章

  1. Linux学习之CentOS(二十一)--Linux系统启动详解

      在这篇随笔里面将对Linux系统的启动进行一个详细的解释!我的实验机器是CentOS6.4,当然对于现有的Linux发行版本,其系统的启动基本上都是一样的! 首先我们来看下Linux系统启动的几个 ...

  2. linux基础-附件1 linux系统启动流程

    附件1 linux系统启动流程 最初始阶段当我们打开计算机电源,计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序.这一程序通常知道一些直接连接在主 ...

  3. Linux系统启动过程分析

    [原创]Linux系统启动过程分析-wjlkoorey258-ChinaUnix博客http://blog.chinaunix.net/uid-23069658-id-3142047.html 经过对 ...

  4. Linux系统启动流程及安装命令行版本

    Debian安装 之前也安装过很多次linux不同版本的系统,但安装后都是直接带有桌面开发环境的版本,直接可以使用,正好最近项目不是很忙,想一直了解下Linux的整个启动流程,以及如何从命令行模式系统 ...

  5. 【转】Linux系统启动过程分析

    [转]Linux系统启动过程分析 转自:http://blog.chinaunix.net/uid-23069658-id-3142047.html 经过对Linux系统有了一定了解和熟悉后,想对其更 ...

  6. 【转载】Linux系统启动流程

    原文:Linux系统启动流程 POST(Power On Self Test/上电自检)-->BootLoader(MBR)-->Kernel(硬件探测.加载驱动.挂载根文件系统./sbi ...

  7. linux 系统启动流程

    原著资料网址:http://wenku.baidu.com/view/414127fdf705cc1755270997.html (版权归原作者所有) Linux系统的启动分5个阶段,每个阶段都完成不 ...

  8. Linux系统启动流程及grub重建(1)

    日志系统 Linux系统启动流程 PC: OS(Linux) POST-->BIOS(Boot Sequence)-->MBR(bootloader,446)-->Kernel--& ...

  9. Linux系统启动过程介绍

    Linux系统启动过程介绍 学习操作系统有必要了解一下系统的启动过程,这样在面对各种系统故障的时候能快速定位解决问题,下面以Centos来分析linux系统的启动过程. 1.BIOS自检:当开机的时候 ...

  10. linux系统启动过程的列表

    linux系统启动过程的列表 载入BIOS的硬件信息并进行自检.然后根据设置取得第一个可启动的设备: 读取并运行第一个启动设备内MBR(master boot record,主引导分区)的boot l ...

随机推荐

  1. sql数据库优化技巧汇总

    (转)SQL 优化原则 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着 ...

  2. 打造轻量级自动化测试框架WebZ

    一.什么是WebZ WebZ是我用Python写的“关键字驱动”的自动化测试框架,基于WebDriver. 设计该框架的初衷是:用自动化测试让测试人员从一些简单却重复的测试中解放出来.之所以用“关键字 ...

  3. Struts_json插件配置参数

    Struts中使用json需要在struts基础上加上几个包:(这里只列出了重要的几个) commons-lang-2.4.jar: jsonplugin-0[1].32.jar: 下面是配置文件中的 ...

  4. [BZOJ 3585] mex 【莫队+分块】

    题目链接:BZOJ - 3585 题目分析 区间mex,即区间中没有出现的最小自然数. 那么我们使用一种莫队+分块的做法,使用莫队维护当前区间的每个数字的出现次数. 然后求mex用分块,将权值分块(显 ...

  5. matlab拟合三维椭球

            同学问的,查了下资料. %需要拟合的点的坐标为(0,-174.802,990.048),(0.472,-171.284,995.463),(0.413,-168.639,1003.55 ...

  6. Sed&awk笔记之awk篇

    http://blog.csdn.net/a81895898/article/details/8482333 Awk是什么 Awk.sed与grep,俗称Linux下的三剑客,它们之间有很多相似点,但 ...

  7. java中的日期格式

    时间日期标识符: yyyy:年 MM:月 dd:日 hh:~12小时制(-) HH:24小时制(-) mm:分 ss:秒 S:毫秒 E:星期几 D:一年中的第几天 F:一月中的第几个星期(会把这个月总 ...

  8. spring 动态数据源

    1.动态数据源:  在一个项目中,有时候需要用到多个数据库,比如读写分离,数据库的分布式存储等等,这时我们要在项目中配置多个数据库. 2.原理:   (1).spring 单数据源获取数据连接过程: ...

  9. android 上传图片到服务器Tomcat(Struts2)

    在做android开发的时候,有时你会用到图片的上传功能,在我的android项目中,我是选中图片,点击上传多张图片 android客户端上传图片部分的代码如下: package com.exampl ...

  10. buffer busy waits

    Buffer busy waits 当会话想要访问缓冲区中的数据块,而该数据块正在被其他会话使用时将产生Buffer busy waits事件. 其他会话可能正从数据文件向缓冲器读取同样的数据块,或正 ...