前言

本文内容只集中在操作系统启动原理的讲解上,不涉及启动的技术细节,因为这些细节都可以通过网络或者相关代码了解。只有了解了启动原理,才能在分析和解决有关启动的问题时具有针对性,不会有无从下手的感觉。限于作者经验的原因,本文内容只涉及关于Windows和Linux系统的启动过程。

启动过程简介

操作系统的启动简单来说,就是将操作系统的内核从外存储加载到内存中,并使其运行的完整过程。可是现在的操作系统实在太复杂了,要将这么复杂的系统启动起来,也不是一件简单的事情。大家都知道软件的大小是随着功能多少而变化的;同理,随着操作系统越来越复杂,启动过程也变得更加复杂,但MBR(硬盘第一个扇区)的空间有限(512Bytes),不可能将所有的启动代码全部塞到里面,但MBR又是操作系统启动的第一个环节,BIOS从硬盘启动时只加载MBR一个扇区。MBR有两个非常重要的作用:存放第一阶段的启动代码和保存分区记录。

那怎么办呢?聪明的程序员想出了一个办法:链式启动,一环扣着一环,先用小程序(功能极其简单,主要功能就是加载其他程序)加载一个较大的程序(功能稍微复杂些,比如可以搜索文件系统等等),然后这个较大的程序再加载更大的程序(功能全面,负责加载系统内核等),不断重复这个过程,直到把完整的bootloader(启动加载器)都加载到内存中。当bootloader完全加载到内存后,它才开始执行操作系统内核加载启动等工作。在x86平台上,Windows和Linux操作系统的启动程序一般是由三个部分组成的,每一部分都完成链式启动过程中一个阶段的启动任务。

Windows系统启动过程

在一个只装有Windows系统的硬盘中,MBR中存放着微软提供的第一部分的启动代码,虽然随着Windows版本的不同,这段代码也略有变化,但是其主要功能并没有改变。在存放这段代码的MBR扇区被加载到内存后,它首先查找保存在这个扇区(MBR整个扇区已被加载到内存中,实际是在内存固定位置处查找)中的分区记录,在其中找到活动标志值为0x80(表示该分区是活动的)的那条分区记录,依照记录中的分区开始位置,将这个分区的第一个扇区加载到内存中并执行。如果在这个过程中出现错误,比如报告“没有活动分区”之类的,都是由这部分代码产生的。

由Windows操作系统格式化的分区,不管文件系统类型是FAT16/32还是NTFS,在分区开始的若干个扇区内,都存放着Windows系统启动的第二部分代码。这部分代码分为两小段:第一段是第一个扇区的自加载部分,第二段是后面扇区的启动功能部分。第一段的这个扇区由MBR的启动代码加载到内存并执行,这个扇区的主要功能是将第二段代码全部加载到内存中;而第二段代码的主要功能是解析文件系统,将保存在文件系统中的最后一个阶段的启动代码文件(ntldr)加载到内存中,由于有文件系统的解析功能,因此第二部分的启动代码随文件系统类型而有所不同。像“ntldr is missing”这样的错误信息都是由这部分代码报告的。

Windows启动过程中第三部分的代码存在于系统分区的文件系统中,文件名通常是ntldr(win2k及其后的Windows系统),这段代码并没有覆盖第二部分的代码,因为还要用到它的文件系统解析功能。这部分代码分析boot.ini文件,提供给用户启动选项等功能,在用户作出选择后,加载操作系统内核文件,并将控制权交给系统内核,至此,bootloader的使命就完成了,接下来的系统初始化等功能都是由Windows操作系统内核来完成的。

Linux系统启动过程

Linux系统是开源操作系统,针对同一个功能开源社区里总是存在着多种选择,就连bootloader也不例外,早期的Linux一般使用Lilo,现在的Linux系统一般使用GRUB作为bootloader。两者的功能是相同的,只不过GRUB提供的功能更加丰富。GRUB和Windows系统的启动程序在功能划分上基本一致,都分为三个部分,分别是stage1, stage1.5和stage2。

stage1是GRUB第一部分的启动代码,和Windows系统第一部分的启动代码的功能相似,但也有很大的不同:

驻留位置,stage1可以驻留到MBR或者分区的第一个扇区中;

加载方式,stage1在MBR中时,并不通过查看分区表来获得下一阶段的启动代码的位置,而是在Linux安装好后,由Linux安装程序在stage1内部的特定位置上写好了下一阶段启动代码的开始位置(硬盘扇区的绝对偏移);

由于第二点的不同,因此它既可以加载stage1.5也可以直接加载stage2;

stage1.5和Windows系统第二部分启动代码的功能相同,它通过解析启动分区的文件系统,将stage2加载到内存中。stage1.5一般驻留在启动分区的开始部分。其加载方式也和Windows系统一样,由stage1先将stage1.5的第一个扇区加载到内存中,然后由此扇区中的代码将其余部分也加载到内存中。stage1.5代码因为与解析文件系统有关,本身又不能太大,因此和Windows系统一样,针对每个Linux文件系统都有对应的stage1.5的代码,一些Linux安装可以让用户选择启动分区的文件系统类型,所以相应的stage1.5会被使用。

