linux开机引导和启动过程详解(Linux启动过程简述)
计算机接电之后第一个启动的是BIOS,因为BIOS是存储在主板上的一个小程序,空间有限代码量少因此功能受限。要经过一步步的控制权转移,最后转移给功能更加强大的操作系统。
BIOS对系统做一些简单的初始化工作,然后把控制权交给MBR。约定MBR(Main Boot Record)存在于整个硬盘最开始的扇区。每个扇区都是512字节,MBR引导扇区的内容是:
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运行(这个进程是所有用户进程的父进程)。过程如下图所示:
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