从WDP开始,相信大家都注意到了一点,在大多数配置下Win 8的启动速度比起之前的版本都有了很明显的提升。这个优势就是来源于Win 8经过改进的启动机制,微软官方称之为“快速启动”。对这一部分,微软在“Building Windows 8”博客里面已经介绍过了,当然下面我要说的并不只是那个文章里面的内容,但是就让我从快速启动的机制开始说起吧。
较旧的系统,比如Win 7,我们在对其进行重启的时候,我们就可以看到一个完整的“关机+开机”流程。
旧式重启的流程是这样的:
关机流程:
1、由用户通过按下开始菜单的“关机”按钮,或者按下主机上的电源键引发一个关机的操作;或者应用程序调用系统接口函数ExitWindowsEx()或者InitiateShutdown()来触发一个关机操作。
2、Windows系统向整个系统里面的所有正在运行的程序发出一个广播信息,让程序可以有一个保存程序数据的机会,程序当然也可以向系统请求一小段时间来完成保存工作。这也就是我们关机的时候遇到半透明灰色界面,询问是否继续关机的时候所进行到的一步。
3、Windows关闭每一个已登陆帐户的用户会话。
4、Windows向系统的服务发出信息,提示它们一个关机操作已经开始,因此它们应该自行关闭。这个过程将会根据服务的依存性来依次从上而下关闭,其余的平行关闭。如果有服务出错不能关闭,则会被强制关闭。
5、Windows向硬件设备发出信号,提示设备关闭。
6、Windows关闭系统会话(也就是“session0”)。
7、Windows清理所有挂起的数据,将它们送至对应的系统驱动,以保证这些数据被完整的保存。
8、Windows通过ACPI(高级配置与电源接口)向电脑的硬件发出断电的信号,最后关机断电。当然如果是重启,则不会断电。
ACPI相关指令
G0(S0): 工作状态
这个就是正常情况下的状态,“离开模式”也属于这个模式,只是显示屏被断电。
G1(S1~S4):睡眠状态
睡眠状态根据睡眠断电的程度分成四级:S1~S4
G2(S5), Soft Off: (软关闭)
这个模式电脑的供电系统保持供电,其余硬件都只带电而不带数据。这个模式用于重启或者是可通过外设唤醒的休眠状态,整机处于一个最低的耗电状态,而又可以接收外设的数据。
G3,Mechanical Off:(硬关闭)
这种状态就是一般开机时直接按下电源键后得到的状态,整机彻底不带电,可以拆装。
下面是开机流程:
1、在按下电源键之后,电脑的硬件启动一个通电自检程序(POST, Power-On Self Test)。这个程序是记录在BIOS里面的一小段程序,检查通过之后就会加载BIOS里面的硬件设置。当一个系统磁盘被检测到之后,自检就会结束。
2、硬件读取主启动记录(MBR, masterboot record),然后启动Bootmgr.exe程序。这个程序在系统盘上搜索Windows的启动程序Winload.exe。
3、当Winload.exe启动之后,Windows内核所需的基础的驱动就会被加载,然后系统内核被启动,并加载所有标记为BOOT_START的注册表记录和更多的驱动到内存中。
4、系统内核将控制权传递给会话管理进程(Smss.exe),它将启动系统会话,加载并启动没有被标记为BOOT_START的系统设备和驱动。
5、Winlogon.exe被启动,这时候我们所熟悉的用户界面就会出现。服务管理器启动系统的服务,所有的组策略都在这时候被运行。当用户通过选择用户名称(可能自动跳过,也有的情况需要键入密码)登陆后,Windows就会为用户创建一个用户会话。
6、Explorer.exe启动,系统创建桌面窗口管理器进程(DWM.exe),这个进程初始化桌面,并最终显示。启动完毕。
这整个过程中每一步所花费的时间都是可以监控的。下面是自己动手环节,自己监控自己的系统启动情况。
在Windows SDK里内含了一个工具:Windows Preformance Tools Kit安装好之后,以管理员权限打开“命令提示符”,键入下面的命令:(用之前保存一个还原点)
xbootmgr -trace boot -traceFlagsBASE+CSWITCH+DRIVERS+POWER -resultPath C:\\TEMP
部分机子可能这样之后重启会遇到蓝屏= =。这在有的情况下跟踪的参数加上DRIVERS可能会出现,这时候就返回前面保存的还原点,去掉那一个参数,少监控一部分,但是就不会有问题出现:
xbootmgr -trace boot -traceFlagsBASE+CSWITCH +POWER -resultPath C:\\TEMP
当然,这是跟踪启动过程的命令,如果想跟踪关机过程,将上面的boot换成shutdown,休眠过程则换成hibernate。C:\\TEMP是记录文件的存放地址,可以自行修改。
当完成一次跟踪之后,相应地址就会有文件生成,下面用这个命令将里面的etl文件编译成xml文件来进行分析:(文件名根据相应情况修改)
xperf /tti -i
boot_BASE+CSWITCH+DRIVERS+POWER_1.etl -o summary_boot.xml -a boot
打开生成的xml文件,会看到这样的内容:
里面写的就是每一步对应的开始和结束时间点,六位数字就是分秒毫秒单位计时。timingbootDoneViaExplorer 值是windows启动至桌面出现所需时间;bootDoneViaPostBoot值是windows完全启动至所有用户程序都启动完达到10秒空闲所需要的时间。
这就是整个启动过程图,xml上面名称可以对应相应部分,在前面的启动流程步骤有具体介绍,不再赘述。
从这里我们可以想到,既然每次系统关闭需要将服务和驱动的数据临时保存,下次又重新取出接着运行,那么为什么不将整个这个系统的基础部分利用休眠的方式从内存复制下来,下次重新取出放入内存就可以一步完成几步的操作,而且完成的速度相当快。因此,Win 8引入了混合启动。
正如上图所示,混合启动的关键就在于将系统关闭开启的时候频繁的写入读取系统基础服务和驱动的步骤用休眠替代,每一次关闭的时候,数据不需要转换,直接写入休眠文件,下次启动读取后,只要做额外的一些非BOOT_START标记的驱动的初始化,就可以启动Winlogon.exe来启动用户登陆界面,中间的系统会话、服务不需要广播等待关闭开启,大幅度的提升启动速度。这就是Win 8快速启动的奥秘所在。
在Win8下,运行这个命令:dir /s /a hiberfil.sys
这时候我们可以在系统分区下发现一个相当大的文件,默认大小为内存大小的75%,但是一般情况下只是内存大小的10~15%,区别在于系统的驱动、服务等各种因素。这个文件就是系统用于存放休眠数据的文件。在以前的Windows版本实际上已经存在这个文件,充当着相同的功能。
这个新的启动模式能让所有配置的电脑启动加快,而且如果配合新的UEFI(统一的可扩展固件接口)主板,通过更快的完成启动系统之前的自检以及配置硬件操作(POST/Pre-boot),系统启动将进一步加快。当然,有的时候我们希望系统进行一次彻底的重启,来完成我们的硬件改动。这时候我们就需要通过命令行来实现:shutdown /s /full /t 0
另外,Win 8有着全新的系统选择界面。大家可能从WCP开始就发现,Win 8的系统切换需要先启动完系统,才出现选择菜单,选择别的系统则需要第二次启动。为什么会这样呢?我们来回顾一下刚才的启动流程。
旧式的启动流程,需要通过MBR找到Bootmgr.exe来启动Winload.exe进行各种驱动和基础的服务的启动。但是在新的快速启动流程里面,这一步被休眠恢复所取代。恢复所需的时间不长,恢复完已经可以提供基本的完整系统功能,各种服务、驱动更加齐全。如果我们选择以旧式的思路,将选择放在恢复之前,那么就必须在这里面再插入一步来显示选择菜单,而且对于没有键鼠的平板,在这种菜单下根本无法操作——缺乏触摸屏的驱动。为了整个系统各版本的风格统一,也为了提供更高级的操作菜单,将选择放在恢复之后就是明智的选择。从这里我们可以更加看出微软在Win8上为平板所放的心思。
但是快速启动有一个致命的原理漏洞,到目前尚未被解决。这个漏洞涉及的是有多个硬盘多个系统启动的用户,如果在休眠之后启动的时候选择其他系统而不是Win8,会导致上一次进入Win8进行的所有硬盘操作均被消除。具体情况请看这里:
https://bbs.pcbeta.com/viewthread-1051143-1-1.html
总结一下:
快速启动的优点:
启动步骤少,快捷;新菜单功能更加强大,能用键鼠操作,方便新手使用;对平板能够有更好的启动多系统选择支持。
缺点:
每次选择非win 8系统必须二次启动;设备需要彻底重启必须用命令行关机,或者关闭快速启动;快速启动有原理漏洞,可能导致资料丢失。
下面我们作为对比,简单介绍一下OS X和Linux的启动流程。
1、BootROM
当一台Macintosh被启动时,BootROM固件同时也被激活。BootROM(也是电脑的一个硬件)拥有两个主要职责:初始化系统的硬件和选择一个操作系统来启动。BootROM拥有两个部分来帮助它实现这两个职责:
•POST(Power-On Self Test,开机自检)初始化硬件接口,验证是否有足够可用RAM以支持系统运行,并检查可用RAM是否处于正常状态。
•在PowerPC架构的Macintosh电脑上,Open Firmware初始化剩下的硬件,建立最初的设备树(类似目录树,一个用层级关系的方式来表示各硬件与主机间的逻辑关系),并且选择操作系统来启动。
在Intel架构的Macintosh电脑上,EFI来处理基本的硬件初始化,并且选择一个操作系统来启动。如果安装有多个可启动的Mac OS X系统,BootROM会选择那个最后被系统预置中启动磁盘设置项选择的操作系统。用户可以在电脑启动时按住Option键来自行选择启动的系统,这个做 法会让Open Firmware或者EFI显示一个选择启动宗卷的界面。
2、启动引导器
一旦BootROM的工作完成,并且选择了个Mac OS X分区被选择用其启动,控制权就被传递给BootX(PowerPC平台)或者boot.efi(Intel平台)启动引导器。启动引导器的主要工作就是加载内核环境, 作此工作时,启动引导器会在屏幕上显示一个启动画面。在“exotic”模式下启动的时候,比如说从一个软RAID宗卷上启动的时候,一个启动引导器会保存在一个叫做独立的HFS+的“辅助”宗卷上来启动系统。在一些版本的Mac OS X上,内核和mkext缓存的拷贝亦会保存在辅助宗卷里。也就是,这种情况下,根分区下面的引导器和其他一些部件不起作用。
启动过程最开始,启动引导器尝试加载一个包含了所有设备驱动程序的预链接的内核版本。预链接这些设备驱动程序可以缩短系统启动时间。如果预链接版本的内核丢失,已经过期,或者已损坏,启动引导器会加载一个包含了与预连接内核所列相同驱动的单独压缩包,此包被称作 mkext缓存。如果mkext缓存包过期,丢失,或者已损坏,启动引导器会搜索/System/Library/Extensions,寻找 OSBundleRequired属性根据启动类型(例如本地启动或者网络启动)所列的驱动列表来加载驱动。一旦内核和所有为启动而必需的驱动加载成功,启动引导器就启动内核的初始化进程。此时应该有足够的驱动被加载,以找到根设备来加载内核。也是在此时开始,PowerPC架构的Macintosh电脑上,Open Firmware不再被访问(静默状态)。内核初始化Mach和BSD数据结构以及I/O Kit。I/O Kit使用设备树作为根据来连接那些已经加载进内核的驱动。一旦内核找到根设备,BSD将把此为root(*)来启动。
3、系统初始化
Mac OS X v10.4以前,系统初始化一直是交给mach_init和init来处理。初始化过程中,这两个处理进程调用不同的系统脚本,启动程序,为用户准备系统。Mac OS X v10.4以后,这些系统脚本和守候进程的调用交由launchd来处理。除了初始化系统以外,launchd进程还协调系统守候进程秩序地调用。就像inetd进程一样,launchd按需启动守候进程。然后,launchd 启动SystemStarter,后者用来启动那些非按需启动的守候进程。系统初始化的最后阶段,launchd启动loginwindow。loginwindow程序控制了用户会话各自的外观和登录窗口的调整以及用户登录认证。
4. 用户认证
Mac OS X要求用户在进入系统前进行验证。loginwindow程序分为登录部分(显示为用户输入用户名和密码的窗口)以及安全部分(处理用户的认证信息)。一 旦通过安全系统的认证,loginwindow程序开始配置用户环境。有两种情况loginwindow会忽略通常的登录方式而直接开始用户会话。第一种 是当系统管理员设定计算机自动以一个指定的用户登录的时候。另一种是安装软件时,如果installer程序在电脑重启后立即运行的时候。
5、配置用户会话
用户成功认证后,loginwindow会马上配置用户环境并且记录这次登录信息。此时会进行如下任务:
•对未经授权的远程登录会话采取安全措施。未经注册(译者注,原文reigstered,就是指前面说的未经授权)的应用程序不能使用粘贴板服务(Clipboard)端口。再此情况下,一些标准的功能不能使用,包括复制,剪切,粘贴,Apple events,窗口最小化,还有其他服务。
•把登录记录在系统的utmp数据库中。
•为控制台终端配置拥有者(译者注,原文owner)和权限。
•重置用户偏好,从而加入全局系统默认值。
•通过bootstap端口和启动pbs注册粘贴板服务(pbs)。
•根据用户偏好设置鼠标,键盘,系统声音。
•设置用户组权限(gid)
•从目录服务(Directory Services)中检索用户记录,并且将信息加入到此会话中。
•加载用户环境(包括偏好设置,环境变量,设备和文件权限,钥匙串访问(keychain access)等等)。
•启动Dock,Finder和SystemUIServer。
•启动用户在 偏好设置 中的 帐户设置 中 登录项目项 中设置的应用程序。
一旦用户会话启动并开始运行,loginwindow通过一下方式监视会话和用户的应用程序。
•管理用户登出,重启和关闭过程。查看“Logout Responsibilities“以获得更多信息。
•管理强制退出窗口,包括监视当前活动的应用程序,并且响应用户对强制退出某应用程序或者重启Finder的请求(用户可以从苹果菜单或者按下Command-Option-Escape键来启动强制退出窗口)。
•将标准错误输出(stderr)写入日志文件。日志文件储存在/资源库(Library)/Logs/Console/ <uid> /console.log文件里,<uid>表示当前登录用户的ID。
如果Finder,Dock或者SystemUIServer进程因为某种原因死掉了,loginwindow会自动重启他们。同样,如果loginwindow进程死掉了,launchd进程会将其重启。
Linux:
启动第一步--加载BIOS
当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了 CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。
启动第二步-读取MBR
众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。
系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0x7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。
启动第三步-Boot Loader
Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好一切准备。
Boot Loader有若干种,其中Grub、Lilo和spfdisk是常见的Loader。我们以Grub为例来讲解吧,毕竟用lilo和spfdisk的人并不多。系统读取内存中的grub配置信息(一般为menu.lst或grub.lst),并依照此配置信息来启动不同的操作系统。
启动第四步-加载内核
根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。
启动第五步-用户层init依据inittab文件来设定运行等级
内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:关机
1、单用户模式
2、无网络支持的多用户模式
3、有网络支持的多用户模式
4、保留,未使用
5、有网络支持有X-Window支持的多用户模式
6、重新引导系统,即重启
启动第六步-init进程执行rc.sysinit
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定 PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。如果你有兴趣,可以到/etc /rc.d中查看一下rc.sysinit文件,里面的脚本够你看几天的:P
启动第七步-启动内核模块
具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
启动第八步-执行不同运行级别的脚本程序
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
启动第九步-执行/etc/rc.d/rc.local
你如果打开了此文件,里面有一句话,读过之后,你就会对此命令的作用一目了然:
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don’t
# want to do the full Sys V style init stuff.
rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。
启动第十步--执行/bin/login程序,进入登录状态
此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了。