stage2功能和Windows系统第三部分启动代码的功能相同,它可以显示一个启动列表,让用户选择启动,然后加载相应的Linux内核文件和ramdisk文件到内存并解压,最后将控制权交给Linux内核。至此,GRUB的使命就完成了,接下来的系统初始化等功能都是由Linux内核来完成的。

GRUB不同于Windows启动程序的地方是:虽然GRUB提供了stage1.5用于解析文件系统和加载stage2,但是在流行的Linux发行版中,安装程序并不使用stage1.5,而是跳过stage1.5,直接由stage1加载stage2,具体原因有以下几点:

某些Linux文件系统在设计时,分区开始出并没有留出足够的空间存放stage1.5;

某些Linux文件系统出现时间较晚,没有对应的stage1.5;

虽然stage1.5具有启动时的灵活性,但是也付出了增加复杂度的代价;

基于以上几个原因,例如Redhat,Suse等Linux发行版在安装时并没有使用stage1.5,而是简单地让stage1直接加载stage2。因此,stage2在设计上也和stage1.5相似,分为两段,第一段代码是stage2的第一个扇区,用于加载第二段代码,而第二段代码完成stage2的主要功能。因此,stage2的加载方式有两种:一是由stage1.5通过解析文件系统加载同内存中;二是由stage1只加载stage2的第一个扇区,由此扇区将stage2其余部分加载到内存中。

多系统安装实战

想必在一块硬盘上安装过Windows和Linux双系统的网友都有个这种经历:一旦Linux出了问题,不能进入GRUB的启动界面的话,那么连Windows也启动不了了,不得已,只能完全重装所有的系统。其实这都是Linux发行版中GRUB安装方式惹的祸。为什么这么说呢?还要从GRUB的安装方式讲起。

上面已经谈到,流行的Linux发行版在安装过程中对GRUB安装的默认方式方式是将stage1安装在MBR中,然后让stage1直接加载Linux分区中的stage2,如果在Linux安装之前存在有Windows系统,那么GRUB会在启动配置中添加一个启动项,使用户可以启动Windows系统。

这个启动项背后的故事是:如果用户选择了这个启动项,stage2依照这个启动项提供的分区位置,加载该分区的第一个扇区,然后将控制权转给该扇区。也就是说这个启动Windows的过程相当于从Linux启动第三个阶段跳转到Windows启动的第二个阶段。如果在这个启动过程中Linux系统出了问题导致GRUB工作不正常的话,自然连带的Windows也无法启动了。

所以,相比较来说,Windows的启动程序加载的方式是比较灵活的,不像Linux,将其他系统的启动也纳入到自己的管理之中,一旦Linux系统的启动出了问题,也会危及到其他系统的启动。

一个比较好的多系统安装方法如下:

首先安装一个Windows系统,其目的就是要将Windows启动的第一部分代码写入到MBR中。随后的步骤和你想要安装的操作系统有关,可以分为三个类型,多Windows系统,多Linux系统,混合性系统,下面分别讨论:

多Windows系统:

在安装新的Windows系统前,通过控制面板->计算机管理->磁盘管理,将你想安装新的Windows系统的分区设为活动的,这是会出现警告信息,点击确认通过。然后重启系统,插入安装光盘,设定光盘启动,就会从光盘启动安装程序,安装程序默认会将系统安装在活动分区上。按照这种方式,在主分区上最多可以安装4个WindowsXP系统,2个Windows Vista/7系统(因为占用2个分区)

平常使用时,如果想切换到另一个系统,使用控制面板->计算机管理->磁盘管理将你想切换到的系统设为活动即可,重启后,即可进入新的系统,返回同理。

多Linux系统:

如果硬盘分区打算全部安装Linux系统,第一个Linux系统必须装在Windows系统所在的分区上,而且最多安装2个Linux系统(每个Linux分区占用2个分区)。在Linux系统安装的过程中,有一步是指定grub的安装位置,默认是MBR,改为分区(因为Linux发行版的不同,指定方式也有所不同),其他默认。后续Linux的安装遵循多Windows系统安装的方式,首先改变活动分区(Linux中使用fdisk工具),在重启系统安装新的Linux。

平常使用时,使用fdisk改变活动分区,即可切换到不同的Linux系统。

混合性系统,当你充分理解了上面两个例子的安装原理后,我相信混合系统对你来说,应该是非常容易的意见事情了。

题外话:

1早期的启动代码,不管Windows还是Linux,都存在对硬盘前7.8G空间的寻址限制,这是因为硬盘的CHS寻址机制造成的,随着LBA寻址方式的出现,现在的启动代码不再有这个限制了,意味着你可以将系统分区安排在硬盘空间7.8G之后的位置了,不过如果硬盘上还有dos系统,就应该注意了。

