系统引导过程简介
系统引导过程主要由以下几个步骤组成(以硬盘启动为例)
(1) 开机;
(2) BIOS加电自检(POST---Power On Self Test),内存地址为0fff:0000;
(3) 将硬盘第一个扇区(0头0道1扇区,也就是Boot Sector)读入内存地址0000:7c00处;
(4) 检查(WORD)0000:7dfe是否等于0xaa55若不等于则转去尝试其他介质;如果没有其他启动介质,则显示 ”No ROM BASIC” ,然后死机;
(5) 跳转到0000:7c00处执行MBR中的程序;
(6) MBR先将自己复制到0000:0600处,然后继续执行;
(7) 在主分区表中搜索标志为活动的分区如果发现没有活动分区或者不止一个活动分区,则停止;
(8) 将活动分区的第一个扇区读入内存地址0000:7c00处;
(9) 检查(WORD)0000:7dfe是否等于0xaa55,若不等于则显示 “Missing Operating System”,然后停止,或尝试软盘启动;
(10) 跳转到0000:7c00处继续执行特定系统的启动程序;
(11) 启动系统
以上步骤中(2),(3),(4),(5)步由BIOS的引导程序完成;(6),(7),(8),(9),(10)步由MBR中的引导程序完成
一般多系统引导程序(如Smart Boot Manager, BootStar, PQBoot等)都是将标准主引导记录替换成自己的引导程序,在运行系统启动程序之前让用户选择想要启动的分区而某些系统自带的多系统引导程序(如LILO,NT Loader等)则可以将自己的引导程序放在系统所处分区的第一个扇区中,在Linux中即为两个扇区的SuperBlock
注:以上步骤中使用的是标准的MBR,多系统引导程序的引导过程与此不同
硬盘结构
硬盘参数
3D参数(Disk Geometry):CHS(Cylinder/Head/Sector) C-Cylinder柱面数表示硬盘每面盘片上有几条磁道,最大为1024(用10个二进制位存储);H-Head磁头数表示硬盘总共有几个磁头,也就是几面盘片,最大为256(用8个二进制位存储);S-Sector扇区数表示每条磁道上有几个扇区,最大为63(用6个二进制位存储)
引导扇区
Boot Sector组成
Boot Sector也就是硬盘的第一个扇区,它由MBR(Master Boot Record), DPT(Disk Partition Table) 和 Boot Record ID三部分组成 MBR又称为主引导记录,占用Boot Sector的前446个字节(0~0x1BD),存放系统主引导程序(它负责从活动分区中装载并且运行系统引导程序) DPT即主分区表占用64个字节(0x1BE~0x1FD),记录磁盘的基本分区信息主分区表分为四个分区项,每项16个字节,分别记录每个主分区的信息(因此最多可以有四个主分区) Boot Record ID即引导区标记占用两个字节(0x1FE~0x1FF),对于合法引导区,它等于0xaa55,这是判别引导区是否合法的标志) Boot Secor具体结构如图一
分区表结构简介
分区表由四个分区项构成,每一项结构如下:
BYTE State:分区状态,0=未激活,0x80=激活(注意此项);
BYTE StartHead:分区起始磁头号;
WORD StartSC:分区起始扇区和柱面号,底字节的底6位为扇区号,高2位为柱面号的第9,10位,高字节为柱面号的低8位;
BYTE Type:分区类型,如0x0B=FAT32,0x83=Linux等,00表示此项未用;
BYTE EndHead:分区结束磁头号;
WORD EndSC:分区结束扇区和柱面号,定义同前;
DWORD Relative:在线性寻址方式下的分区相对扇区地址(对于基本分区即为绝对地址);
DWORD Sectors:分区大小(总扇区数)
在DOS或Windows系统下,基本分区必须以柱面为单位划分(SectorsHeads个扇区),如对于CHS为764/256/63的硬盘,分区的最小尺寸为25663512/1048576=7875MB
由于硬盘的第一个扇区已经被引导扇区占用,所以一般来说,硬盘的第一个磁道(0头0道)的其余62个扇区是不会被分区占用的某些分区软件甚至将第一个柱面全部空出来
首先在硬盘分区时一定要注意,要搞清楚主分区,扩展分区和逻辑分区之间的关系以及位置,这个分区可以用fdisk或者diskman(diskgen),后面这两个可以修改分区表等,相对来说功能比较全,安全性比较好,如果实在方便期间可以进入windows安装pqmagic分区魔术师,只要你 *** 作正确这个也很安全(我就一直用这个给自己和别人搞分区) 一般说来,如果事先装了windows,那么windows的c盘就是hda1,windows剩下的盘(d,e,f)构成扩展分区总称为hda2,而其中的d,e,f分别都是逻辑分区,一般分别为hda5,hda6,hda7,至于为什么,原因在上面都说清楚了,而你要安装的linux分区和swap最好分在hda3,hda4(或者其他主分区)上,因此要注意不要分在扩展分区,这在pqmagic中可以看的很清楚!!
分好区后就可以安装了,如果在安装的过程中出现错误而导致安装失败,这个时候千万不要着急,首先找到安装windows的光盘进入修复控制台输入下面两个命令:
代码:fixmbr
fixboot c:
重启,看可不可以启动windows,如果不可以,进入dos,输入
代码:fdisk /mbr
再重启,看可以启动windows吗,如果仍然不行,重复一下上面用windows光盘的方法,如果这样后仍然无效,可以用diskman或者diskgen再修复试试,这些方法如果都不行,那就确保c盘没有重要文件后重装windows吧,如果你实在不想重装windows那就再试试linux的安装,如果此时linux安装成功,那么一切问题都解决了,windows也恢复正常
另外,如果再双系统中windows你重装了,那么也要修复一下linux,我知道的方法就是用安装光盘重装grub,
进入linux rescue模式后,输入
代码:chroot /mnt/sysimage #改变你的根目录
grub-install /dev/hda #安装grub到mbr
1lilo(LInux LOader)
LILO引导扇区包括一个分区表的空间,所以,LILO即可以安装在MBR中,也可以安
装在某个分区的引导扇区。LILO拥有DOS引导扇区的所有功能,而且,它还可以引导
逻辑扇区和第二硬盘分区。LILO还可以和另外的引导者合作(例如:NT loader),这样,
用户就可以有很多选择。
(注:以下几个标题,为防止引起歧义,用原文)
11 LILO started by MS-DOS MBR
如果系统至少有一个linux主分区,(非交换区,且在第一硬盘上),那么LILO就可
以安装在这些分区中的一个。当 LILO对应分区被激活后,引导过程如下:
BIOS 读入 MBR
MBR 读入 活跃主分区:LILO所在的分区。
LILO 引导Linux或另外的 *** 作系统。
要引导其它OS且不用LILO很简单,激活那个分区。Linux分区没有任何变化,非常安全。
12 LILO started by a boot manager
假如用户不想删除老的boot manager,或者某个OS LILO不能引导,可以考虑该途径。
1. 假如boot manager可以引导扩展区,那儿是LILO的好去处。
2. 假如 boot manager 可以引导第二硬盘分区,linux可以装在第二硬盘上。
3 有些 boot manager 甚至可以引导逻辑分区,那LILO就可以装在逻辑分区上。
当然,也要注意以下情况:
1 某些 *** 作系统直接改写MBR,这会将原来的boot manager破坏。
2 重新分区会破坏扩展分区的引导扇区,这时LILO可能要重装。
当安装新的系统时,是否要重新安装(linux)依靠新的boot manager,要么LILO引
导扇区被注销,要么boot manager 为它提供一个引导项。重新分区或分区格式化会将
LILO和linux全部删除。
13 LILO占据MBR
假如整个linux系统都在第二硬盘上,且第一硬盘没有扩展分区,那么,LILO只有装
在MBR上。这样,会将老的MBR冲去,所以,在安装LILO前,要将老的MBR(包括分区
表)做一个备份。DOS下有很多工具可以完成这个任务。在linux下,这样备份:
# dd if=/dev/hda of=/backup/MBR bs=512 count=1
写会使用命令:
# dd if=/backup/MBR of=/dev/hda bs=446 count=1
这样,原来的MBR就被写会但不包括分区表。如果分区表也要恢复,那么bs=512
注意,这样,新的分区表会被破坏!
14 LILO 文件
与LILO有关的文件通常放在/boot/下,配置文件liloconf在/etc/下。包含实际
引导系统信息的映射文件有/sbin/lilo安装。对于任何LILO安装,配置文件应该被定
置以适合个人需要。
The configuration file:配置文件
基本上,配置文件是一些变量赋值。每一行包含一个标志变量或一个变量赋值
配置文件被特殊的变量赋值分成几个区,每个区引导一个linux或其它OS
下面解释常见的行:
boot = device
说明那一个设备或哪一个分区包含引导扇区。假如没有给boot赋值,取当前缺省值。
compact
激活一种模式,在此模式下,LILO一次向BIOS请求读入相邻的几个分区。这极大的
缩短了装载时间,特别是从软盘启动。
delay=tenths
以10秒为单位,规定LILO在引导第一个引导配置前应等待用户的时间。若没有定义,则
直接引导。
Linear
使LILO生成线性地址,而不使用通常的Sector/Head/Cylinder机制。Linux地址机制
可以不依赖磁盘的物理结构。
install = boot sector
使用指定的boot sector写入引导扇区,缺省用/boot/bootb
disktab=disktab
使用指定的disktab,缺省使用/boot/disktabdisktab保存了硬盘物理结构信息。
map=map file
说明映射文件的路径。
message=file 指
定一个文件,该文件的内容将会在LILO引导是被显示。假如没有说明该文件,那么就
只会出现"LILO"。
verbose=level
说明LILO的调试级别。从0(不显示任何信息)到5(所有的状态信息)。
backup = backup file
以前引导扇区内容的备份文件。缺省使用/boot/bootdevice number
force-backup=backup file
和backup 相同,当时假如备份文件存在,被覆盖。
prompt
指定要用户通过键盘选择要引导的内核。不会缺省选择。
timeout=tenths
设置一个超时值,在此时间内必须有键盘输入,否则用第一个配置。类似,假如超
时,就不能再输入密码。一般情况下,该取缺省值,无穷大。
注:delay 与 timeout的区别(joe 认为),delay 是"LILO"出现后用户必须有
输入的最长时间。timeout 是用户在按了任意键后,系统等待选择,用户
两次击键的最大间隔时间。
serial=port, bps parity bits
设置串口参数。如果LILO会从该文件获取串口参数的话。如果其中之一无效,
那所有三个参数都无效。Port从四个标准串口选择一个:0对应COM1 或者
/dev/ttyS0。支持的波特率范围为:100-9600。所有校验设置都支持
(n:none,e:even,odd)
bits为7或者8。缺省为serial=0,2400n8
Ignore-table
让LILO忽略被破坏的分区表。
fix-table
允许LILO将每个分区的(sector/head/cylinder)地址转化为线性地址。通常,
分区地址从cylinder boudary开始。某些 *** 作系统,会改变这一点。由于LILO只能
将它的启动扇区写于两种地址都一致的分区上,不正确的3D地址可以用fix-table
来纠正。但是,这种纠正不能被保证是永远的,所以重分区以保证对齐cylinder
boudary 是最好的选择。
password=password
为引导配置设置password
restricted
放松对password的限制。只有用户想传附加的启动参数给内核时才需要password
optional
允许配置的几个内核有错误的,或者不存在,如果不说明optional,LILO遇到这种
情况就会打印一些错误信息然后退出。
每个从LILO引导的配置从image行开始。
Image = kernel
Label = name
Image包含要引导的内核。Label是给用户选择用的。Image行通常指向一个设备,
例如/dev/fd0,可以找到内核的范围用range来注明。
range = range
range可以用start sector -end sector 或者 start sector + length 表示。例如:
image = /dev/fd0
label = floppy
range = 1+512
以下变量赋值有可能出现:
append=string
将string作为引导参数传给内核。例如,硬件参数。
literal=string
和append查不多。但是,他会冲掉原来的设置。所以不能被全局说明。
ramdisk=size
设置RAM disk的大小。
read-only
read-write
设置根文件系统的访问方式。
root=device
设置根文件系统存在的设备。
vga=mode
屏幕设置。可能模式为:normal,extended 和ask 。
以下设置是针对别的 *** 作系统的:
loader=loader
说名用来引导 *** 作系统的文件。缺省为 /boot/chainb 另外,LILO包含以
下的loader:
os2_db 可以从第二硬盘上引导os/2
any_db 在引导 *** 作系统之前试图将两个硬盘的次序颠倒,从而可以引导第二硬盘
上的os
table=device
说明一个设备,该设备的某个分区上存放要引导的os假如没有说明table,
LILO就不会将该信息传给要引导的osunsafe
关掉对要引导的os的检查。只有要从软盘引导时,才使用该设置。没有该设置,
每次map installer开始运行时,引导盘都要插入软驱。
The disktab file
disktab文件包含LILO要引导的设备的物理结构信息。通常,这些信息可以从设备驱
动程序获取。所以,只有这种方法不行时才会用到disktab 文件。在此情况下,如
果文件不能用,LILO报告错误信息:
geo_query_dev HDIO_GETGEO(dev …)
或者
HDIO_REQ not supported for your SISI controller
Please use /boot/disktab
然后,物理结构信息就必须手工地输入。
# /boot/distab-LILO parameter table
#
#This table contains the geometry parameters for SCSI and
# IDE disks,which can not be recognized automatically
# Entries in this table overwrite recognized parameters!
#
# Dev BIOS Secs/ Heads/ Cylin - Par
# num Code track cyLin Ders Offset
(optional)
#0x800 0x80 32 64 202 0 # /dev/sda
各个域含义如下:
0x800
设备号由主副设备号组成。
设备号由主副设备号组成。
0x80
设备的BIOS 码。0x80代码系统的第一个硬盘。0x81第二个,。。。。
所有同一硬盘上的分区该值相同。
32,64,203
sector 数目(每个track)
heads 数目
cylinders 数目
0
首先,要恢复win
7的启动管理器
。进入xp并使用虚拟光驱(比如daemon
tools)加载
win
7光盘映像文件。在“开始→运行”中输入“cmd”并运行,以打开命令提示符窗口,然后输入如下命令:
h:
cd
boot
bootsect
/nt60
sys
其中“h:”为你的虚拟光驱盘符。这样,就恢复了win
7的引导管理器,xp引导管理器被删除。接下来需要进入win
7为xp建立一个启动菜单,这样就完成所有的 *** 作了。
依次点击“开始→程序→附件”,然后鼠标右键单击附件中的“命令提示符”选则“以管理员身份运行”,再键入下列命令为xp手动创建一个启动条目:
bcdedit
\create
{ntldr}
–d
"
"
bcdedit
\set
{ntldr}
device
partition=c:
bcdedit
\set
{ntldr}
path
\ntldr
bcdedit
\displayorder
{ntldr}
–addlast
全部运行后退出命令提示符。用闪存到其他windows
xp的系统中拷贝“ntldr”、“bootini”、“ntdetectcom”几个隐藏的系统文件(均在系统盘根目录),再复制到本机安装xp的驱动器c盘的根目录下。文件复制完后,右键单击“我的电脑→属性→高级系统设置”,点击“启动和故障恢复”下的“设置”在“默认 *** 作系统”的菜单中可以看到多出了一个“早期版本的windows”。在这里你就可以设置默认启动的系统,并设定选择时间了。设置完成后,重新启动电脑,你就会发现熟悉的xp启动菜单已经出现了!
解开硬盘逻辑死锁的一种有效方法
一·序言
不知道你是否曾碰到过从软盘和硬盘都启动不了计算机的情形?一般计算机的硬
盘分区表被病毒感染后,若不能启动机子,通常从软盘可以启动。但在严重的情形下 ,不但从硬
盘不能启动机子,就是从软盘也不能启动。有的恶毒的病毒就能使硬盘被死锁。笔者一次在自己
机子上玩弄硬盘锁时,就被锁住过一次。结果在硬盘下选择DOS或WIN95模 式启动机子都死机,在
软盘下用DOS启动也死机;在COMS中将硬盘类型选择None,虽然可以从软盘启动,但启动后没有硬
盘,使用软盘上的FDISK命令,想重新分区或格式化都没门。 弄得我一筹莫展。
本来,硬盘被锁住时,可以采用30以下的DOS版本启动机子,机子启动后虽然也
不认硬盘,但其不认的原因在于其管理不了现在的大硬盘,因此可以用Debug修改硬盘 分区表,
修改后可以启动。但在已进入WINDOWS的年代,30以下的DOS实难找到,即使找到,你的机子上恐
怕也因没有5寸软驱而不能使用。因此,最好的办法是编制一个程序来解决 这个问题。笔者通过
尝试和思考,找到一种比较实用的方法,可以轻松解开死锁的硬盘,当然也把自己的硬盘解开
了。下面,我将这种方法介绍出来。
二·硬盘锁住原理
硬盘锁住通常是对硬盘的分区表做手脚,因此首先应该了解硬盘的分区表。硬盘
分区表位于0柱面0磁头1区,这个扇区的前面200多个字节是主引导程序,后面从01BEH 开始的64
个字节是分区表。分区表共64字节,分为4栏,每栏16字节,用来描述一个分区。如果是用DOS的
FDISK程序分区后,最多只用两栏,第一栏描述基本的DOS分区,第二栏描述 扩展的DOS分区。
分区表一栏的结构与各字节的含义如下:
00H-标志活动字节,活动DOS分区为80H,其它为00H。
01H-本分区逻辑0扇区所在的磁头号。
02H-逻辑0扇区所在柱面中的扇区号。
03H-逻辑0扇区所在的柱面号。
04H-分区类型标志。
05H-本分区最后一个扇区的磁头号。
06H-最后一个扇区的扇区号。
07H-最后一个柱面的柱面号。
08H-硬盘上在本分区之前的扇区总数,用双字表示。
0CH-本分区的扇区总数,从逻辑0扇区计数,不含隐藏扇区,用双字表示。
在上面的介绍中给出的柱面号与扇区号虽然各占一个字节,但实际上扇区号用6位
表示,柱面号用10位表示,扇区号所在字节的最高两位实际上是柱面号的最高两位。
分区表的最后两个字节是分区表的有效标志,如果将其改变,将不能从硬盘启
动,这是一种简单的锁住硬盘的方法。解决的办法是从软盘启动,启动后硬盘仍然可以 使用。用
Debug或Noratn中的Diskedit软件将硬盘该分区表中的标志恢复,则从硬盘启动也没有问题了。锁
住硬盘的另一种方法是对分区参数做手脚,如果将分区参数全部变为0,则 启动时由于找不到分
区参数,从硬盘是没法启动,从软盘启动后也不认硬盘,如果你敲入盘符C并回车,将出现提示
Invalid
driver
specification。但所幸的是,毕竟可以启动机子,不认硬盘没关系,在A盘上用
DOS的Debug仍然可以读出硬盘0柱面0磁头1扇区的内容,修改后再写入0柱面0磁头1扇 区,重新启
动机子又没问题了。如果将分区表参数随意改为其它参数,则有可能不能用可以安装DOS的DOS系
统盘启动,按F3退出后将出现内存分配错误,不能装载DOS的命令解释 器COMMAND的提示,系统就
死机了,笔者就曾碰见过这种情形。但用一张格式化成系统盘的软盘则可以顺利启动,只要有
Debug,你仍然可以将分区表参数修改回去。可怕的事情是, 如果你不幸将分区表参数改成一个
循环链,即C盘的下一个分区指向D驱,D驱的下一个分区又指向C区,这样循环下去,DOS启动或
WIN95启动时由于无休止的读取逻辑驱动器,就只有 死机的份了。这是只要有硬盘存在,不管你
用软盘还是硬盘都没法启动机子了,由于不能启动是由于硬盘造成的,即使你将硬盘下到其它计
算机上,也没法使用,这样硬盘就彻底被 锁死了,笔者所遭遇就是此情形。不信,你只需将硬盘
0柱面0磁头1扇区的1D0H处改为1(如果你的D驱开始柱面号不够大,此处本来就为1),将1D1H处
改为0,表示D盘的开始柱面号 跟C盘一样,看看你的计算机还能不能启动,不过你在没有充分的
准备前绝不要试。
一个完整的硬盘锁程序,不过是重新改写0柱面0磁头1扇区的引导程序,并将分区
表破坏或故意制造一个循环分区表,而将真正的硬盘分区表参数和引导程序放在其它 隐藏扇区并
保护起来,如果启动时口令不对,则不能启动机子,口令对了则顺利启动。这种硬盘锁程序,情
形好的还可以用软盘启动;情形严重的就是连软盘也不能启动,硬盘真被 锁住。
三·解开硬盘锁的程序法
如果硬盘被锁死,是否真的就无法解开呢?当然不是。看看问题的症结所在,根
源在于DOS中的IOSYS文件,它包含LOADER、IO1、IO2、IO3四个模块,其中IO1中包含 有一个很
关键的程序SysInt_I,它在启动中很固执,非要去读分区表,而且不把分区表读完誓不罢休。如
果碰上分区表是循环的,它就只有死机了。这是DOS的脆弱性和不完备性。其 实这也不能怪DOS,
因为DOS为了获得硬盘使用权,就必需读分区表参数,而且DOS还约定驱动器号不能超过26,只不
过没有考虑到此等循环分区表情形。一句话,机子不能启动不过是 DOS *** 作系统造成的,如果另
写一个 *** 作系统,或许就能启动机子。当然这只是说个笑话。
明白了病因在于DOS,问题就好办了。DOS启动中不是要读硬盘分区表吗?我不让
你读分区表甚至连硬盘都不让你读,不就可以顺利启动了。的确是这样的,开硬盘锁 的程序实现
方法就是基于这个思想形成的。当然,这只有从软盘启动着手了。
看看计算机的启动过程,上电首先进行的多项硬件自测跟我们没有关系,我们关
心的只是它最开始和磁盘打交道时是干什么。如果选择从硬盘启动,则计算机和磁盘 最开始打交
道是将硬盘0柱面0磁头1扇区的内容读入内存0000:7C00处并跳到0000:7C00处执行;如果选择从
软盘启动,则计算机和磁盘最开始打交道是将A盘0磁道0磁头1扇区的内容 读入内存0000:7C00处
并跳到0000:7C00处执行,在执行过程中,计算机并不检查该扇区的内容是什么,只机械地执行
读命令,这使得许多系统型病毒得以生存。但利用这一点,恰 恰使我们的程序解锁法有了用武之
地。如果我们用DOS格式化一张可以启动机子的系统软盘,将该软盘的0磁道0磁头1扇区的内容移
到后面的空白扇区中,而重新写一段程序到该软盘 的0磁道0磁头1扇区,这样用软盘启动时首先
执行的是我们所写的程序了。在这段程序中,具备这样一些功能:在DOS启动前抢先拦截INT
13H,驻留高端内存并监视INT
13H,判断是否读硬盘,如果是读硬盘就直接返回,这样就禁止了读硬盘,也就避
免了DOS读硬盘循环分区表造成的死机;同时拦截对软盘的读取,如果读软盘的0磁道 0磁头1扇
区,就改成读真正有引导程序和磁盘参数表的扇区,免得DOS在启动中找不到软盘的磁盘参数表而
死机。完成这些任务的同时,还要读取软盘真正的引导程序并把控制权交给 它。
该方法可以称为万能的,因为它在用软盘启动中,始终不与硬盘打交道,这样不
管你硬盘用什么方法加锁了,对DOS的启动都没有影响。当然,这样启动的机子是不认 硬盘的,
但这没有关系。你可在机子启动后,用Debug调出驻留高端内存的新INT
13H程序,将其改为只有一条直接执行旧INT 13H的语句,这样在Debug下可以用
INT
13H读取硬盘0柱面0磁头1扇区的内容,如果你有备份,将分区表参数恢复后再写
入0柱面0磁头1扇区,重新启动计算机就可以了。如果实在没有备份,去掉分区表中的 循环链,
用正常DOS启动盘重启机子后至少也可以重新对硬盘分区,不至于硬盘被锁住打不开了。
四·程序及说明
1·下面是写入软盘0磁道0头1扇区的源程序keycom,程序用debug输入。
C>debug
-a100
100 CLI
101 XOR AX,AX
103 MOV DS,AX
105 MOV ES,AX
107 MOV SS,AX
109 MOV AX,7C00
10C MOV SP,AX
10E STI
10F MOV SI,AX
111 MOV DI,7E00
114 CLD
115 MOV CX,0200
118 REPNZ
119 MOVSB
11A JMP 0000:7E1F
11F MOV CX,0003
122 PUSH CX
123 MOV AX,0201;读启动软盘的引导扇区
126 MOV BX,7C00
129 MOV CX,4F01
12C MOV DX,0100
12F INT 13
131 POP CX
132 DEC CX
133 JNZ 0122
135 MOV AX,[004C];抢先获取INT 13H的位置
138 MOV [7E88],AX
13B MOV AX,[004E]
13E MOV [7E8A],AX
141 MOV AX,[0413]
144 DEC AX
145 MOV [0413],AX
148 MOV CL,06
14A SHL AX,CL
14C MOV ES,AX
14E XOR AX,AX
150 MOV DS,AX
152 MOV SI,7E6D;复制改写的INT 13H程序到高端内存
155 MOV DI,0000
158 MOV CX,0030
15B REPNZ
015C MOVSB
015D MOV AX,0000;将新INT 13H位置写入中断向量表
0160 MOV [004C],AX
0163 MOV AX,ES
0165 MOV [004E],AX
0168 JMP 0000:7C00
016D PUSHF;新INT 13H程序
016E CMP DX,0080;是否是硬盘
0172 JNZ 0176;不是硬盘则继续
0174 POPF
0175 IRET;是硬盘则直接返回
0176 CMP DX,+00;是否读软盘BOOT区?
0179 JNZ 0186
017B CMP CX,+01
017E JNZ 0186
0180 MOV CX,4F01;是则读79磁道1磁头1扇区
0183 MOV DX,0100
0186 POPF
0187 JMP 0000:0000;此处跳转去执行旧INT 13,
;旧INT 13H的位置由前面程序获得后写入。
N keycom
RCX
200
W
Q
2·程序的装载
在进行下面工作前,先用DOS格式化一张启动的系统盘,并保证没有坏扇区,最好
进行启动测试,确保其可以启动机子。由于现在机子上大多只有3寸软驱,因此选 择144M的35
寸软盘。然后用debug
keycom将程序keycom调入内存偏移地址为100H,同时在400H处写入一段装载程
序。即:
C>debug keycom
-a400
400 MOV CX,0003
403 PUSH CX
404 MOV AX,0201;将A盘引导程序读入内存1000H处
407 MOV BX,1000;为确保成功,首次采用重复读3次
40A MOV CX,0001
40D MOV DX,0000
410 INT 13
412 POP CX
413 DEC CX
414 JNZ 0403
416 MOV AX,0301;将已读入内存的软盘引导程序写入软盘
419 MOV BX,1000;最后一个磁道的首扇区
41C MOV CX,4F01
41F MOV DX,0100
422 INT 13
424 MOV AX,0301;将keycom程序写入软盘0磁道0磁头1扇区
427 MOV BX,0100
42A MOV CX,0001
42D MOV DX,0000
430 INT 13
432 INT 3
为保证万无一失,最好将软盘这两个扇区的内容重新读出来看一看,以保证写成
功了。做好这一切,保险的还是进行一次测试,即用该软盘启动一次机子,看能否成 功,若成功
启动,你就可以用循环分区表法锁住硬盘,看从正常DOS下能否启动,然后再用此软盘启动机子试
试,看看功效如何?
从该软盘启动后,不认硬盘,并且在高端内存驻留了新INT
13H程序,该段程序实际上是keycom中从16D到187部分。由于有此段程序存在,
在debug下也无法读硬盘,也就没法恢复硬盘分区表,因此机子启动后首先应修改这段 程序。现
在的机子基本内存通常都为640K,这样这段程序就位于内存中9FC0:0000处,在debug下,用
U9FC0:0显示这段程序,可以看到位于9FC0:001A处是一条跳转指令,该跳转指 令即转去执行最
原始的INT
13H。由于BIOS版本不一样,跳转指令指向的位置可能不一样,如笔者机子上是一
条JMP
F000:A5D4语句。这时在在debug下编写这样一语句:a9FC0:0 JMP
F000:A5D4。这样,对硬盘的禁写与禁读都不再起作用了,在debug下用INT
13H的2号子功能可以读出硬盘分区表,修改恢复后再用3号子功能将数据写回分区
表。退出debug,重新用正常DOS启动计算机,就可以了。
附带提一下,在正常DOS下,该软盘由于没有BOOT区,也就没有磁盘参数表,从而
不能使用,用DIR A:命令会出现General
failure reading drive A提示。不要理睬它,这并不影响它作特殊启动盘。
五·建议
为更好的保护你的硬盘,笔者建议你最好将你的硬盘分区表信息备份起来。备份
有两种方式,一种是以文件形式将硬盘每个逻辑盘的分区信息存储起来;另一种是将 分区信息备
份在硬盘隐藏扇区里。比如可以将0柱面0磁头1扇区备份在0柱面0磁头3扇区,将D盘开始柱面号0
磁头1扇区备份在该柱面0磁头3扇区,其它逻辑盘也如此。这种方法简单、 方便,也很可靠。用
NORTAN中的DISKEDI很容易 *** 作和实现。有了备份分区表信息,就不怕破坏分区表的病毒了;再加
上我给你的程序,即使有人真锁住了你的硬盘,你也可以轻而易 举解开了。
以上就是关于硬盘分区引导错误全部的内容,包括:硬盘分区引导错误、win7如何添加系统引导..、电脑硬盘被锁了,怎么解决。!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)