在 DOS 作業系統的黃金年代,組合語言是系統程式設計師的核心工具。DOSSYM.ASM 是 MS-DOS 核心原始碼中的關鍵符號定義檔,定義了作業系統核心運行所需的各種資料結構、常數、中斷向量與系統呼叫編號。雖然時代已久,但研讀這份原始碼仍能讓我們深入理解作業系統底層運作機制,對學習組合語言、逆向工程及系統程式設計極具參考價值。
BPB (Bios Parameter Block) 描述磁碟的物理幾何參數,是檔案系統掛載的基礎:
BPBLOCK STRUC
BPSECSZ DW ? ; 每扇區位元組數
BPCLUS DB ? ; 每叢集扇區數
BPRES DW ? ; 保留扇區數
BPFTCNT DB ? ; FAT 表數量
BPDRCNT DW ? ; 根目錄項目數
BPSCCNT DW ? ; 總扇區數
BPMEDIA DB ? ; 媒體描述符
BPFTSEC DW ? ; 每 FAT 佔用扇區數
BPBLOCK ENDS
註解中反覆出現的 CAVEAT PROGRAMMER 警告,提醒開發者這些結構屬於 DOS 內部私有介面,極度依賴版本,隨時可能變更,不應在正式文件中公開。
BUFFINFO 結構管理磁碟區塊快取,包含鏈結指標、磁碟機號、髒標記、優先權、扇區號、寫入計數與驅動程式參數指標等欄位。優先權常數(如 FATPRI=30、DIRPRI=15)決定緩衝區置換策略,FAT 與目錄扇區擁有最高優先權。
經典的 32 位元組目錄項目:
dir_entry STRUC
dir_name DB 11 DUP (?) ; 檔名(8.3 格式)
dir_attr DB ? ; 屬性位元組
dir_pad DB 10 DUP (?) ; 保留
dir_time DW ? ; 最後寫入時間
dir_date DW ? ; 最後寫入日期
dir_first DW ? ; 起始叢集
dir_size_l DW ? ; 檔案大小低 16 位
dir_size_h DW ? ; 檔案大小高 16 位
dir_entry ENDS
屬性位元定義:attr_read_only=1h、attr_hidden=2h、attr_system=4h、attr_volume_id=8h、attr_directory=10h、attr_archive=20h。
原始碼詳細說明 12-bit FAT 項目的儲存方式:每三個位元組儲存兩個項目,項目值 0 為未配置,>0FF8h 為檔案結束標記,0FF7h 標記壞軌。這種緊湊編碼在早期有限儲存空間下極為關鍵。
DPB 是記憶體中對應每個邏輯磁碟機的完整參數,包含磁碟機號、單元號、扇區大小、叢集遮罩/位移、FAT 起始記錄、FAT 數量、根目錄項目數、第一資料扇區、最大叢集號、FAT 大小、目錄起始扇區、驅動程式指標、媒體描述符、首次存取標記、下一個 DPB 指標、目前目錄叢集與目錄路徑字串。DPBSIZ 等於結構大小。
sys_fcb 定義了傳統 FCB 結構(磁碟機、檔名、副檔名、範圍、記錄大小、檔案大小、日期時間、裝置 ID、叢集資訊、隨機記錄欄位)。裝置 ID 位元區分檔案/裝置、原始/熟模式、主控台輸入輸出、時鐘、空裝置等。sft 與 sf_entry 定義系統開啟檔案表,包含參考計數、存取模式、屬性與內嵌 FCB。
Process_data_block (PDB) 是程式載入時建立的前綴段,包含終止向量、區塊長度、CP/M 相容呼叫、退出/Ctrl-C/嚴重錯誤向量、父進程 ID、JFN 表、環境區段址、使用者堆疊指標、系統呼叫入口等。arena 結構描述記憶體管理區塊,4Dh 為一般區塊,5Ah 為最後區塊,擁有者為 0 表示空閒。
原始碼定義兩組中斷向量表:標準 (INTTAB=20h) 與替代 (ALTTAB=0F0h)。標準向量包括:
int_abort (20h) 進程終止int_command (21h) DOS 系統呼叫入口int_terminate (22h) 終止地址int_ctrl_c (23h) Ctrl-C 處理int_fatal_abort (24h) 嚴重錯誤int_disk_read (25h)/int_disk_write (26h) 邏輯扇區讀寫int_keep_process (27h) TSR 駐留int_spooler (28h) 列印佇列int_fastcon (29h) 快速主控台系統呼叫編號 (AH 值) 從 00h (ABORT) 到 57h (FILE_TIMES),涵蓋字元輸入輸出、檔案操作 (FCB/Handle)、目錄管理、記憶體管理、進程控制、日期時間、國際化、IOCTL、複製檔案控制塊、執行程式 (EXEC)、結束、等待、尋找檔案、PDB 管理、DPB 管理、重新命名、檔案時間等。OEM 保留呼叫 F8h-FFh。
XENIX 相容錯誤代碼 (0-18) 及各子功能對應的錯誤代碼別名(如 open_file_not_found = error_file_not_found)。機器指令操作碼:mi_INT=0CDh、mi_Long_JMP=0EAh、mi_Long_CALL=09Ah、mi_Long_RET=0CBh。
標準控制代碼:stdin=0、stdout=1、stderr=2、stdaux=3、stdprn=4。XENIX 開啟模式:open_for_read=0、open_for_write=1、open_for_both=2。
DOSSYM.ASM 如同 DOS 核心的「字典」,集中定義了所有內部資料結構、常數與介面協定。研讀它能幫助我們建立作業系統底層運作的完整心智模型,理解早期 PC 架構下的資源管理、檔案系統與進程控制機制。雖然現代作業系統架構已截然不同,但許多核心概念(如緩衝區管理、檔案控制區塊、中斷向量表、系統呼叫慣例)仍具有普遍參考價值。