linux开机引导和启动过程详解(Linux启动过程简述)

BIOS加载bootloader阶段

计算机接电之后第一个启动的是BIOS,因为BIOS是存储在主板上的一个小程序,空间有限代码量少因此功能受限。要经过一步步的控制权转移,最后转移给功能更加强大的操作系统。

BIOS对系统做一些简单的初始化工作,然后把控制权交给MBR。约定MBR(Main Boot Record)存在于整个硬盘最开始的扇区。每个扇区都是512字节,MBR引导扇区的内容是:

linux开机引导和启动过程详解(Linux启动过程简述)(1)

  • 446字节的引导程序及参数

  • 64字节的分区表(每个分区表项16字节,因此只能有4个主分区)

  • 2字节的结束标志0x55和0xaa

0x55和0xaa是MBR结束标志,0x7c00是MBR被加载在内存中的位置。

BIOS结束自己的工作以后,需要把控制权交给MBR,过程是:BIOS找到MBR并且把MBR加载在内存中,跳转到该位置。

start_kernel

执行各种初始化函数:初始化IRQ、时钟、CPU、内存、VFS、中断向量表、内核子系统等等。最后调用

rest_init

,这几乎是start_kernel的全部工作,

rest_init

创建一个内核线程,执行

kernel_init

rest_init

调用

schedule

启动任务调度,调用

cpu_idle

cpu_idle

永远运行,只有当进程就绪列表中有就绪进程时候,cpu_idle才会被从CPU上拉下来,当没有进程时候,这个空闲进程又被拉起来执行,这就是进程0。进程0漫长的工作终于结束了,从BIOS、MBR、Bootloader最后到kernel。虽然进程0从启动的舞台上退出了,这并没有意味着kernel启动完成了。

进程0刚刚创建了一个内核线程执行

kernel_init

,还记得吗?我们现在看看这个线程的运行。

kernel_init

负责初始化启动剩下的CPU,从启动分析到现在,我们只有一个CPU在运行注意到了吗?这个CPU我们成为引导CPU,剩下的应用CPU初始化依然需要从实模式开始。最后

kernel_init

调用

init_post

,这个函数尝试执行一下用户进程:

/sbin/init

/etc/init

/bin/init

/bin/sh

,如果全部失败,产生kernel panic。如果上述程序存在,创建进程1运行(这个进程是所有用户进程的父进程)。过程如下图所示:

linux开机引导和启动过程详解(Linux启动过程简述)(2)

init读取的第一个文件是

/etc/inittab

,从这里init决定了我们的Linux操作系统的运行级别。Linux系统有7个运行级别(runlevel):

level 0:系统停机状态

level 1:单用户工作状态

level 2:多用户状态

level 3:完全多用户状态

level 4:保留

level 5:X11

level 6:reboot

Init从/etc/fstab

文件中查找分区表信息,用真正的根文件系统替换initrd。Init然后启动默认运行级别的/etc/init.d目录中指定的所有服务或者脚本。这是所有服务由init逐个初始化的步骤。在这个过程中,一次一个服务由init启动,所有守护程序在后台运行,init继续管理它们。

至此,内核启动基本结束了。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页