linux 系统开机加电后发生了什么?linux系统的启动流程关于linux系统的启动流程我们可以按步进行划分为如下:
BIOS
- POST自检
- BIOS(Boot Sequence)
- 加载对应引导上的MBR(bootloader)
- 主引导设置加载其BootLoader
启动BIOS,准备实模式下的中断向量表和中断服务程序电脑启动后,CPU逻辑电路被设计为只能运行内存中的程序,没有能力直接运行存在于软盘或硬盘中的操作系统,如果想要运行,必须要加载到内存(RAM)中 。
BIOS是如何启动的,CPU硬件逻辑设计为在加电瞬间强行将CS值置为0XF000,IP为0XFFF0,这样CS:IP就指向0XFFFF0这个位置,这个位置正是BIOS程序的入口地址 。
BIOS程序被固化在计算机主机板上的一块很小的ROM芯片里 。现在CS:IP已经指向了0XFFFF0这个位置,意味着BIOS开始启动 。
POST自检BIOS的第一步动作就是进行 上电自检(POST)
POST的工作是检查硬件设备 。随着BIOS程序的执行,屏幕上会显示显卡的信息,内存的信息等,
初始化设备BIOS的第二步动作就是 枚举本地设备并初始化
有一项对启动操作系统至关重要的工作,那就是BIOS在内存中建立中断向量表和中断服务程序
BIOS程序在内存最开始的位置(0x00000)用1KB的内存空间(0x00000~0x003FF)构建中断向量表,在紧挨着它的位置用256KB的内存空间构建BIOS数据区(0x00400~0x004FF),并在大约57KB以后的位置(0x0e05b)加载了8KB左右的与中断向量表相应的若干中断服务程序 。
中断向量表有256个中断向量,每个中断向量占4个字节,其中两个字节是CS值,两个字节是IP值 。每个中断向量都指向一个具体的中断服务程序 。
BIOS-runtime服务按照boot启动顺序搜索设备,寻找BBR由于BIOS功能使用上的不同,它由两个部分组成:POST和runtime服务 。POST完成后,它将从存储器中被清除,但是BIOS runtime服务会被保留,用于目标操作系统 。
为了启动操作系统,BIOS的runtime服务将搜索那些激活状态的或是可引导启动的设备,搜索的顺序则由CMOS设置决定(也就是我们平时所谓的在BIOS中设置的启动顺序) 。一个软驱,一台光驱,一个硬盘上的分区,网络上的设备甚至一个usb 闪存盘都可以作为一个启动设备 。
当然,linux通常是从硬盘启动的 。硬盘上的MBR(主启动记录)包含有基本的boot loader,它是一个512字节大小的扇区,位于磁盘的第一个扇区(0磁头0磁道1扇区) 。当MBR被装载到RAM中后,BIOS就会将控制权转交给MBR 。
引导操作系统内核并为保护模式做准备位于MBR中的主 boot loader 是一个512字节的镜像,其中不仅包含了 bootload 程序代码,还包含了一个小的分区表 。
最初的446字节是主 boot loader,它里面就包含有可执行代码以及错误消息文本 。接下来的64字节是分区表,其中包含有四个分区的各自的记录(一个分区占16字节) 。MBR 通过特殊数字 0xAA55(译者注:在电子界中 AA55 确实是具有传奇色彩的数字,想知道为什么么?将它展开成二进制形式,看看有什么规律)作为两个字节的结束标志 。0x55AA 同时也是 MBR 有效的校验确认 。
首先对CPU发送 int 0x19 中断,使CPU运行 int 0x19 中断对应的中断服务程序,这个中断服务程序的作用就是把软盘第一个扇区的程序加载到内存的指定位置 。
主 boot loader 的工作是寻找并加载次 boot loader(内核加载程序)
它通过分析分区表,找出激活分区来完成这个任务,当它找到一个激活分区时,它将继续扫描剩下的分区表中的分区,以便确认他们都是未激活的 。
确认完毕后,激活分区的启动记录(次 boot loader)从设备中被读到 RAM,并被执行 。
其中加载过程需要借助 BIOS 提供的int 0x13中断向量指向的中断服务程序来完成 。该程序将软盘第二个扇区开始的4个扇区,即 setup.s 对应的程序加载至内存的 SETUPSEG(0x90200)处 。
把第一阶段和第二阶段的 boot loaders 联合起来,就是在x86个人电脑中,我们所说的 linux loader(LILO)或者 GRand Unified Bootloader(GRUB) 。由于 GRUB 修正了一些 LILO 中存在的缺陷,因此下面就让我们来看看 GRUB(如果你希望得到更多的关于 GRUB,LILO 和与之相关话题的讨论资源,请见文后的参考资料)
对于 GRUB 来说,一个比较好的方面就是它包含了 linux 文件系统的知识 。与LILO使用裸扇区不同的是,GRUB 能够从 ext2 或者 ext3 文件系统中加载 linux 内核 。它是通过将本来两阶段的 boot loader 转换成三个阶段的 boot loader 。在第一阶段(MBR)中会启动 stage1.5 的 boot loader 来理解 linux 内核镜像中的特殊的文件系统格式,例如,reiserfs_stage1-5(用于从reiserf日志文件系统中进行加载)或 e2fs + stage1_5 (用于从wxt2或ext3文件系统进行加载) 。当 stage1.5 的 boot loader 被加载并运行时,stage2 的 boot loader 才能被加载 。当 stage2 被加载时,GRUB能根据请求的情况显示一个可选内核的清单(在 /etc/grub.conf 中进行定义,同时还有几个软符号链接 /etc/grub/menu.lst 和 /etc/grub.conf) 。你可以选择一个内核,修改其附加的内核参数 。同时,你可以选择使用命令行的shell来对启动过程进行更深层次的手工控制 。
推荐阅读
- PHP 开源工作流引擎 V6.0.0 正式版发布
- 鸿蒙APP开发:如何实现“百度地图”的显示?需要3项认真操作才行
- linux-centos网络配置bond
- 国三车能开到什么时候?
- 国产Linux系统可爱鱼CutefishOS 0.7 Beta发布
- 这样清理C盘不影响系统,电脑一下子多了30G,运行忒流畅
- App制作的流程是什么?如何制作App开发流程?
- Java业务开发常见错误
- 小白如何看出计算机操作系统是否开启勒索病毒危险端口
- 小白是如何让Kali Linux操作系统从U盘成功启动