Linux启动跟windows启动,Windows,Linux启动机制简介相关推荐

  1. linux 内核定时器精度_高精度时钟工作机制简介

    1. 为什么会有高精度时钟 既然提到高精度,那么其对应的就是低精度,所以高精度时钟是为了解决低精度时钟计时精度不足的问题.举个例子帮助理解,日出而作,日落而息,古人以天为单位,安排劳作和休息.随着生产 ...

  2. Linux 中创建 USB 启动盘来拯救 Windows 用户

    WoeUSB 可以在 Linux 中制作 Windows 启动盘,并帮助你的朋友解锁他们罢工的机器. 人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑.有时,我可以使用 Linux US ...

  3. linux系统启动盘怎么制作工具,windows系统制作linux启动盘工具介绍

    Linux发行版排行榜: http://iso.linuxquestions.org/ http://distrowatch.com/dwres.php?resource=major&lang ...

  4. Windows和Linux双启动,并用在Windows下配置CoLinux启动

    http://www.cppblog.com/newclear/archive/2009/09/27/97327.html Windows和Linux双启动,并用在Windows下配置CoLinux启 ...

  5. 安装Linux后windows在哪启动,在Linux下安装windows后解决Linux不能启动能问题

    我的机器是Windows和Linux双系统,那天由于Windows用就了比较卡,就重装了一下Windows,结果导致重启后linux系统不知道到哪去了.懒得去重装Linux了,于是查找了一下资料,经过 ...

  6. linux和windows启动,Linux和Windows双系统的启动

    问题 Linux和Windows双系统的启动 解决方案 在某些特殊情况下,服务器可能要安装双系统 一个linux系统,一个windows系统 这种情况下,安装顺序是,先装Windows系统,后装Lin ...

  7. linux还原windows,双系统如何删除Linux,恢复Windows从  MBR引导启动?

    双系统如何删除Linux,恢复Windows从 MBR引导启动? 现在愿意尝试Linux的人越来越多了.通 常,如果一台电脑里已经装有了Windows ,再装Linux,安装时,Linux的grub引 ...

  8. 启动盘Linux windows,Linux 中创建 USB 启动盘来拯救 Windows 用户

    人们经常要求我帮助他们恢复被锁死或损坏的 Windows 电脑.有时,我可以使用 Linux USB 启动盘来挂载 Windows 分区,然后从损坏的系统中传输和备份文件. 有的时候,客户丢失了他们的 ...

  9. windows 7编辑启动菜单 bcdedit linux,bcdedit用法详解 windows7/vista启动修改

    bcdedit用法详解 windows7/vista启动修改 (2010-09-11 19:27:28) 标签: 杂谈 bcdedit用法详解 在Vista/2008下,我们通过msconfig的&q ...

最新文章

  1. k8s nodeport无法访问_k8s学习之service详解
  2. 官宣!今日北京降雪已达初雪标准
  3. android获取url参数值,android 获取url 参数值
  4. mysql使用常量列_MySQL 执行计划
  5. 苹果ios,下拉菜单错位的问题(目前iphone x没发现有这个问题)
  6. day14——内置函数
  7. python修改xml属性值_根据其属性查找xml元素并更改其值
  8. runtime无法执行grep_Caffe和py-faster-rcnn日常使用备忘录
  9. python创建字符串_Python基础之字符串
  10. Party (Standard IO)
  11. 【代码笔记】iOS-账号,密码记住
  12. java程序设计基础_陈国君版第五版_第六章习题
  13. php url 转码,php url中文转码的方法
  14. js / vue 批量打印二维码图片、PDF、文档
  15. java 股票数据抓取_慢牛系列一:如何抓取股票数据
  16. 王者战力查询接口,四大战区(文字版)
  17. Kattis - bumped B - Bumped! (最短路)
  18. 模拟鼠标键盘操作,含硬件模拟技术
  19. android adb点击坐标,Android 利用adb命令 使App自动点击屏幕指定位置
  20. java atm程序设计_Java ATM机操作界面程序哦

热门文章

  1. Leetcode: Intersection of Two Arrays
  2. Oracle 存储过程中查询序列值并用变量接收
  3. WISEGATE:SIEM的最佳实践讨论
  4. 几种民间排毒养颜祛痘DIY自制面膜 - 健康程序员,至尚生活!
  5. VS 2003 源码配置管理(subversion+apache)
  6. 深度强化学习_深度学习理论与应用第8课 | 深度强化学习
  7. matlab中ismember_相当于Matlab“ismember”in numpy(Python)?
  8. 简单Android手机APP地图,android最简单手机地图APP(只需5分钟)
  9. 常用计算机主要硬件设备,个人计算机常用的输出设备41.计算机硬件的组成部分主要包括:...
  10. 华为虚拟home键关闭_苹果iPhone12或放弃静音键,学华为mate30Pro,发力虚拟按键