📄 cipancaozuoziliao.txt
字号:
0E74:7C19 A4 MOVSB ;移至0:061B-0:07FF
0E74:7C1A CB RETF ;转移到0:061B,继续执行程序
2、顺序查找四个硬盘分区表,寻找自举标志
0E74:061B BEBE07 MOV SI,07BE ;SI指向硬盘分区表1的自举标志
0E74:061E B104 MOV CL,04 ;查找四个分区
0E74:0620 382C CMP [SI],CH
0E74:0622 7C09 JL 062D ;如果[SI]的第7位为1,即为自
;举标志,转062DH
0E74:0624 7515 JNZ 063B ;如果[SI]不为0,出错,转063BH
0E74:0626 83C610 ADD SI,+10 ;依次检验四个分区表,直至找到
0E74:0629 E2F5 LOOP 0620 ;自举标志
0E74:062B CD18 INT 18 ;找不到自举标志,进入BOOT异
;常处理程序。
0E74:062D 8B14 MOV DX,[SI] ;保存自举驱动器号于DL中
0E74:062F 8BEE MOV BP,SI ;保存自举分区地址指针于BP
0E74:0631 83C610 ADD SI,+10 ;继续检验自举分区后的分区
0E74:0634 49 DEC CX ;自举标志,直至四个分区都
0E74:0635 7416 JZ 064D ;检查完
0E74:0637 382C CMP [SI],CH ;若其余的自举标志不为0,出错
0E74:0639 74F6 JZ 0631
3、出错,写屏幕程序段
0E74:063B BE1007 MOV SI,0710 ;错误信息输出,死循环
0E74:063E 4E DEC SI
0E74:063F AC LODSB
0E74:0640 3C00 CMP AL,00
0E74:0642 74FA JZ 063E
0E74:0644 BB0700 MOV BX,0007
0E74:0647 B40E MOV AH,0E
0E74:0649 CD10 INT 10
0E74:064B EBF2 JMP 063F
硬盘主引导记录程序的功能是读出自举分区的BOOT程序,并把控制转移到分区BOOT程序。整个程序流程如下:
1 将本来读入到0:7C00H处的硬盘主引导记录程序移至0:61BH处;
⑵ 顺序读入四个分区表的自举标志,以找出自举分区,若找不到,转而执行INT18H的BOOT异常执行中断程序;
⑶ 找到自举分区后,检测该分区的系统标志,若为32位FAT表或16位FAT表但支持13号中断的扩展功能,就转到执行13号中断的41号功能调用进行安装检验,检验成功,就执行42号扩展读功能调用把BOOT区程序读入到内存0:7C00H处,成功,跳到第⑸步,若读失败或系统标志为其它,就调用13号中断的读扇区功能调用把BOOT读到0:7C00H;
⑷ 用13号中断的读扇区功能时,用两种方式分别进行5次试读。第一种方式是直接从自举分区的头扇区读入BOOT程序,若读成功,但结束标志不是55AA,则改用第二种方式,又如果用第一种方式试读五次均不成功,就改用第二种方式。若两种方式试读均失败,就转到出错处理程序; ⑸ 读入BOOT区程序成功,转至0:7C00H处执行BOOT程序。
NT下对I/O地址的访问
Windows NT 操作系统设置的进程模式会使运行在其中的应用程序访问I/O地址的指令引起保护性的失败。这使得应用程序需要附以一个设备驱动程序进行I/O操作。设备驱动程序运行在内核模式,这使得在这种状态的中运行的进程可以执行I/O操作。
---- Windows 95/98 是仅为 Intel 类型机器设计的,没有额外复杂的I/O需求,而Windows NT 被设计成可以在不同机器机构上进行移植。这使得Windows NT 的系统模式要求驱动程序的编写者要考虑一台机器可能有多种类型的总线,这可能需要在总线之间传递地址。这种模式还要区别I/O空间和内存空间。在多总线的机器中每一总线可以既支持内存又支持I/O循环。
---- 根据定义,I/O寄存器或者端口访问是通过I/O循环实现的。然而,在一些系统中外部总线的I/O空间可以被映像到进程内存空间。硬件抽象层(Hardware Abstract Layer)决定这些。要访问I/O寄存器,驱动程序编写者必须知道寄存器在那一总线,它的I/O空间地址在那条总线。一条总线是由其接口类行 (如 ISA 、PCI 等)和编号(从零开始)决定的。
---- 下面是一个假象设备访问I/O的例子,接口类型:ISA 编号 0 地址 0xE700。设备描述如下: Offset Size Usage 0 1 Command register 1 1 Status register 2 2 Word data register 4 4 Dword data register
---- 用开发NT 设备驱动程序的工具包DriverDorks 可以用以下 步骤访问设备:
---- 建立一个KIoRange的对象映像设备寄存器。
KIoRange DeviceIos; Status = DevceIos.Initialize(
Isa, // 总线类型
0, // 总线号
0xE700, // 总线地址
8, // 设备数
TRUE // 映像到系统空间(如果端口是内存映像的)
);
if(NT_SUCCESS(status)) //建立成功
---- 可以用KIoRange 的成员函数访问寄存器:
//寄存器偏移量
#define COMMAND 0
#define STATUS 1
#define WDATA 2
#define DDATA 3
//读状态寄存器
UCHAR DeviceStatus = DeviceIos.inb(STATUS);
//写命令寄存器
DeviceIos.outb(COMMAND,CMD_RESET);
//写20个字到端口
DeviceIos.outw(WDATA,buffer,20);
---- 另外也可以建立KIoRegister 的对象来访问设备:
KIoRegister CommandReg = DeviceIos[COMMAND];
KIoRegister StatusReg = DeviceIos[STATUS];
CommandRge=(UCHAR)RESET; //写 RESET命令
UCHAR status=StatusReg; //读状态寄存器
如果在同一函数中频繁访问寄存器用KioRegiser 比用KIoRange 的成员函数的性能好一些。无论如何,数据类型必须正确(UCHAR,USHORT,ULONG),这些决定了到总线上数据的实际大小.
硬盘的 dos 管理结构
1. 磁道,扇区,柱面和磁头数
硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等。每个盘片有两面,都可记录信息。盘片被分成许多扇形的区域,每个区域叫一个扇区,每个扇区可存储 128 × 2 的 n 次方( n = 0.1.2 .3 )字节信息。在 dos 中每扇区是 128 × 2 的 2 次方= 512 字节,盘片表面上以盘片中心为圆心,不同半径的同心圆称为磁道。硬盘中,不同盘片相同半径 的磁道所组成的圆柱称为柱面。磁道与柱面都是表示不同半径的圆,在许多场合,磁道和柱面可以互换使用,我们知道,每个磁 盘有两个面,每个面都有一个磁头,习惯用磁头号来区分。扇区,磁道(或柱面)和磁头数构成了硬盘结构的基本参数,帮这些 参数可以得到硬盘的容量,基计算公式为:
存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
要点:( 1 )硬盘有数个盘片,每盘片两个面,每个面一个磁头
( 2 )盘片被划分为多个扇形区域即扇区
( 3 )同一盘片不同半径的同心圆为磁道
( 4 )不同盘片相同半径构成的圆柱面即柱面
( 5 )公式: 存储容量=磁头数×磁道(柱面)数×每道扇区数×每扇区字节数
( 6 )信息记录可表示为:××磁道(柱面),××磁头,××扇区
2. 簇
“簇”是 dos 进行分配的最小单位。当创建一个很小的文件时,如是一个字节,则它在磁盘上并不是只占一个字节的空间, 而是占有整个一簇。 dos 视不同的存储介质(如软盘,硬盘),不同容量的硬盘,簇的大小也不一样。簇的大小可在称为磁盘 参数块( bpb )中获取。簇的概念仅适用于数据区。
本点:( 1 )“簇”是 dos 进行分配的最小单位。
( 2 )不同的存储介质,不同容量的硬盘,不同的 dos 版本,簇的大小也不一样。
( 3 )簇的概念仅适用于数据区。
3. 扇区编号定义:绝对扇区与 dos 扇区
由前面介绍可知,我们可以用柱面 / 磁头 / 扇区来唯一定位磁盘上每一个区域,或是说柱面 / 磁头 / 扇区与磁盘上每一个扇区有 一一对应关系,通常 dos 将“柱面 / 磁头 / 扇区”这样表示法称为“绝对扇区”表示法。但 dos 不能直接使用绝对扇区进行磁盘上的 信息管理,而是用所谓“相对扇区”或“ dos 扇区”。“相对扇区”只是一个数字,如柱面 140 ,磁头 3 ,扇区 4 对应的相对扇区号 为 2757 。该数字与绝对扇区“柱面 / 磁头 / 扇区”具有一一对应关系。当使用相对扇区编号时, dos 是从柱面 0 ,磁头 1 ,扇区 1 开始 (注:柱面 0 ,磁头 0 ,扇区 1 没有 dos 扇区编号, dos 下不能访问,只能调用 bios 访问),第一个 dos 扇区编号为 0 ,该磁道上剩余 的扇区编号为 1 到 16 (设每磁道 17 个扇区),然后是磁头号为 2 ,柱面为 0 的 17 个扇区,形成的 dos 扇区号从 17 到 33 。直到该柱面的 所有磁头。然后再移到柱面 1 ,磁头 1 ,扇区 1 继续进行 dos 扇区的编号,即按扇区号,磁头号,柱面号(磁道号)增长的顺序连续 地分配 dos 扇区号。
公式:记 dh --第一个 dos 扇区的磁头号
dc --第一个 dos 扇区的柱面号
ds --第一个 dos 扇区的扇区号
ns --每磁道扇区数
nh --磁盘总的磁头数
则某扇区(柱面 c ,磁头 h ,扇区 s )的相对扇区号 rs 为:
rs = nh × ns ×( c - dc )+ ns ×( h - dh )+( s - ds )
若已知 rs , dc , dh , ds , ns 和 nh 则
s =( rs mod ns )+ ds
h =(( rs div ns ) mod nh )+ dh
c =(( rs div ns ) div nh )+ dc
要点:( 1 )以柱面 / 磁头 / 扇区表示的为绝对扇区又称物理磁盘地址
( 2 )单一数字表示的为相对扇区或 dos 扇区,又称逻辑扇区号
( 3 )相对扇区与绝对扇区的转换公式
4.dos 磁盘区域的划分
格式化好的硬盘,整个磁盘按所记录数据的作用不同可分为主引导记录( mbr:main boot record ), dos 引导记录( dbros boot record ),文件分配表( fat:file assign table ),根目录( bd:boot directory )和数据区。前 5 个重要信息在磁盘的外 磁道上,原因是外圈周长总大于内圈周长,也即外圈存储密度要小些,可伤心性高些。
要点:( 1 )整个硬盘可分为 mbr , dbr , fat , bd 和数据区。
( 2 ) mbr , dbr , fat ,和 bd 位于磁盘外道。
5.mbr
mbr 位于硬盘第一个物理扇区(绝对扇区)柱面 0 ,磁头 0 ,扇区 1 处。由于 dos 是由柱面 0 ,磁头 1 ,扇区 1 开始,故 mbr 不属于 dos 扇区, dos 不能直接访问。 mbr 中包含硬盘的主引导程序和硬盘分区表。分区表有 4 个分区记录区。记录区就是记录有关分区信
息的一张表。它从主引导记录偏移地址 01beh 处连续存放,每个分区记录区占 16 个字节。
分区表的格式 分区表项的偏移 意义 占用字节数
00 引导指示符 1b
01 分区引导记录的磁头号 1b
02 分区引导记录的扇区和柱面号 2b
04 系统指示符 1b
05 分区结束磁头号 1b
06 分区结束扇区和柱面号 2b
08 分区前面的扇区数 4b
0c 分区中总的扇区数 4b
4 个分区中只能有 1 个活跃分区,即 c 盘。标志符是 80h 在分区表的第一个字节处。若是 00h 则表示非活跃分区。例如:
80 01 01 00 0b fe 3f 81 3f 00 00 00 c 3 dd 1f 00
00 00 01 82 05 fe bf 0c 02 de 1f 00 0e 90 61 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
要点:( 1 ) mbr 位于硬盘第一个物理扇区柱面 0 ,磁头 0 ,扇区 1 处。不属于 dos 扇区,
( 2 )主引导记录分为硬盘的主引导程序和硬盘分区表。
6.dbr
dbr 位于柱面 0 ,磁头 1 ,扇区 1 ,即逻辑扇区 0 。 dbr 分为两部分: dos 引导程序和 bpb ( bios 参数块)。其中 dos 引导程序完成 dos 系统文件( io.sys , msdos.sys )的定位与装载,而 bpb 用来描述本 dos 分区的磁盘信息, bpb 位于 dbr 偏移 0bh 处,共 13 字节。 它包含逻辑格式化时使用的参数,可供 dos 计算磁盘上的文件分配表,目录区和数据区的起始地址, bpb 之后三个字提供物理格 式化(低格)时采用的一些参数。引导程序或设备驱动程序根据这些信息将磁盘逻辑地址( dos 扇区号)转换成物理地址(绝对 扇区号)。
bpb 格式 序号 偏移地址 意义
1 03h - 0ah oem 号
2 0bh - 0ch 每扇区字节数
3 0dh 每簇扇区数
4 0eh - 0fh 保留扇区数
5 10h fat 备份数
6 11h - 12h 根目录项数
7 13h - 14h 磁盘总扇区数
8 15h 描述介质
9 16h - 17h 每 fat 扇区数
10 18h - 19h 每磁道扇区数
11 1ah - 1bh 磁头数
12 1ch - 1fh 特殊隐含扇区数
13 20h - 23h 总扇区数
14 24h - 25h 物理驱动器数
15 26h 扩展引导签证
16 27h - 2ah 卷系列号
17 2bh - 35h 卷标号
18 36h - 3dh 文件系统号
dos 引导记录公式:
文件分配表≡保留扇区数
根目录≡保留扇区数+ fat 的个数×每个 fat 的扇区数
数据区≡根目录逻辑扇区号+( 32 ×根目录中目录项数+(每扇区字节数- 1 )) div 每扇区字节数
绝对扇区号≡逻辑扇区号+隐含扇区数
扇区号≡(绝对扇区号 mod 每磁道扇区数)+ 1
磁头号≡(绝对扇区号 div 每磁道扇区数) mod 磁头数
磁道号≡(绝对扇区号 div 每磁道扇区数) div 磁头数
要点:( 1 ) dbr 位于柱面 0 ,磁头 1 ,扇区 1 ,其逻辑扇区号为 0
( 2 ) dbr 包含 dos 引导程序和 bpb 。
( 3 ) bpb 十分重要,由此可算出逻辑地址与物理地址。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -