1、X86架构下的从开机到Start_kernel启动的整体过程

这个过程简要概述为:

开机——>BIOS——>GRUB/LILO——>Linux Kernel

其执行的流程图和重要函数例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXVlc2ljaGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

2、载入Linux内核(基于X86)的内存布局图

|          |

0A0000 +--------------------------+

|  Reserved for BIOS    | Do not use. Reserved for BIOS EBDA.

09A000 +--------------------------+

|  Command line    |

|  Stack/heap    | For use by the kernel real-mode code.

098000 +--------------------------+

|  Kernel setup    | The kernel real-mode code.

090200 +--------------------------+ <---  __start函数開始运行地址

|  Kernel boot sector    | The kernel legacy boot sector.

090000 +--------------------------+ <---  header.S

|  Protected-mode kernel | The bulk of the kernel image.

010000 +--------------------------+

|  Boot loader    | <- Boot sector entry point 0000:7C00

001000 +--------------------------+

|  Reserved for MBR/BIOS |

000800 +---------------------------+

|  Typically used by MBR |

000600 +--------------------------+

|  BIOS use only        |

000000 +--------------------------+

3、启动

2、BIOS启动引导阶段

BIOS调用Bootloader来把操作系统的内核映像载入到系统RAM中。

(1)、当PC的电源打开后,80x86架构的cpu将自己主动进入实模式,并从地址0xFFFF0(CS:0xFFFF,IP:0x0)開始自己主动运行程序代码,这个地址一般是BIOS的地址。

(2)、BIOS的首先进行POST(Power On Self Test即加电后自检),检測系统中一些关键设备是否存在和是否能正常工作,比如内存和显卡等设备。此时显卡还没有初始化。假设发现了一些致命错误。比如没有找到内存或者内存有问题(此时仅仅会检查640K常规内存)。BIOS会直接控制喇叭发声来报告错误。声音的长短和次数代表了错误的类型。

(3)、然后物理地址0处開始初始化中断向量(注意:这个BIOS的中断向量非常重要。后边的非常多和硬盘等的交互都是通过此中断向量完毕的)。

(4)、此后,BIOS将启动设备的第一个扇区(第0磁道第一个扇区被称为MBR即主引导记录,它的大小是512字节,里面存放了用汇编语言编写的预启动信息、分区表信息、魔数0x55AA),读入内存绝对地址0x7C00处,并跳转到这个地址并运行。事实上被拷贝到物理内存0x7C00处的内容就是Boot Loader,对于较早的内核不靠grub启动的,它就是bootsect.S程序,而对于如今PC多数使用grub引导启动的。就是lilo或者grub了。

3、Bootloader阶段

Bootloader程序是为计算机载入(load)计算机OS内核的。bootloader程序通常位于硬盘上,被BIOS调用。用于载入内核。在PC机上常见的bootloader主要有grub和lilo等。

    GRUB(GRand Unified Bootloader)是当前linux诸多发行版本号默认的引导程序。嵌入式系统上。最常见的bootloader是U-BOOT。这种bootloader一般位于MBR的最前部。在linux系统中。bootloader也能够写入文件系统所在分区中。比方,grub程序就很强大。 Gurb执行后,将初始化设置内核执行所需的环境。然后载入内核镜像。grub磁盘引导全过程:

(1)stage1、grub读取磁盘的第一个512字节的主引导记录MBR。

(2)stage1.5、识别各种不同的文件系统格式,目的是为了grub能识别到文件系统。

(3)stage2、载入系统引导菜单(/boot/grub/menu.lst或grub.lst),载入内核vmlinuz和RAM磁盘initrd。

4、Linux内核启动过程

内核映像文件vmlinuz:包括有linux内核的静态链接的可运行文件。传统上,vmlinux被称为可引导的内核镜像。vmlinuz是vmlinux的压缩文件。

其构成包括:

1、第一个512字节的bootsect(第一个块)

2、第二个是setup代码,若干不多个512字节(一会再说它多大)

3、保护模式下的内核代码

    bzImage文件:使用make bzImage命令编译内核源码,能够得到採用zlib算法压缩的zImage文件,即big zImage文件。老的zImage解压缩内核到低端内存,bzImage则解压缩内核到高端内存(1M(0x100000)以上),在保护模式下运行。

bzImage文件由setup和vmlinux两部分组成,setup是实模式下的代码,vmlinux是保护模式下的代码。

详细包括vmlinuz、bootsect.o、setup.o、解压缩程序misc.o、以及其它一些相关文件(如 piggy.o)。

initramfs(或initrd)文件:initrd是initialized ram disk的意思。主要用于载入硬件驱动模块,辅助内核的启动,挂载真正的根文件系统。

X86架构下Linux启动过程分析的更多相关文章

  1. x86架构: 硬件启动过程分析(附引导启动代码)

    用户按下开机键,几秒的时间,都经历了啥? 1.cpu各个寄存器赋初始值,cs.base=0xffff0000, eip=0xfff0,其他寄存器都是0,这时cs:ip得到的物理地址:0xfffffff ...

  2. Linux x86架构下ACPI PNP Hardware ID的识别机制

    转:https://blog.csdn.net/morixinguan/article/details/79343578 关于Hardware ID的用途,在前面已经大致的解释了它的用途,以及它和AC ...

  3. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)

    回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...

  4. x64架构下Linux系统函数调用

    原文链接:https://blog.fanscore.cn/p/27/ 一. 函数调用相关指令 关于栈可以看下我之前的这篇文章x86 CPU与IA-32架构 在开始函数调用约定之前我们需要先了解一下几 ...

  5. Linux 启动过程分析

    本文仅简单介绍Linux的启动过程,在此基础上做简要的分析.对于Linux启动过程中内部详细的函数调用不做介绍,只是希望本文能给新手起到一个抛砖引玉的作用,以便深入研究Linux的启动过程.下图基本展 ...

  6. linux启动过程分析

    参考:http://blog.chinaunix.net/uid-26495963-id-3066282.html http://www.comptechdoc.org/os/linux/startu ...

  7. ARM架构下linux设备树加载的方法

    引入设备树后bootloader加载DTB方法: 1. 标准方法 将linux kernel放到内存地址为<kernel img addr>的内存中. 将DTB放到地址为<dtb a ...

  8. S3C2440的Linux启动过程分析(一)——SC2440处理器结构

    1.1.     S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MM ...

  9. x86架构下的控制寄存器CR0-CR4

    关于这几个寄存器,每次翻看intel手册都很不好找,干脆直接贴在这里吧!

随机推荐

  1. 音视频】5.ffmpeg命令分类与使用

    GT其实平时也有一些处理音视频的个人或者亲人需求,熟练使用ffmpeg之后也不要借助图示化软件,一个命令基本可以搞定 G: 熟练使用ffmpeg命令!T :不要死记硬背,看一遍,自己找下规律,敲一遍, ...

  2. 让ios支持http协议

    ios默认只支持https协议,打开info.plist文件,加入以下设置 NSAppTransportSecurity NSAllowsArbitraryLoads

  3. Could not resolve type alias 'map '. Cause: java.lang.ClassNotFoundException: Cannot find class: map

    把resultType改为resultMap, 把parameterType改为parameterMap,重新发布并运行.

  4. h5页面长按保存图片

    由于之前几乎没有使用过canvas:今天遇到了一个很棘手的问题.canvas生成后,然后长按保存到手机. 正常的流程应该是先用canvas进行画图,然后再把canvas转成地址,最后再把转化的地址给i ...

  5. 09js、MySQL相关

    09js.MySQL相关-2018/07/19 1.js的dom 理解一下文档对象模型:html文件加载到内存之后会形成一颗dom树,根据这些节点对象可以进行脚本代码的动态修改;在dom树当中 一切皆 ...

  6. tarjan求强连通分量模板

    什么是强连通分量? 百度百科 有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(stro ...

  7. 集合:Collection

    why ? when ? how ? what ? Java 集合框架图 由上图我们可以看到,Java 集合主要分为两类:Collection 和 Map. Collection 接口 遍历 Coll ...

  8. Linux 复习一

    第一章 Linux简介和基本操作 一.Linux系统的来源和发展 Linux is a free Unix-type operating system originally created by Li ...

  9. [bzoj3671][Noi2014][随机数生成器] (贪心+位运算+卡空间)

    Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个整数 N,M,Q ,表示小H希望生成一个1到 N×M ...

  10. 2.8 补充:export

    linux export 的作用   功能说明:设置或显示环境变量.   语 法:export [-fnp][变量名称]=[变量设置值]   补充说明:在shell中执行程序时,shell会提供一组环 ...