B.windows操作系统的启动实现过程
香茗同学提出一个很好的问题,大致语意我理解了,说如果使用winHex提取引导扇区的信息,添加到boot.ini文件中是不是可以实现多引导启动。这个想法的确很好,但是是不可实现的。
下面我说下boot.ini文件是干嘛的?以及它在windows 操作系统的启动过程中担任那些工作,还有就是 windows 操作系统是怎么启动的还有启动的相关的状态描述是怎样的。
boot.ini是windows的setup程序创建的一个引导菜单文件,此文件包含了用于启动的windows版本选项。下面书一个boot.ini文件的例子:
【boot loader】
timeout=30
default=multi(0)rdisk(0)partition(1)/windows
[operating system]
mulit(0)disk(0)rdisk(1)/windows="win xp" /fastdetect
c:/='Microsoft windows"
这种路径指向是按照ARC命名规范来书写的,只有什么是ARC,大家可以下去自己了解。这里不作解释了。
说下multi()语法格式:multi(W)disk(X)rdisk(Y)partition(Z)
w 代表磁盘控制器编号,X在这里总是0,Y指定在控制器W上的具体物理硬盘。
此外ARC规范格式还有scsi()写法和signature()写法。具体自己参考相关文件熟悉了解。
boot.ini只属于一个配置文件,它本身不存在引导功能。那么windows是如何启动的,我们来看下启动过程:
windows setup讲mbr写到硬盘上的时候,它也会在该磁盘的第一个可引导分区写入一个引导扇区,如果存在了一个引导扇区,它会将其覆盖,这就是所谓的 MBR改写。同时它也会
检查这是不是一个有效的MS-DOS引导扇区,如果是的话,它会将其内容 cp到一个名为 bootsect.dos的文件中,放在分区目录下。
windows setup在写分区的引导扇区之前,用一种你所指定的文件系统类型来格式化此引导分区并将文件cp到这个分区。其中就包括 ntldr和ntdetect.com。其中ntldr才是真正的 windows引导程序,类似grub。
引导扇区将ntldr加载到内存后,开始移交控制权,但此时系统还处于实模式状态,它在创建完页表之后才完成向保护模式的切换。启动分页机制以后, ntldr仍然依赖引导代码所提供的函数来访问基于外界系统,此时暂时关闭分页机制,以便bios提供的服务能够执行。无法通过bios固件支持访问的,它需要加载ntbootdd.sys文件。比如SCSI硬盘。
ntldr开始从根目录读取boot.ini 文件,开始清屏,加载 hiberfil.sys(此文件只有在系统休眠转换的时候才起作用,为的是简化启动)。
根据boot.ini中的内容和指示位置来调用相应的有效的 bootsect.dos文件,启动系统。其中boot.ini可以根据需要配置启动参数。 此时开始加载 hal.dll和ntoskrnl.exe,控制权开始交接。具体如何完成操作系统的全面启动,我们在下次讨论。
这里只希望大家理解boot.ini文件的配置参数和ARC规范了解,有兴趣的同志也可以反汇编mbr理解下ntldr 是如何加载的。下次我们将针对ntldr 传递,ntoskrnl功能还有smss,csrss, 以及 winlogon功能作出讨论。
我们现在有了两个可以专门讨论的专题,一个事grub专题,另一个就是使用winHex恢复硬盘数据专题。这两个专题都很有趣味性,在本讲结束后,我们就开始专门针对GRUB和winHex进行尝试性讨论。
今天主要说的内容是文件分配表FAT和文件记录表FDT。
数据的读写都要求操作系统和应用程序在硬盘上找的可操作扇区,那么这就涉及到扇区的地址问题,文件分配表FAT就是记录扇区地址的。硬盘的扇区数目庞大,为了不造成FAT表的体积过大,那么硬盘扇区采用分组管理,分作的过程就是分簇。高级格式化程序就是完成这一过程的。大家思考一下,那么低级格式化主要影响硬盘的那些数据结构呢?
簇的大小是由分区的大小和格式来决定的。文件在磁盘上是采取簇链的形式来检索和管理的。
我们来看一下在磁盘上对文件进行增删改查是如何进行的。这里提供一个思考问题,簇链的数据结构怎样实现,才能实现快速查找,效率最高。
当在磁盘上读取文件的时候,首先从文件的目录中找到该文件的目录登记项,继而从目录项的有关字段,查到分配给该文件的第一个簇号,根据第一簇号的内容可以计算出两组数据。其中一组数据,指出文件在数据区DATA里的第一簇扇区首地址,从首地址开始数据是连续存放的。连续存放多少扇区是由分区的特征决定的。另一组数据指出FAT表内簇登记项的地址,如果其值是结束标志fffH(FAT16格式)或ffffff0fH(FAT32格式)说明文件到此已经结束。如果不是结束标志,则该登记项的值为第二簇号,根据此又可以计算出两组数据,继而制定文件在数据区DATA里第二簇扇区首地址和FAT表内第2个簇登记项。
继续重复上面的过程,就得到全部数据,以及文件在FAT表里的所有簇登记项的地址。
大家可以写一下这个过程。
当建立一个文件时,首先检索FAT表,找到可用簇,可用簇就是登记项值为0000H(FAT16)或00000000H(FAT32)。将该簇作为起始簇,写入文件目录表FDT的相关登记项中。然后检索后面的可用簇,找到以后的将其簇号写入第一个可用簇项内。
重复以上过程,将满足文件长度所需的簇数全部找到。使每一个簇项的値指向下一个所需的簇项,在最后的簇登记项内写入结束标志。于是一条能够检索这个文件的完整簇链完成了。
当需要对文件扩展的时候,先检索FAT表,找到可用簇。将簇项的内容置为结束标志,并将文件原来的最后簇项值修改为指向可用簇。以此类推,直到完成扩展。
删除文件的时候,除了文件目录中表登记项的第一个字节改为e5H,还要把该文件在FAT表的簇链中所对应的项全部清零,这些清零的项又可以供他人其他文件使用。不过在删除文件结束之后,目录登记项的其他字段依然保存完好,只是文件名的第一字节变成了e5H,并且文件存储在扇区里的所有数据依然存在。这时只要FAT表中被清零的簇项没有被新文件使用,就可以将删除的文件恢复。
FAT表记录文件对磁盘的使用情况,系统保留的控制信息并不由FAT表记录。
这些过程很重要,假如我们尝试恢复删除的数据,这些过程必须很入微的理解,建议画一画草图理解。
文件目录表FDT,是由高级格式化程序在特定扇区上建立的。根据偏移量给出下表,说明对应的数据在FDT表中所传达的文件信息。
00H 8字节 文件名
08H 3字节 扩展名
0bH 1字节 属性
0cH 10字节 DOS系统保留
16H 2字节 建立和修改的最后时间
18H 2字节 建立或修改的最后日期
1aH 2字节 起始簇号
1cH 4字节 文件长度
数据区DATA
data的所有扇区都划分为以簇为单位的逻辑结构和FAT表里的簇登记项一一对应。在数据严重受损的时候,我们可能尝试对DATA区数据的全部复制。
至此,磁盘的数据结构全部介绍完毕,在以后的winHex专题,我们还将继续探讨有关问题,比如扇区寻址等。使用相关工具或者编程技术对数据恢复技术做一个简单的尝试。
上讲主要讲了grub和mbr。其中grub内容绝对是大家重点挖掘和重点掌握的内容。grub本身已经不仅仅是一个引导程序了,俨然是一个小操作系统。通过grub源代码的学习,你可以开发自己的微型小操作系统,刻到软盘上来引导和模拟。如果有必要,我们也可以另外开设一个grub专题讨论这些事情。或者群里谁在研究这个问题,也可以把自己的成果展示下,让大家彼此学习一下。这里不再专门讨论了。如果你掌握了硬盘启动的过程以及故障判断,还有grub的常用功能,比如引导多操作系统,引导硬盘安装linux,修改linux超级用户密码,制定grub本身密码,这些都会了,基本合格。
接上讲的内容来继续。
在主引导扇区这里,MBR占到446个字节,存放系统主引导程序。不会因操作系统的不同而性质不同。下面罗列下主引导扇区的内容,这有助你理解grub 源代码。
主引导扇区内容
MBR:000H---08AH 主引导程序,用于寻找活动分区
08BH---0D9H 启动字符串
0DAH---1BDH 保留 (总计:446字节)
DPT: 1BEH----1FDH 硬盘分区表 (64字节)
signature : 1FEH---1EFH 结束标记(55aa) (2字节)
(grub专题下一讲吧,这里先讲完硬盘的数据结构。)
在实模式下可以使用int 13H中断调用来查看主引导记录内容。在windows下也可以使用createfile()函数实现mbr的读写。在实模式下使用biosdisk()函数也可以实现mbr读写。针对数据恢复我们一般都选择实模式方式和debug方式来修复数据。我之所以强调这些东西,主要是解释文件在磁盘上是如何存储的,针对各种文件系统他们的机理又是怎样的。至于由此而延伸的知识拓宽,取决于每个人的兴趣。有些知识如果深入,我也不太懂,只能是提供一种兴趣导引。我在这里就简单的数据恢复方面在实模式下是怎样实现的来举几个操作实例。
首先说下如何使用debug查看mbr.
DOS实模式下:
debug
-a 100 :由100处开始输入指令
mov ax 0201 读第一个扇区
mov bx 0200 读至缓冲区为200H处
mov cx 0001 柱面号为0,扇区为1;
mov dx 0080 磁头号为0,第一块硬盘;
int 13 调用中断
int 20 返回
-g 执行命令
-d 200 1200 显示缓冲区200H处数据,长度为200H字节
-q 退出
(其中显示的数据即为主引导记录内内容)
我们在实模式下C语言读写扇区代码,下去大家自己练习,这个没有什么难度。主要就是应用biosdisk()函数读取。
下面开始说分区表
如果说MBR在操作系统的启动中至关重要,那么分区表对于操作系统的文件系统是至关重要的。想了解文件系统的存储原理和数据恢复那么一定要学会看分区表。这里推荐一款工具winHex.想了解这两个方面知识的通知首先要学会使用这个工具。具体方法可以参照winHex 手册,慢慢领悟。不必太过急躁。每一个工具的使用都需要一段时间的练习,无其他,唯手熟尔。
我现在把分区表的偏移量所对应的字节内容解释罗列出来,有助于大家理解。
分区表一般存在4个表项,每个表项16个字节。常用的为2个表项。下面是分区表偏移量所对应的值传达的信息:
偏移量 字节编号 字节长度 内容说明
1beH 447 1 BOOT ID:如果为80H 表示可启动分区,
否则为 00H
1bfh 448 1 分区起始磁头
1c0h 449,450 2 分区起始扇区和柱面值
1c2H 451 1 操作系统和文件系统的ID值(这个事很重要
的)
1c3H 452 1 分区结束磁头
1c4H 453 454 2 分区结束扇区值和柱面值
1c6H 455--458 4 分区前扇区总数
1caH 159---462 4 分区内扇区总数
在扩展分区的逻辑驱动器上存在一个分区链表,解读方法与此相同。(这里涉及到链表了,请复习链表知识哈,以后还要用到)都是从1beH开始到1cd H结束。
关于分区表就讲这么多,防止你越来越混淆,不必脚步太快。重点是学会从偏移量对应的数值来分析分区表信息,然后就是第一次亲密接触winHex工具。这两个掌握了就可以了。
剩下的部分我们来说下linux的fdisk操作。
linux磁盘管理在小红帽的考试中占有一定的比例,其中最常用的就是fdisk. 这个命令功能强大,在练习的时候如果不是虚拟机模式一定要谨慎。
下面我就简单的说一说fdisk的常用参数。剩下的可以自己参考man手册。
fdisk最简单的命令参数就是显示已知分区,fdisk -l
使用fdisk编辑分区表 fdisk /dev/hda 进入交互模式 选择 m 下面就会出现一系列命令参数解释,大家可以自己练习下。
下一讲将涉及文件系统和windows启动方面的一些知识。
第一章 文件系统
A.硬盘知识导引
说起文件系统,我们从硬盘的数据结构开始。其中涉及到汇编知识,引导型病毒示例,数据恢复和C语言读写硬盘扇区内容。需要使用的实践系统环境为DOS实模式,工具为borland c++ 3.1或者TC2.0。
在说到工具和环境的时候,好多人都说DOS和TC,BC3.1都被时代淘汰了吧。我个人对这种现象有一点自己的看法。大家都知道现代操作系统为了安全把自己武装的像防蜂人一样,但是一旦一只蜜蜂突破了防线,这种武装却苦不堪言,相反却成了桎梏。当某一天你的硬盘遭受了数据消失的灾难,或者你的硬盘由于某种原因不转了,这些“老掉牙”的系统或者工具可能对你的数据恢复有所帮助。那么通过本系列专题你可以了解到怎样在我们恐惧的黑屏窗口下对我们丢失的数据进行恢复的尝试。有信心学好的同志,我也鼓励你现在就把自己的重要文件删掉,看一看学完数据恢复以后是不是能把删掉的文件进行恢复。^_^
对于柱面,磁头,扇区这些基本概念大家都能理解吧,不理解的可以留言,我再个别解释。
对于现代硬盘的数据结构,主要分为6部分,主引导记录,主分区表和分区表链,分区引导记录,文件分配表,文件目录表以及数据区。
先说主引导分区(MBR),位置为0柱面0磁道1扇区,该扇区的512个字节有3部分内容,主引导记录,分区表和结束标志55AA。
现在根据它的这种结构来说下硬盘在计算机系统中是如何启动的:
1.BIOS自检;
2.将磁盘的第一扇区(0柱面0磁道1扇区)读入内存。
3.检查结束标志,也就是扇区的最后两个字节的值是否等于aa55H,如不等屏幕打印然后关机。
4.执行主引导记录中的程序,将控制权交给主引导程序。
5.主引导程序首先将自己读入内存,然后查找分区表中是否有活动分区,找到活动分区以后,将分区引导记录读入内存。
6.检查结束标志,是否等于aa55h,如果等于执行分区引导记录的启动程序,将控制权交给操作系统。
7.操作系统加载系统文件,计算机启动。
我强烈建议你根据这个过程画一张图来理解下。其中涉及到主引导程序,我这里就以grub为例,来说下有关grub的一些应用和小知识。由于是知识串讲,我们不急,虽然数据恢复技术的确让人着迷,但是耐心也是很重要的。
grub引导程序相信熟悉linux的同志都很喜欢,功能强大,界面干净。我根据grub引导操作系统的一些细节来帮大家理解下硬盘的启动过程。
首先在windows下将linux系统删掉,重起操作系统。系统重起后光标停止在grub界面不再前进,那么此刻硬盘的启动已经经历了bios自检,第一扇区读入内存和检查结束标志以及控制权交接(我们要学会诊断启动故障),但是由于我们把linux系统删掉了,grub找不到存在于linux系统下的grub.conf配置文件,那么光标就停止在启动界面。根据硬盘的启动过程判断,这时候还有一种不能启动的原因就是没有活动分区,这个问题我们将在后面进行讨论。grub.conf文件一般存放在 /boot/grub目录下,想查看其内容需要root权限,使用如下命令可以查看其内容 cat /boot/grub/grub.conf 。关于一些grub的命令我就不在这里重复了,有兴趣的同志可以到网上查找下相关的grub专题,其中比较好玩的就是给grub加密码,也可以加md5 的,但慎用哈,出了问题我不负责任,呵呵。其次就是用grub引导安装linux系统。删除linux系统无法进入windows操作系统,可使用以下命令:
1。rootnoverify (hd0,0)
2.chainloader +1
3.boot
根据grub的引导过程,我们也可以大致揣摩它的一些程序结构,有兴趣的同志可以参看一下源代码,它的功能远不仅仅于引导。
主引导记录扇区所在的磁道,通常称为0磁道,属于隐藏磁道。63个扇区都属于隐藏扇区,这里操作系统的命令除了fdisk以外,都不可访问。即使格式化命令format也不可以。所以一些病毒代码,操作系统引导代码,应用软件自我保护识别标记,BIOS功能扩展程序代码都喜欢在这里藏身。