?? ntfs文件系統(tǒng)啟動(dòng)扇區(qū)代碼(簡化版).shtm.htm
字號(hào):
選擇自 <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">關(guān)鍵字</font></td>
<td width="500">
<span id="ArticleTitle1_ArticleTitle1_lblKeywords">NTFS文件系統(tǒng)啟動(dòng)扇區(qū)代碼(簡化版)</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在啟動(dòng)中的角色:<br>; (1) BIOS裝載引導(dǎo)驅(qū)動(dòng)器上的0扇區(qū)(CHS = 0:0:1)內(nèi)容到內(nèi)存線性地址7C00H處;<br>; (2) BIOS檢查所裝載的扇區(qū)是否有啟動(dòng)標(biāo)記(510、511字節(jié)分別為55H和AAH); <br>; (3) CPU寄存器DL被設(shè)置為分配給引導(dǎo)驅(qū)動(dòng)器的驅(qū)動(dòng)器號(hào),00H為軟驅(qū)A,80H為硬盤C;<br>; (4) BIOS跳轉(zhuǎn)到其裝載的扇區(qū)中的代碼(即7C00H處),將控制權(quán)轉(zhuǎn)交給引導(dǎo)代碼。<br>; <br>; 引導(dǎo)代碼應(yīng)該初始化以下寄存器:<br>; (1) DS:某些BIOS設(shè)置其值為0,某些設(shè)置其為40H,它應(yīng)該被設(shè)置為(7C00H-BOOT_ORG)/16;<br>; 其中,BOOT_ORG為引導(dǎo)代碼的ORG值,該值通常為7C00H(這意味著DS應(yīng)設(shè)置為0);<br>; (2) SS和SP(堆棧):這兩個(gè)寄存器的初始值依賴于BIOS;<br>; (3) CS個(gè)IP(通過JMP指令):大多數(shù)的BIOS進(jìn)入啟動(dòng)代碼的地址為0000:7C00H,但是某些<br>; BIOS卻跳轉(zhuǎn)到07C0:0000H。由于短跳轉(zhuǎn)和條件跳轉(zhuǎn)是IP相關(guān)的,因此如果沒有使用<br>; 遠(yuǎn)跳轉(zhuǎn)或者絕對跳轉(zhuǎn),則不需要重置CS和IP;然而,DS仍舊必須是正確的值。<br>; <br>;=====================================================================================<br>; <br>; 常規(guī)內(nèi)存( 0000 0000H - 000F FFFFH,即0-1MB )在系統(tǒng)啟動(dòng)時(shí)的使用情況<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>; * 空閑內(nèi)存實(shí)際并非從 0000 0500處開始,BIOS數(shù)據(jù)區(qū)實(shí)際上會(huì)利用從0000 0500開始的少量字節(jié),例如<br>; 00000500處保存的是打印屏幕狀態(tài),當(dāng)按下打印屏幕(PrintScreen)鍵時(shí),低級鍵盤BIOS初始化打印屏<br>; 幕功能,鍵盤BIOS觸發(fā)中斷5打印屏幕處理程序。正因?yàn)锽IOS數(shù)據(jù)區(qū)越過了256B的界限,因此DOS實(shí)際<br>; 上是從0000 0522開始裝載的。為保險(xiǎn)起見,可從0000 0600開始利用空閑內(nèi)存。(1.5K - 31K 29.5KB)<br>; <br>; ** 有些機(jī)器上沒有這段BIOS擴(kuò)展數(shù)據(jù)區(qū)。<br>; <br>; *** 如果沒有使用擴(kuò)展高端內(nèi)存區(qū)域程序(例如Emm386.exe),則從0010 0000 (1MB )開始的內(nèi)存都是可用的。<br>; <br>; <br>;=====================================================================================<br>; <br><br>BITS 16 ; 生成16位代碼而不是32位代碼<br>SECTION .TEXT ; 代碼段<br>ORG 0800H ; 指定程序被裝入內(nèi)存的起始位置<br><br>;====================================================================<br>; <br>; NTFS啟動(dòng)扇區(qū)代碼使用內(nèi)存的情況:<br>; 0000 0000 - 0000 07FF 2K IDT和BIOS數(shù)據(jù)<br>; 0000 0800 - 0000 2800 8K 保留給NTFS啟動(dòng)扇區(qū)代碼,最多8K<br>;<br>;
****:**** - 0000 7FFF
22K 堆棧區(qū)域 <br>; 0000:8000 - ****:**** 480K 裝載第二階段程序FDOSLDR.BIN及數(shù)據(jù)的空間<br>; 0008 0000 - 0008 FFFF 64K 用于文件系統(tǒng)的緩沖區(qū) <br>; 0009 0000 - 0009 FFFF 64K 用于讀取數(shù)據(jù)簇的緩沖區(qū)<br>;<br>;====================================================================<br>; <br>; 宏和常量定義<br>; <br>;====================================================================<br>?
EQU 0 ;
NASM不支持DW ?這樣的語法,可以使用這樣的定義<br>
;
模擬,以使代碼的可讀性更強(qiáng)<br>STACK_ADDR
EQU 7FD0H
; 堆棧棧頂(注意:堆棧大小約為20K左右)<br>DATA_BUF_SEG EQU 9000H ; 用于讀取根目錄或文件內(nèi)容的緩沖區(qū)(64K) 段地址<br>DATA_BUF_OFF EQU 0000H ; 數(shù)據(jù)緩沖區(qū)偏移<br>DATA_BUF_ADDR EQU 90000H ; 數(shù)據(jù)緩沖區(qū)線性地址<br>FILE_BUF_SEG EQU 8000H ; 文件記錄緩沖區(qū)段地址<br>FILE_BUF_OFF EQU 00000H ; 文件記錄緩沖區(qū)偏移<br>BOOT_SEC_NUM
EQU 16
; NTFS啟動(dòng)扇區(qū)代碼的總長度(16個(gè)扇區(qū)=8K)<br>BOOT_SEC_ADDR EQU 0800H ; NTFS啟動(dòng)扇區(qū)的重定位地址<br><br><br>; 第二階段裝載程序FDOSLDR.BIN<br>OSLOADER_ADDR EQU 8000H ; FDOSLDR.BIN放入內(nèi)存中的起始位置<br>OSLOADER_SEG EQU 0800H ; 起始段地址<br><br><br>;====================================================================<br>; 用堆棧保存若干中間變量( SS = 0 BP = 7C00H )<br>;====================================================================<br>DISK_EXT_SUPPORT
EQU
1 ; BYTE
磁盤是否支持?jǐn)U展BIOS <br>DRIVE_NUMBER
EQU
2 ;
BYTE 用于保存啟動(dòng)的磁盤驅(qū)動(dòng)器號(hào)<br>BYTES_PER_FILE_RECORD
EQU 8
; DWORD 用于保存NTFS每個(gè)文件記錄的尺寸<br>BYTES_PER_INDEX_BLOCK
EQU 12
; DWORD 用于保存默認(rèn)的索引分配的尺寸<br>BYTES_PER_CLUSTER
EQU
16 ; DWORD 用于保存每簇字節(jié)數(shù)字節(jié)數(shù)<br><br><br>;==================================================================== <br>; 擴(kuò)展磁盤服務(wù)所使用的地址包<br>;====================================================================<br>DAP_SECTOR_HIGH
EQU
24 ;
起始扇區(qū)號(hào)的高32位 ( 每次調(diào)用需要重置 ) DWORD<br>DAP_SECTOR_LOW
EQU
28 ;
起始扇區(qū)號(hào)的低32位 ( 每次調(diào)用需要重置 ) DWORD<br>DAP_BUFFER_SEG
EQU
30 ;
緩沖區(qū)段地址 ( 每次調(diào)用需要重置 )
WORD<br>DAP_BUFFER_OFF
EQU
32 ; 緩沖區(qū)偏移
( 每次調(diào)用需要重置 )
WORD <br>DAP_RESERVED2
EQU
33 ; 保留字節(jié)<br>DAP_READ_SECTORS
EQU
34 ; 要處理的扇區(qū)數(shù)(1 - 127 )<br>DAP_RESERVED1
EQU
35 ; 保留字節(jié)<br>DAP_PACKET_SIZE
EQU
36 ;
包的大小為16字節(jié)<br><br>;====================================================================<br>; NTFS系統(tǒng)常量<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
; 多扇區(qū)數(shù)據(jù)寫入錯(cuò)誤(通常是由于系統(tǒng)斷電引起)<br>NTFS_RECORD_TYPE_FREE EQU 0xFFFFFFFF ; 記錄是空閑的,在使用前必須初始化<br><br>;=============================================================<br>; NTFS系統(tǒng)文件記錄編號(hào)<br>;=============================================================<br>NTFS_SYSTEM_FILE_MFT
EQU
0 ; $MFT (
Master File Table )<br>NTFS_SYSTEM_FILE_MFTMIRR
EQU 1 ;
$MFTMirr ( 至少前四個(gè)MFT記錄的拷貝)<br>NTFS_SYSTEM_FILE_LOGFILE
EQU 2 ;
$LogFile ( 事務(wù)日志) <br>NTFS_SYSTEM_FILE_VOLUME
EQU
3 ; $Volume ( 卷名及卷信息以及文件系統(tǒng)版本 )<br>NTFS_SYSTEM_FILE_ATTRDEF
EQU 4 ;
$AttrDef ( 所有支持的屬性定義 )<br>NTFS_SYSTEM_FILE_ROOT
EQU
5 ; . (
根目錄 )<br>NTFS_SYSTEM_FILE_BITMAP
EQU 6 ;
$Bitmap ( 卷的數(shù)據(jù)簇分配位圖 )<br>NTFS_SYSTEM_FILE_BOOT
EQU
7 ; $Boot ( 卷的引導(dǎo)記錄,指向引導(dǎo)扇區(qū) )<br>NTFS_SYSTEM_FILE_BADCLUS
EQU 8 ;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -