Chapter 08:File System === :::info 檔案系統的實現是整個作業系統裡面最像是軟體開發的部分,實際的硬體操作不算複雜,但最困難的點在於軟體開發的小細節,可以說是多如牛毛,甚至可能因人而異,每個人的設計可能大相徑庭,或是說設計本身是個人 Coding 哲學的體現,這部分也很鼓勵大家自行重新設計出自己版本的檔案系統,你就可以體會這個中的奧妙,過程很辛苦,但一定可以讓你收穫滿滿。 &emsp; 1. IDE &emsp; 2. File System &emsp; 3. inode &emsp; 4. Directory &emsp; 5. File ::: >[time=Mon, Nov 3, 2025 4:46 PM] --- https://youtu.be/bsPITXZIEmo <iframe width="560" height="315" src="https://www.youtube.com/embed/bsPITXZIEmo?si=Iq5hGnAwoVs52OpV" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> https://youtu.be/vo21xzQT6h4 <iframe width="560" height="315" src="https://www.youtube.com/embed/vo21xzQT6h4?si=aiO1PCKo_aD-3R9c" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe> ![截圖 2026-01-06 凌晨2.15.10](https://hackmd.io/_uploads/SyhpJtKEWl.png) # IDE (Integrated Drive Electronics) ![截圖 2025-11-02 凌晨12.01.08](https://hackmd.io/_uploads/ByE1y2XyWg.png) ![IDE_interface](https://hackmd.io/_uploads/S1EEJ3QJ-e.jpg) >[!Note] SATA? PATA? >![sStorage_Figure1_081216](https://hackmd.io/_uploads/HknUx3QJ-x.png) >![截圖 2025-11-02 凌晨12.08.35](https://hackmd.io/_uploads/BkvsgnXJbe.png) >![截圖 2025-11-02 凌晨12.09.43](https://hackmd.io/_uploads/BkY1Z3XyWg.png) >[!Caution] Bochs IDE >在 Bochs 這個 x86 模擬器裡,預設的 IDE 硬碟控制器是 PATA(也就是 Parallel ATA / 俗稱 IDE),不是 SATA。 >[!Note] Hard Disk >![截圖 2025-11-03 下午4.36.02](https://hackmd.io/_uploads/BkchtJIkZe.png) >[!Note] Disk Partition Table (DPT) >![截圖 2025-11-25 凌晨1.16.42](https://hackmd.io/_uploads/r1OQ7fM-bl.png) >![截圖 2025-11-25 凌晨1.37.42](https://hackmd.io/_uploads/rytbdzz-Wx.png) >![截圖 2025-11-06 凌晨3.30.05](https://hackmd.io/_uploads/ry8g8mFybx.png) >![截圖 2025-11-03 下午4.42.02](https://hackmd.io/_uploads/ryvejyL1Wx.png) > ==The starting LBA is the offset from the beginning of the partition.== >![截圖 2025-11-03 下午4.45.47](https://hackmd.io/_uploads/H1FAjyLkbx.png) >![IMG_4082](https://hackmd.io/_uploads/H18RHVYk-g.jpg) >[!Caution] EBR 的相對位置會不同! >[!Note] Partition Type | 類型 | 代碼 (Hex) | 說明 | | ----------- | -------------------------------------- | ------------- | | 0x00 | 空分割區 | 未使用 | | 0x01 | FAT12 | 早期 DOS | | 0x04 / 0x06 | FAT16 | 小/大容量 FAT16 | | 0x07 | **NTFS / exFAT / HPFS** | Windows 使用 | | 0x0B / 0x0C | **FAT32 / FAT32 LBA** | Windows 使用 | | 0x0E | FAT16 LBA | 支援 LBA | | 0x0F | **Extended LBA** | 延伸分割區 | | 0x05 | **Extended CHS** | 延伸分割區(舊式 CHS) | | 0x82 | **Linux swap** | | | 0x83 | **Linux native(ext2/ext3/ext4 等)** | | | 0x8E | **Linux LVM (Logical Volume Manager)** | | | 0xA5 | BSD / FreeBSD | | | 0xA6 | OpenBSD | | | 0xA8 | macOS UFS | | | 0xAB | macOS Boot | | | 0xAF | macOS HFS / APFS | | | 0xEE | **GPT 保護分割區(Protective MBR)** | | | 0xEF | **EFI System Partition (ESP)** | | | 0xFD | Linux RAID autodetect | | ## Disk Formatting | Item | Value | | --------------- | ------- | | Capacity | 80 MB | | Sector size | 512 B | | Sector number | 163296 | | Cylinder number | ==162== | | Head number | ==16== | | Sector/Track | 63 | >[!Tip] 一個 track 固定是 63 sectors 建立新的硬碟 ``` ./bximage ``` ![截圖 2025-11-03 下午6.13.20](https://hackmd.io/_uploads/SkLae-81Zl.png) 設定 bochsrc ``` ata0-slave: type=disk, mode=flat, path="80mb.img" ``` ![截圖 2025-11-03 下午6.19.31](https://hackmd.io/_uploads/rytJfW8J-e.png) 確定 bochs 有認到硬碟 ``` xp /b 0x475 ``` ![截圖 2025-11-03 晚上7.13.52](https://hackmd.io/_uploads/SJfACWLkWe.png) 格式化硬碟 ``` fdisk ./80mb.img ``` 指令描述 ![截圖 2025-11-03 晚上7.21.26](https://hackmd.io/_uploads/H1y_ezIkZl.png) extra functionality 指令描述 ![截圖 2025-11-03 晚上7.22.58](https://hackmd.io/_uploads/rktgZMLJbe.png) print info ![截圖 2025-11-03 晚上8.25.21](https://hackmd.io/_uploads/BJJ9J7Iy-l.png) Setting Dos CHS ![截圖 2025-11-03 晚上8.31.04](https://hackmd.io/_uploads/ByZ4bXU1Zl.png) Primary Partition ![截圖 2025-11-03 晚上8.34.55](https://hackmd.io/_uploads/HJWRbXUyZg.png) Extended partition ![截圖 2025-11-03 晚上8.37.18](https://hackmd.io/_uploads/Hyy_MXUJbl.png) Logical partition ![截圖 2025-11-03 晚上8.44.50](https://hackmd.io/_uploads/HJ3UE7LJWl.png) Setting Partition Type ![截圖 2025-11-07 凌晨1.33.51](https://hackmd.io/_uploads/S1RanI5y-e.png) Write table to disk ![截圖 2025-11-03 晚上8.58.09](https://hackmd.io/_uploads/SybWvQIyZe.png) Check the result ``` fdisk -l ./80mb.img ``` ![截圖 2025-11-07 凌晨3.51.47](https://hackmd.io/_uploads/Hyduhd91Zx.png) ## Enable all ATA channel >[!Note] ATA channel | 控制器 | 通常名稱 | Base I/O Port | Control Port | IRQ | 裝置代號 | |:-------- |:---------- |:------------- |:------------ |:------ |:------------ | | **ATA0** | Primary | `0x1F0` | `0x3F6` | IRQ 14 | Master/Slave | | **ATA1** | Secondary | `0x170` | `0x376` | IRQ 15 | Master/Slave | | **ATA2** | Tertiary | `0x1E8` | `0x3E6` | IRQ 11 | Master/Slave | | **ATA3** | Quaternary | `0x168` | `0x366` | IRQ 10 | Master/Slave | ![截圖 2025-11-05 清晨7.40.55](https://hackmd.io/_uploads/SkmNkzdy-x.png) ![截圖 2025-11-05 清晨5.10.23](https://hackmd.io/_uploads/Bkf1hkuJ-e.png) disable pci ![截圖 2025-11-05 清晨7.42.05](https://hackmd.io/_uploads/B1avkfOybe.png) ![截圖 2025-11-05 清晨7.42.46](https://hackmd.io/_uploads/Sk8okMdyZx.png) ## Programming >Reference: >[Bochs' map of I/O ports to functions](https://bochs.sourceforge.io/techspec/PORTS.LST) >[OSDev wiki](https://wiki.osdev.org/ATA_PIO_Mode#Addressing_Modes) >![upload_788d8a3a34820e14992142b2e93ed384](https://hackmd.io/_uploads/r1w8zwIJZx.png) >![upload_c789b08e7c0e52fd089fa46925d6cad3](https://hackmd.io/_uploads/SJfdzPIyZl.png) >==會使用到的 command: 0xEC(identify), 0x20(read), 0x30(write)== >![upload_10bbb768cda6a3281dbb8c42db0d52ea](https://hackmd.io/_uploads/SkSYGD8J-x.png) >![upload_fdce52c9aa109e67ef00fa2f7a21fc52](https://hackmd.io/_uploads/SkYQXw81Wx.png) >![upload_f40386fa80b0e07a58d2457e07904946](https://hackmd.io/_uploads/BJq47w8yZe.png) >主要分成以下五大步驟: >* 設定 sector count,預計要讀(寫)幾個 sector。 >* 設定 hard disk LBA 地址。 >* 寫入讀(寫)指令。 >* Polling 等待完成。 >* 讀取資料到 RAM。 >[!Note] identify drive 指令(0xEC) >這個指令會回傳一個 512 位元組(256 個 16-bit words) 的資料區塊,用來描述這顆磁碟的屬性、能力、幾何資訊(柱面、磁頭、磁區數)等。每個欄位都是以 16 位元(1 word) 為單位排列。 | Word 編號 | 說明 | Bochs 常見數值或行為 | | ------- | ---------------------------- | -------------------------- | | 0 | 一般設定(general configuration) | `0x0040` → 表示非可移除磁碟、磁性儲存裝置 | | 1 | 磁柱數(cylinders) | 由 `.bochsrc` 設定(例如 16383) | | 3 | 磁頭數(heads) | 由設定檔決定(例如 16) | | 6 | 每磁道磁區數(sectors per track) | 由設定檔決定(例如 63) | | 10–19 | 序號(Serial number,ASCII 格式) | `"BOCHS HARDDISK"` 或自訂 | | 23–26 | 韌體版本(Firmware revision) | 例如 `"BXHD001"` | | 27–46 | 型號名稱(Model number) | `"Bochs Virtual HD"` | | 47 | 每次中斷最大可傳輸磁區數 | 通常 `0x8010` | | 49 | 能力位元(Capabilities bit field) | 表示支援 DMA、LBA (`0x0F00`) | | 60–61 | 可使用之 LBA28 磁區總數 | 依磁碟映像檔大小決定 | | 80 | 支援的 ATA 版本 | 通常 `0x0006`(ATA-6) | | 82–84 | 支援的功能位元(Feature bits) | 顯示支援 LBA、DMA 等功能 | | 88 | Ultra DMA 模式支援 | 常見值 `0x007F` | | 100–103 | LBA48 總磁區數 | 若磁碟容量超過 128GiB 時會使用 | | 255 | 校驗碼(Checksum) | 通常為有效的 `0xA5` | ![截圖 2025-11-25 凌晨3.52.56](https://hackmd.io/_uploads/BkWpvNzZWl.png) ![截圖 2025-11-25 凌晨3.35.07](https://hackmd.io/_uploads/ryD9XVf-Zx.png) ## Source Code https://github.com/srhuang/a-os/commit/bfd4d57a781c40db1f0c11fda59cc61fcbfaf6f8 ## Compile ``` make all ``` ## Put on hard disk ``` sh gen.sh ``` ## Checkpoint ![截圖 2025-11-07 下午5.47.30](https://hackmd.io/_uploads/S1DUlrs1Zg.png) # File System ![截圖 2025-11-24 下午5.43.41](https://hackmd.io/_uploads/SyFlYoWZbl.png) >[!Note] Volume Boot Record (VBR) / OS Boot Record (OBR) >位於 每個分割區(partition)開頭的第一個 sector,包含啟動程式碼與該分割區的檔案系統資訊。 | 名稱 | 全名 | 位置 | 功能 | | ------- | -------------------- | ------------------------------ | ---------------------- | | **MBR** | Master Boot Record | 磁碟最前面的 sector <br>(LBA 0) | 決定要載入哪個分割區開機(通常載入 VBR) | | **EBR** | Extended Boot Record | 每個邏輯分割區的開頭 <br>(Extended Partition) | 描述該邏輯分割區的位置與下一個 EBR | | **VBR** | Volume Boot Record | 每個(主或邏輯)分割區的開頭 | 該分割區的開機程式 | >[!Note] Super Block >![截圖 2025-11-24 下午5.52.09](https://hackmd.io/_uploads/Hy51oi-W-l.png) >[!Note] inode 可以表示的檔案大小 >Block size = 4KB, LBA = 4 bytes >* Direct blocks: $12 \times 4KB=48KB$ >* Single indirect blocks: $(4KB\div4)\times4KB=4MB$ >* Double indirect blocks: $1KB\times1KB\times4KB=4GB$ >* Triple indirect blocks: $1KB\times1KB\times1KB\times4KB=4TB$ >[!Note] inode table >![截圖 2025-11-26 凌晨3.27.31](https://hackmd.io/_uploads/BymBQK7WZg.png) >[!Note] Data Structure >![截圖 2025-11-26 凌晨1.21.51](https://hackmd.io/_uploads/rkxeLP7-bx.png) >[!Note] Root dir >![截圖 2025-11-26 凌晨1.24.31](https://hackmd.io/_uploads/Hy9vLDm-bx.png) >[!Note] block bitmap reset >![截圖 2025-11-26 凌晨3.34.46](https://hackmd.io/_uploads/B1xlBKX--e.png) ## Source Code https://github.com/srhuang/a-os/commit/d058c336af08f44a34601d8ba4ea8f05c1c9c024 ## Compile ``` make all ``` ## Put on hard disk ``` sh gen.sh ``` ## Checkpoint ![截圖 2025-11-25 下午5.14.42](https://hackmd.io/_uploads/SkuhQxm-Wg.png) # inode ![截圖 2025-11-27 凌晨12.38.21](https://hackmd.io/_uploads/B1ZX6sNZWx.png) >[!Note] i_block >![截圖 2025-11-28 下午5.31.20](https://hackmd.io/_uploads/r11znyvbbl.png) >[!Note] inode read and write >![截圖 2025-11-26 晚上8.34.06](https://hackmd.io/_uploads/rkRCQONZ-g.png) ## Source Code https://github.com/srhuang/a-os/commit/315026263aaef6c8f1a3278500a39eed7f7fa5b0 ## Compile ``` make all ``` ## Put on hard disk ``` sh gen.sh ``` ## Checkpoint ![截圖 2025-11-28 晚上7.25.06](https://hackmd.io/_uploads/HyIhIWvbZl.png) # Directory ![截圖 2026-01-06 凌晨2.16.32](https://hackmd.io/_uploads/HkzXlKtV-l.png) ![截圖 2025-11-26 晚上8.37.41](https://hackmd.io/_uploads/Hy4nEd4WWx.png) ## Source Code https://github.com/srhuang/a-os/commit/aad933eaa9de5e11353345b111d4f14a9efd3f4a ## Compile ``` make all ``` ## Put on hard disk ``` sh gen.sh ``` ## Checkpoint ![截圖 2025-11-28 晚上10.16.55](https://hackmd.io/_uploads/S1Z-kVDZWg.png) # File ![截圖 2026-01-06 凌晨2.17.38](https://hackmd.io/_uploads/BkLPxtK4-e.png) ![截圖 2025-11-29 凌晨12.31.33](https://hackmd.io/_uploads/SyRYASwWZl.png) ## Source Code https://github.com/srhuang/a-os/commit/039a10b298cea86a42c7705df57fbeea8b2505b9 ## Compile ``` make all ``` ## Put on hard disk ``` sh gen.sh ``` ## Checkpoint ![截圖 2025-11-24 凌晨1.42.37](https://hackmd.io/_uploads/HJx3wTgWbx.png) # More about File System ![截圖 2026-01-14 凌晨2.22.54](https://hackmd.io/_uploads/HkbCpZ4rZl.png) ## Source Code https://github.com/srhuang/a-os/commit/d879e79f029aa0fa553e4adb760765cc821f8c21 >[!Caution] stat bug fix >https://github.com/srhuang/a-os/commit/3cb7cd16446e49258daf0ce772f81d933f6dd0c4 ## Compile ``` make all ``` ## Put on hard disk ``` sh gen.sh ``` ## Checkpoint ![截圖 2026-01-14 下午4.15.47](https://hackmd.io/_uploads/HJWyZCVBZx.png)