全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2621
推到 Plurk!
推到 Facebook!

硬碟結構簡介

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-09 02:04:58 IP:61.64.xxx.xxx 未訂閱
此為轉貼資料 http://www.lisoleg.net/lisoleg/init/suzhe.txt 發信人: suzhe (I Love Linux), 信區: FreeBSD 標 題: 昨天報告會的講義 (轉載) 發信站: BBS 水木清華站 (Sun Mar 12 15:12:57 2000) 【 以下文字轉載自 Linux 討論區 】 【 原文由 suzhe 所發表 】 昨天報告會其實也沒講太多的內容, 就是把以前寫的一些東西拿出來 講了一下. 由於根本沒想到會來那麽多人, 沒怎麽好好準備, 搞得我 連話都講不好了. 真是不好意思. 我的主頁是: http://Suzhe.home.chinaren.net 想下載 SmartBootManager 的可以去. 目 錄 ------ 第一部分 基礎知識 一. 硬碟結構簡介 二. Boot Sector 結構簡介 三. 系統啓動過程簡介 第二部分 SmartBootManager 技術資料 一. 簡 介 二. 程式簡介 第一部分 基礎知識 一. 硬碟結構簡介 1. 硬碟參數釋疑 到目前爲止, 人們常說的硬碟參數還是古老的 CHS (Cylinder/ Head/Sector)參數. 那麽爲什麽要使用這些參數, 它們的意義是什麽? 它們的取值範圍是什麽? 很久以前, 硬碟的容量還非常小的時候, 人們採用與軟碟類似的結 構生産硬碟. 也就是硬碟碟片的每一條磁軌都具有相同的磁區數. 由此 産生了所謂的3D參數 (Disk Geometry). 既磁頭數(Heads), 柱面數 (Cylinders), 磁區數(Sectors per track),以及相應的定址方式. 其中: 磁頭數(Heads) 表示硬碟總共有幾個磁頭,也就是有幾面碟片, 最大 爲 256 (用 8 個二進位位元存儲); 柱面數(Cylinders) 表示硬碟每一面碟片上有幾條磁軌, 最大爲 1024 (用 10 個二進位位元存儲); 磁區數(Sectors per track) 表示每一條磁軌上有幾個磁區, 最大爲 63 (用 6 個二進位位元存儲). 每個磁區一般是 512個位元組, 理論上講這不是必須的, 但好象沒有取 別的值的. 所以磁片最大容量爲: 256 * 1024 * 63 * 512 / 1048576 = 8064 GB ( 1M = 1048576 Bytes ) 或硬碟廠商常用的單位: 256 * 1024 * 63 * 512 / 1000000 = 8455 GB ( 1M = 1000000 Bytes ) 在 CHS 定址方式中, 磁頭, 柱面, 磁區的取值範圍分別爲 0 到 Heads-1, 0 到 Cylinders-1, 1 到 Sectors per track (注意是從 1 開始). 在 CHS 定址方式中, 有以下幾種尺寸單位: 磁區 (Sector) = 512 位元組 (一般情況下) 磁軌 (Track) = (Sectors per track) 磁區 柱面 (Cylinder)= (Sectors per track) * Heads 磁區 2. 基本 Int 13H 調用簡介 BIOS Int 13H 調用是 BIOS 提供的磁片基本輸入輸出中斷調用, 它可以 完成磁片(包括硬碟和軟碟)的重定, 讀寫, 校驗, 定位, 診斷, 格式化等功能. 它使用的就是 CHS 定址方式, 因此最大識能訪問 8 GB 左右的硬碟 ( 本文中 如不作特殊說明, 均以 1M = 1048576 位元組爲單位). 3. 現代硬碟結構簡介 在老式硬碟中, 由於每個磁軌的磁區數相等, 所以外道的記錄密度要遠低 於內道, 因此會浪費很多磁碟空間 (與軟碟一樣). 爲了解決這一問題, 進一 步提高硬碟容量, 人們改用等密度結構生産硬碟. 也就是說, 外圈磁軌的磁區 比內圈磁軌多. 採用這種結構後, 硬碟不再具有實際的3D參數, 定址方式也改 爲線性定址, 即以磁區爲單位進行定址. 爲了與使用3D定址的老軟體相容 (如使用BIOS Int13H介面的軟體), 在硬 盤控制器內部安裝了一個地址翻譯器, 由它負責將老式3D參數翻譯成新的線性 參數. 這也是爲什麽現在硬碟的3D參數可以有多種選擇的原因 (不同的工作模 式, 對應不同的3D參數, 如 LBA, LARGE, NORMAL). 4. 擴展 Int 13H 簡介 雖然現代硬碟都已經採用了線性定址, 但是由於基本 Int 13H 的制約, 使 用 BIOS Int 13H 介面的程式, 如 DOS 等還只能訪問 8 G 以內的硬碟空間. 爲了打破這一限制, Microsoft 等幾家公司制定了擴展 Int 13H 標準 (Extended Int13H), 採用線性定址方式存取硬碟, 所以突破了 8 G 的限制, 而且還加入了對可拆卸介質 (如活動硬碟) 的支援. (http://www.phoenix.com/products/specs.html) 二. Boot Sector 結構簡介 1. Boot Sector 的組成 Boot Sector 也就是硬碟的第一個磁區, 它由 MBR (Master Boot Record), DPT (Disk Partition Table) 和 Boot Record ID 三部分組成. MBR 又稱作主引導記錄,佔用 Boot Sector 的前 446 個位元組 ( 0 to 0x1BD ), 存放系統主引導程式 (它負責從活動分區中裝載並運行系統引導程式). DPT 即主分區表佔用 64 個位元組 (0x1BE to 0x1FD), 記錄了磁片的基本分區 資訊. 主分區表分爲四個分區項, 每項 16 位元組, 分別記錄了每個主分區的資訊 (因此最多可以有四個主分區). Boot Record ID 即引導區標記佔用兩個位元組 (0x1FE and 0x1FF), 對於合法 引導區, 它等於 0xAA55, 這是判別引導區是否合法的標誌. Boot Sector 的具體結構如下圖所示: 0000 |----------------------------------------------------------------------- |-----------------------------------------------------------------------| |----------------------------------------------------------------------| |------------------------Master Boot Record----------------------| |----------------------主引導記錄(446位元組) ----------------------| 01BD |----------------------------------------------------------------------| 01BE |------------------------------------------------| 01CD |----------------------分區資訊 1(16位元組) ----------------------| 01CE |------------------------------------------------| 01DD |----------------------分區資訊 2(16位元組) ----------------------| 01DE |------------------------------------------------| 01ED |----------------------分區資訊 3(16位元組) ----------------------| 01EE |------------------------------------------------| |----------------------------------------------------------------------------------------| 01FD |----------------------分區資訊 4(16位元組) ----------------------| |------------------------------------------------| | 01FE----------------------| 01FF--------------------------------------------| |----------------------55----------------------|----------------------AA----------------------| |------------------------------------------------| 2. 分區表結構簡介 分區表由四個分區項構成, 每一項的結構如下: BYTE State : 分區狀態, 0 = 未啟動, 0x80 = 啟動 (注意此項) BYTE StartHead : 分區起始磁頭號 WORD StartSC : 分區起始磁區和柱面號, 底位元組的低6位元爲磁區號, 高2位爲柱面號的第 9,10 位元, 高位元組爲柱面號的低 8 位 BYTE Type : 分區類型, 如 0x0B = FAT32, 0x83 = Linux 等, 00 表示此項未用 BYTE EndHead : 分區結束磁頭號 WORD EndSC : 分區結束磁區和柱面號, 定義同前 DWORD Relative : 在線性定址方式下的分區相對磁區位址 (對於基本分區即爲絕對位址) DWORD Sectors : 分區大小 (總磁區數) 注意: 在 DOS / Windows 系統下, 基本分區必須以柱面爲單位劃分 ( Sectors * Heads 個磁區), 如對於 CHS 爲 764/256/63 的硬碟, 分區的 最小尺寸爲 256 * 63 * 512 / 1048576 = 7.875 MB. 由於硬碟的第一個磁區已經被引導磁區佔用, 所以一般來說, 硬碟第一 個磁軌(0頭0道)的其餘 62 個磁區是不會被分區佔用的. 某些分區軟體甚至 將第一個柱面全部空出來. 3. 擴展分區簡介 由於主分區表中只能分四個分區, 無法滿足需求, 因此設計了一種擴展 分區格式. 基本上說, 擴展分區的資訊是以鏈表形式存放的, 但也有一些特 別的地方. 首先, 主分區表中要有一個基本擴展分區項, 所有擴展分區都隸屬於它, 也就是說其他所有擴展分區的空間都必須包括在這個基本擴展分區中. 對於 DOS / Windows 來說, 擴展分區的類型爲 0x05 或 0x0F (LBA模式). 除基本擴展分區以外的其他所有擴展分區則以鏈表的形式級聯存放, 後 一個擴展分區的資料項目記錄在前一個擴展分區的分區表中, 但兩個擴展分區 的空間並不重疊. 擴展分區類似於一個完整的硬碟, 必須進一步分區才能使用. 但每個擴 展分區中只能存在一個其他分區. 此分區在 DOS/Windows 環境中即爲邏輯盤. 因此每一個擴展分區的分區表 (同樣存儲在擴展分區的第一個磁區中)中最多 只能有兩個分區資料項目(包括下一個擴展分區的資料項目). 擴展分區和邏輯盤的示意圖如下: |-----------------------| -------- | 主擴展分區(/dev/hda2) | ^ |-----------------------| | | 擴 展 | 分區項 1 |--\ | | |------------| | | | 分區表 | 分區項 2 |-- --\ | |-----------------------| | | | | | | | | | 邏輯盤 1 (/dev/hda5) |<-/ | | | | | | |-----------------------| | 主 | 擴展分區 2 |<----/ |-----------------------| 擴 | 擴 展 | 分區項 1 |-- | |------------| | 展 | 分區表 | 分區項 2 |-- -- |-----------------------| | | 分 | | | | | 邏輯盤 2 (/dev/hda6) |<-/ | 區 | | | | |-----------------------| | | | 擴展分區 3 |<----/ | |-----------------------| | | 擴 展 | 分區項 1 |--\ | | |------------| | | | 分區表 | 分區項 2 | | | |-----------------------| | | | | | | | 邏輯盤 3 (/dev/hda7) |<-/ | | | | |-----------------------| --------- 注意, 以上所有擴展分區表中的第二個分區項(指向下一個擴展分區)的相對 磁區位址均相對於主擴展分區, 而不是前一個擴展分區. 三. 系統啓動過程簡介 系統啓動過程主要由一下幾步組成(以硬碟啓動爲例): 1. 開機 :-) 2. BIOS 加電自檢 ( Power On Self Test -- POST ) 記憶體位址爲 0ffff:0000 3. 將硬碟第一個磁區 (0頭0道1磁區, 也就是Boot Sector) 讀入記憶體位址 0000:7c00 處. 4. 檢查 (WORD) 0000:7dfe 是否等於 0xaa55, 若不等於 則轉去嘗試其他啓動介質, 如果沒有其他啓動介質則顯示 "No ROM BASIC" 然後死機. 5. 跳轉到 0000:7c00 處執行 MBR 中的程式. 6. MBR 首先將自己複製到 0000:0600 處, 然後繼續執行. 7. 在主分區表中搜索標誌爲活動的分區. 如果發現沒有活動 分區或有不止一個活動分區, 則停止. 8. 將活動分區的第一個磁區讀入記憶體位址 0000:7c00 處. 9. 檢查 (WORD) 0000:7dfe 是否等於 0xaa55, 若不等於則 顯示 "Missing Operating System" 然後停止, 或嘗試 軟碟啓動. 10. 跳轉到 0000:7c00 處繼續執行特定系統的啓動程式. 11. 啓動系統 ... 以上步驟中 2,3,4,5 步是由 BIOS 的引導程式完成. 6,7,8,9,10 步由MBR中的引導程式完成. 一般多系統引導程式 (如 SmartBootManager, BootStar, PQBoot 等) 都是將標準主引導記錄替換成自己的引導程式, 在運行系統啓動程式 之前讓用戶選擇要啓動的分區. 而某些系統自帶的多系統引導程式 (如 lilo, NT Loader 等) 則可以將自己的引導程式放在系統所處分區的第一個磁區中, 在 Linux 中即爲 SuperBlock (其實 SuperBlock 是兩個磁區). 注: 以上各步驟中使用的是標準 MBR, 其他多系統引導程式的引導 過程與此不同. 第二部分 SmartBootManager 技術資料 一. 簡 介 1. SmartBootManager 是什麽? SmartBootManager (簡稱 SBM) 是一個獨立於任何作業系統的啓動 管理器, 它可以讓用戶在啓動電腦的時候選擇要啓動的分區(或軟盤機). 與 OS/2 BootManager, System Commander, PQ-Boot 等不同的是, SBM 的尺寸非常小, 可以安裝在硬碟 0 磁軌的隱含磁區中, 無需任何 分區和系統. SBM 不是 OS Loader, 它必須與 OS Loader 相配合才能啓動操作 系統. 例如, 要啓動 Linux 還必需安裝 lilo (或其他類似軟體), DOS / Windows 9x / Windows NT 也有自己的 OS Loader. 2. SBM 的特點 除了以上所說的小巧以外, SBM 還具有許多特點, 如: * 友好的用戶介面 * 強大的口令保護功能 * 自動搜索分區 * 支援多硬碟, 可以引導邏輯分區 * 支援軟盤機啓動 * 支援大硬碟(使用擴展 Int 13h) * 支援從邏輯分區上啓動 DOS / Windows 9X 系統. 二. SBM 程式簡介 SBM 的所有核心程式都用 nasm 寫成, 爲了方便編程, 將主程序分成了 幾個不同功能的模組: ui.asm 用戶介面模組, 完成視窗繪製, 字串輸入等功能 hd_io.asm 磁片 IO 模組, 負責訪問磁碟機 knl.asm 核心模組, 主要完成分區搜索, 分區啓動等功能 utils.asm 實用函數模組, 包括數位<->字串轉換等函數 main.asm 主程序 loader.asm 調用程式, 用以替換標準 MBR, 負責裝載主程序 tempdata.asm 程式使用的臨時變數和緩衝區 theme-us.asm 英文介面資料 theme-zh.asm 中文介面資料 其他詳細內容以後再寫吧. 三. SBM 使用技巧 1. 用 SBM 管理 DOS/Windows 9x/NT, Linux, FreeBSD 應注意的事項 * DOS 6.22 及以前版本只能安裝在硬碟的前 2G 空間以內 * Windows 95 及以前版本只能安裝在 8G 以內(即 1024 柱面以內) * Windows NT 4.0 最好安裝在第一個分區, 不然的話需要用 SBM 把 前面所有 Windows NT 能夠識別的分區都隱藏起來, 才能啓動 NT. * 必須把 lilo 安裝到 SuperBlock, 否則 SBM 會破壞 lilo!!! 如何把 lilo 移到 SuperBlock: 編輯 /etc/lilo.conf 文件, 修改 boot= 參數, 例如: boot=/dev/hda2 # /dev/hda2 是 linux 所在分區 執行 lilo * FreeBSD 好像不能安裝到邏輯盤上(我沒有親自實驗過) * 要想啓動邏輯盤或第二塊(或以後)硬碟上的 DOS/Windows 9X, 必須 用 SBM 把前面的所有 FAT 分區都隱藏起來. 先寫這麽多吧, 以後想到什麽在說. -- ※ 來源:·BBS 水木清華站 smth.org·[FROM: 166.111.26.80] ********************************************************* 哈哈&兵燹 最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知 K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together! 希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-05-20 6:57:13
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!