📄 ntfs文件系统启动扇区代码(简化版).shtm.htm
字号:
选择自 <a id="ArticleTitle1_ArticleTitle1_AuthorLink" href="http://dev.csdn.net/user/jackjoy">jackjoy</a> 的 Blog
</td>
</tr>
<tr>
<td align="center" bgcolor="#003399" height="16"><font color="#ffffff">关键字</font></td>
<td width="500">
<span id="ArticleTitle1_ArticleTitle1_lblKeywords">NTFS文件系统启动扇区代码(简化版)</span></td>
</tr>
<tr>
<td align="center" bgcolor="#003399" height="16"><font color="#ffffff">出处</font></td>
<td>
<span id="ArticleTitle1_ArticleTitle1_lblSource"></span></td>
</tr>
</tbody></table>
</td>
</tr>
<tr>
<td width="10"></td>
<td><span id="ArticleContent1_ArticleContent1_lblContent">;====================================================================<br>; <br>; FlyingDragon OS Boot Sector FOR NTFS File System<br>;<br>; Author: Jack<br>; V0.01 2005-9-1 20:58<br>; <br>; Build : nasm -f bin NTFS.ASM -oNTFS.BIN<br>; <br>;====================================================================================<br>; <br>; BIOS在启动中的角色:<br>; (1) BIOS装载引导驱动器上的0扇区(CHS = 0:0:1)内容到内存线性地址7C00H处;<br>; (2) BIOS检查所装载的扇区是否有启动标记(510、511字节分别为55H和AAH); <br>; (3) CPU寄存器DL被设置为分配给引导驱动器的驱动器号,00H为软驱A,80H为硬盘C;<br>; (4) BIOS跳转到其装载的扇区中的代码(即7C00H处),将控制权转交给引导代码。<br>; <br>; 引导代码应该初始化以下寄存器:<br>; (1) DS:某些BIOS设置其值为0,某些设置其为40H,它应该被设置为(7C00H-BOOT_ORG)/16;<br>; 其中,BOOT_ORG为引导代码的ORG值,该值通常为7C00H(这意味着DS应设置为0);<br>; (2) SS和SP(堆栈):这两个寄存器的初始值依赖于BIOS;<br>; (3) CS个IP(通过JMP指令):大多数的BIOS进入启动代码的地址为0000:7C00H,但是某些<br>; BIOS却跳转到07C0:0000H。由于短跳转和条件跳转是IP相关的,因此如果没有使用<br>; 远跳转或者绝对跳转,则不需要重置CS和IP;然而,DS仍旧必须是正确的值。<br>; <br>;=====================================================================================<br>; <br>; 常规内存( 0000 0000H - 000F FFFFH,即0-1MB )在系统启动时的使用情况<br>; <br>;=====================================================================================<br>; <br>; ---------------------------------<br>;
| 0000 0000 -
0000 03FF |
1024B IDT read only<br>; |-------------------------------|<br>;
| 0000 0400 -
0000 04FF | 256B
BIOS Data Area , read only <br>; |-------------------------------|<br>;
| 0000 0500 -
0000 7BFF |*
30464B Free Memory , read/write
(29.75KB) <br>; |------------------------------ |<br>;
| 0000 7C00 -
0000 7DFF |
512B Boot Sector , read/write <br>; |------------------------------ |<br>;
| 0000 7E00 -
0000 7FFF |
512B Free Memory , read /write<br>; |------------------------------ |<br>;
| 0000 8000 -
0009 FBFF |
607KB Free Memory , read / write( 32K - 639KB )
<br>; |------------------------------ |<br>;
| 0009 FC00 -
0009 FFFF |**
1KB EBDA extended BIOS data
area <br>; |------------------------------ |<br>;
| 000A 0000 -
000A FFFF |
64KB Video Memory<br>; |------------------------------ |<br>;
| 000B 0000 -
000B 7FFF |
32KB Mono Video Text Memory <br>; |------------------------------ |<br>;
| 000B 8000 -
000B FFFF |
32KB Color Video Text Memory<br>; |------------------------------ |<br>;
| 000C 0000 -
000C 7FFF |
32KB Video BIOS , read only<br>; |------------------------------ |<br>;
| 000C 8000 -
000E FFFF |
160KB Adapter ROM,read only<br>; |------------------------------ |<br>;
| 000F 0000 -
000F FFFF |
64KB System BIOS, read only<br>; |------------------------------ |<br>;
| 0010 0000 -
0010 FFEF |***64KB-16
High Memory Area,read/write ( 1MB开始处 )<br>; |------------------------------ |<br>;
| 0010 FFF0 -
| Free
Extended Memory, read/write <br>; |------------------------------ |<br>; <br>; * 空闲内存实际并非从 0000 0500处开始,BIOS数据区实际上会利用从0000 0500开始的少量字节,例如<br>; 00000500处保存的是打印屏幕状态,当按下打印屏幕(PrintScreen)键时,低级键盘BIOS初始化打印屏<br>; 幕功能,键盘BIOS触发中断5打印屏幕处理程序。正因为BIOS数据区越过了256B的界限,因此DOS实际<br>; 上是从0000 0522开始装载的。为保险起见,可从0000 0600开始利用空闲内存。(1.5K - 31K 29.5KB)<br>; <br>; ** 有些机器上没有这段BIOS扩展数据区。<br>; <br>; *** 如果没有使用扩展高端内存区域程序(例如Emm386.exe),则从0010 0000 (1MB )开始的内存都是可用的。<br>; <br>; <br>;=====================================================================================<br>; <br><br>BITS 16 ; 生成16位代码而不是32位代码<br>SECTION .TEXT ; 代码段<br>ORG 0800H ; 指定程序被装入内存的起始位置<br><br>;====================================================================<br>; <br>; NTFS启动扇区代码使用内存的情况:<br>; 0000 0000 - 0000 07FF 2K IDT和BIOS数据<br>; 0000 0800 - 0000 2800 8K 保留给NTFS启动扇区代码,最多8K<br>;<br>;
****:**** - 0000 7FFF
22K 堆栈区域 <br>; 0000:8000 - ****:**** 480K 装载第二阶段程序FDOSLDR.BIN及数据的空间<br>; 0008 0000 - 0008 FFFF 64K 用于文件系统的缓冲区 <br>; 0009 0000 - 0009 FFFF 64K 用于读取数据簇的缓冲区<br>;<br>;====================================================================<br>; <br>; 宏和常量定义<br>; <br>;====================================================================<br>?
EQU 0 ;
NASM不支持DW ?这样的语法,可以使用这样的定义<br>
;
模拟,以使代码的可读性更强<br>STACK_ADDR
EQU 7FD0H
; 堆栈栈顶(注意:堆栈大小约为20K左右)<br>DATA_BUF_SEG EQU 9000H ; 用于读取根目录或文件内容的缓冲区(64K) 段地址<br>DATA_BUF_OFF EQU 0000H ; 数据缓冲区偏移<br>DATA_BUF_ADDR EQU 90000H ; 数据缓冲区线性地址<br>FILE_BUF_SEG EQU 8000H ; 文件记录缓冲区段地址<br>FILE_BUF_OFF EQU 00000H ; 文件记录缓冲区偏移<br>BOOT_SEC_NUM
EQU 16
; NTFS启动扇区代码的总长度(16个扇区=8K)<br>BOOT_SEC_ADDR EQU 0800H ; NTFS启动扇区的重定位地址<br><br><br>; 第二阶段装载程序FDOSLDR.BIN<br>OSLOADER_ADDR EQU 8000H ; FDOSLDR.BIN放入内存中的起始位置<br>OSLOADER_SEG EQU 0800H ; 起始段地址<br><br><br>;====================================================================<br>; 用堆栈保存若干中间变量( SS = 0 BP = 7C00H )<br>;====================================================================<br>DISK_EXT_SUPPORT
EQU
1 ; BYTE
磁盘是否支持扩展BIOS <br>DRIVE_NUMBER
EQU
2 ;
BYTE 用于保存启动的磁盘驱动器号<br>BYTES_PER_FILE_RECORD
EQU 8
; DWORD 用于保存NTFS每个文件记录的尺寸<br>BYTES_PER_INDEX_BLOCK
EQU 12
; DWORD 用于保存默认的索引分配的尺寸<br>BYTES_PER_CLUSTER
EQU
16 ; DWORD 用于保存每簇字节数字节数<br><br><br>;==================================================================== <br>; 扩展磁盘服务所使用的地址包<br>;====================================================================<br>DAP_SECTOR_HIGH
EQU
24 ;
起始扇区号的高32位 ( 每次调用需要重置 ) DWORD<br>DAP_SECTOR_LOW
EQU
28 ;
起始扇区号的低32位 ( 每次调用需要重置 ) DWORD<br>DAP_BUFFER_SEG
EQU
30 ;
缓冲区段地址 ( 每次调用需要重置 )
WORD<br>DAP_BUFFER_OFF
EQU
32 ; 缓冲区偏移
( 每次调用需要重置 )
WORD <br>DAP_RESERVED2
EQU
33 ; 保留字节<br>DAP_READ_SECTORS
EQU
34 ; 要处理的扇区数(1 - 127 )<br>DAP_RESERVED1
EQU
35 ; 保留字节<br>DAP_PACKET_SIZE
EQU
36 ;
包的大小为16字节<br><br>;====================================================================<br>; NTFS系统常量<br>;====================================================================<br><br>; 记录类型<br>NTFS_RECORD_TYPE_NONE
EQU 0
; 未知的类型<br>NTFS_RECORD_TYPE_FILE EQU 0x454C4946 ; 文件记录($MFT)<br>NTFS_RECORD_TYPE_INDX
EQU 0x58444E49
; 索引记录(Index Allocation)<br>NTFS_RECORD_TYPE_HOLE EQU 0x454C4F48 ; 空洞记录<br>NTFS_RECORD_TYPE_RSTR
EQU 0x52545352
; 重启记录($LogFile Restart Page )<br>NTFS_RECORD_TYPE_RCRD
EQU 0x44524352
; 日志记录($LogFile Log Record Page)<br>NTFS_RECORD_TYPE_CHKD
EQU 0x424B4843
; 检查记录($LogFile CHKDSK)<br>NTFS_RECORD_TYPE_BAAD
EQU 0x44414142
; 多扇区数据写入错误(通常是由于系统断电引起)<br>NTFS_RECORD_TYPE_FREE EQU 0xFFFFFFFF ; 记录是空闲的,在使用前必须初始化<br><br>;=============================================================<br>; NTFS系统文件记录编号<br>;=============================================================<br>NTFS_SYSTEM_FILE_MFT
EQU
0 ; $MFT (
Master File Table )<br>NTFS_SYSTEM_FILE_MFTMIRR
EQU 1 ;
$MFTMirr ( 至少前四个MFT记录的拷贝)<br>NTFS_SYSTEM_FILE_LOGFILE
EQU 2 ;
$LogFile ( 事务日志) <br>NTFS_SYSTEM_FILE_VOLUME
EQU
3 ; $Volume ( 卷名及卷信息以及文件系统版本 )<br>NTFS_SYSTEM_FILE_ATTRDEF
EQU 4 ;
$AttrDef ( 所有支持的属性定义 )<br>NTFS_SYSTEM_FILE_ROOT
EQU
5 ; . (
根目录 )<br>NTFS_SYSTEM_FILE_BITMAP
EQU 6 ;
$Bitmap ( 卷的数据簇分配位图 )<br>NTFS_SYSTEM_FILE_BOOT
EQU
7 ; $Boot ( 卷的引导记录,指向引导扇区 )<br>NTFS_SYSTEM_FILE_BADCLUS
EQU 8 ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -