?? 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 + -