博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux系统启动
阅读量:6124 次
发布时间:2019-06-21

本文共 1769 字,大约阅读时间需要 5 分钟。

在本文中,我们按电源按钮简要叙述,以便能够登录到系统,在此期间,系统和计算机硬件是如何一起工作。既作为自己整理知识的摘要,有可能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字节大小的映射,具体信息能够參考下图(图片来自):

MBR

Bootloader: 引导程序

Partition table: 硬盘分区信息

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

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

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

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

三、系统执行启动阶段

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

本文写作时内核已经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)映像文件。

具体的跳转过程能够參考:

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。

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

你可能感兴趣的文章
PC-BSD 9.2 发布,基于 FreeBSD 9.2
查看>>
网卡驱动程序之框架(一)
查看>>
css斜线
查看>>
Windows phone 8 学习笔记(3) 通信
查看>>
重新想象 Windows 8 Store Apps (18) - 绘图: Shape, Path, Stroke, Brush
查看>>
Revit API找到风管穿过的墙(当前文档和链接文档)
查看>>
Scroll Depth – 衡量页面滚动的 Google 分析插件
查看>>
Windows 8.1 应用再出发 - 视图状态的更新
查看>>
自己制作交叉编译工具链
查看>>
Qt Style Sheet实践(四):行文本编辑框QLineEdit及自动补全
查看>>
[物理学与PDEs]第3章习题1 只有一个非零分量的磁场
查看>>
深入浅出NodeJS——数据通信,NET模块运行机制
查看>>
onInterceptTouchEvent和onTouchEvent调用时序
查看>>
android防止内存溢出浅析
查看>>
4.3.3版本之引擎bug
查看>>
SQL Server表分区详解
查看>>
使用FMDB最新v2.3版本教程
查看>>
SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
查看>>
STM32启动过程--启动文件--分析
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>