อ่าน 53 นาที
การออกแบบระบบไฟล์ FAT
ระบบ ไฟล์ FAT เป็น ระบบไฟล์ ที่ใช้ใน ระบบปฏิบัติการ MS-DOS และ Windows 9x [ 3 ] ยังคงมีการใช้งานใน อุปกรณ์เคลื่อนที่ และ ระบบฝังตัว...
การออกแบบระบบไฟล์ FAT
| นักพัฒนา | ไมโครซอฟต์ , SCP , IBM , คอมแพค , ดิจิทัล รีเสิร์ช , โนเวลล์ , คาลเดรา |
|---|---|
| ชื่อเต็ม | ตารางการจัดสรรไฟล์: FAT12 (เวอร์ชัน 12 บิต), FAT16 (เวอร์ชัน 16 บิต), FAT32 (เวอร์ชัน 32 บิต โดยใช้ 28 บิต), exFAT (เวอร์ชัน 64 บิต) |
| แนะนำ | 1977 ( ดิสก์แบบสแตนด์อโลน BASIC-80 ) FAT12: สิงหาคม 1980 (SCP QDOS ) FAT16: สิงหาคม 1984 (IBM PC DOS 3.0) FAT16B: พฤศจิกายน 1987 ( Compaq MS-DOS 3.31) FAT32: สิงหาคม 1996 ( Windows 95 OSR2 ) exFAT: พฤศจิกายน 2006 ( Windows Embedded CE 6.0 ) |
| รหัสพาร์ติชัน | MBR / EBR : FAT12 : ea FAT16 : ea FAT32 : ea exFAT : ea BDP :0x010x040x060x0E0x0B0x0C0x07EBD0A0A2-B9E5-443387C0-68B6B72699C7 |
| โครงสร้าง | |
| สารบัญ | โต๊ะ |
| การจัดสรรไฟล์ | รายการเชื่อมโยง |
| บล็อกที่ไม่ดี | การติดแท็กคลัสเตอร์ |
| ข้อจำกัด | |
| ขนาดปริมาตรสูงสุด | FAT12: 32 MB (256 MB สำหรับ คลัสเตอร์64 KB ) FAT16: 2 GB (4 GBสำหรับคลัสเตอร์ 64 KB ) FAT32: 2 TB (16 TBสำหรับเซกเตอร์4 KB ) |
| ขนาดไฟล์สูงสุด | 4,294,967,295 ไบต์ (4 GB - 1) ด้วย FAT16B และ FAT32 [ 1 ] |
| จำนวนไฟล์สูงสุด | FAT12: 4,068 สำหรับ คลัสเตอร์ขนาด 8 KB FAT16: 65,460 สำหรับ คลัสเตอร์ขนาด 32 KB FAT32: 268,173,300 สำหรับ คลัสเตอร์ขนาด 32 KB |
| ความยาวชื่อไฟล์สูงสุด | ชื่อไฟล์ขนาด 8.3หรือ 255 อักขระ UCS-2เมื่อใช้LFN |
| คุณสมบัติ | |
| วันที่บันทึก | วันที่/เวลาที่แก้ไข, วันที่/เวลาที่สร้าง (เฉพาะ DOS 7.0 ขึ้นไป), วันที่เข้าถึง (มีเฉพาะเมื่อ เปิดใช้งาน ACCDATE ), [ 2 ]วันที่/เวลาที่ลบ (เฉพาะกับ DELWATCH 2) |
| ช่วงวันที่ | 1 มกราคม 1980ถึง31 ธันวาคม 2099 ( 31 ธันวาคม 2107 ) |
| ความละเอียดของวันที่ | เวลาแก้ไขล่าสุด 2 วินาที, เวลาสร้าง 10 มิลลิวินาที, วันที่เข้าถึง 1 วัน, เวลาลบ 2 วินาที |
| ส้อม | ไม่ใช่คนพื้นเมือง |
| คุณลักษณะ | อ่านอย่างเดียว , ซ่อน , ระบบ , วอลุ่ม , ไดเร็กทอรี , ที่เก็บถาวร |
| สิทธิ์การเข้าถึงไฟล์ระบบ | FAT12/FAT16: สิทธิ์ การเข้าถึงไฟล์ ไดเร็กทอรี และวอลุ่ม สำหรับการอ่านเขียนเรียกใช้และลบเฉพาะกับDR-DOS , PalmDOS , Novell DOS , OpenDOS , FlexOS , 4680 OS , 4690 OS , Concurrent DOS , Multiuser DOS , System Manager , REAL/32 เท่านั้น (สิทธิ์เรียกใช้เฉพาะกับ FlexOS, 4680 OS, 4690 OS; รหัสผ่านไฟล์/ไดเร็กทอรีแต่ละรายการไม่มีใน FlexOS, 4680 OS, 4690 OS; คลาสสิทธิ์ World / Group / Ownerใช้ได้เฉพาะเมื่อโหลดระบบรักษาความปลอดภัยแบบมัลติยูเซอร์) FAT32: บางส่วน เฉพาะกับ DR-DOS, REAL/32 และ 4690 OS เท่านั้น |
| การบีบอัดแบบโปร่งใส | FAT12/FAT16: ต่อวอลุ่ม, SuperStor , Stacker , DoubleSpace , DriveSpace FAT32: ไม่มี |
| การเข้ารหัสแบบโปร่งใส | FAT12/FAT16: ต่อไดรฟ์เฉพาะกับDR-DOS เท่านั้น FAT32: ไม่ได้ |
ระบบไฟล์ FATเป็นระบบไฟล์ที่ใช้ในระบบปฏิบัติการMS-DOSและ Windows 9x [ 3 ]ยังคงมีการใช้งานในอุปกรณ์เคลื่อนที่และระบบฝังตัวดังนั้นจึงเป็นระบบไฟล์ที่เหมาะสมสำหรับการแลกเปลี่ยนข้อมูลระหว่างคอมพิวเตอร์และอุปกรณ์เกือบทุกประเภทและทุกยุคสมัยตั้งแต่ปี 1981 จนถึงปัจจุบัน
โครงสร้าง
ระบบไฟล์ FAT ประกอบด้วยสี่ส่วน:
| ภูมิภาค | ขนาดในแต่ละภาคส่วน | สารบัญ | หมายเหตุ |
|---|---|---|---|
| ภาคส่วนที่สงวนไว้ | (จำนวนภาคส่วนที่สงวนไว้ ) | บูตเซกเตอร์ | เซกเตอร์ที่สงวนไว้แรก (เซกเตอร์เชิงตรรกะ 0) คือเซกเตอร์บูต (หรือเรียกว่าวอลุ่มบูตเรคคอร์ดหรือเรียกสั้น ๆ ว่าVBR ) ซึ่งประกอบด้วยพื้นที่ที่เรียกว่าบล็อกพารามิเตอร์ BIOS ( BPB ) ที่มีข้อมูลระบบไฟล์พื้นฐานบางอย่าง โดยเฉพาะประเภทและตัวชี้ไปยังตำแหน่งของส่วนอื่น ๆ และโดยปกติจะประกอบด้วย โค้ด บูตโหลดเดอร์ของระบบปฏิบัติการ ข้อมูลสำคัญจาก Boot Sector สามารถเข้าถึงได้ผ่านโครงสร้างระบบปฏิบัติการที่เรียกว่าDrive Parameter Block ( DPB ) ใน DOS และ OS/2 จำนวนรวมของเซกเตอร์ที่สงวนไว้จะระบุด้วยฟิลด์ภายในเซกเตอร์บูต และโดยปกติจะมีค่าเท่ากับ 32 ในระบบไฟล์ FAT32 [ 4 ] สำหรับระบบไฟล์ FAT32 เซกเตอร์ที่สงวนไว้ประกอบด้วยเซกเตอร์ข้อมูลระบบไฟล์ (File System Information Sector)ที่เซกเตอร์ตรรกะที่ 1 และเซกเตอร์บูตสำรอง (Backup Boot Sector) ที่เซกเตอร์ตรรกะที่ 6 ในขณะที่ผู้จำหน่ายรายอื่น ๆ หลายรายยังคงใช้การตั้งค่าเซกเตอร์เดียว (เฉพาะเซกเตอร์ตรรกะที่ 0 เท่านั้น) สำหรับตัวโหลดบูต แต่โค้ดเซกเตอร์บูตของ Microsoft ได้ขยายให้ครอบคลุมเซกเตอร์ตรรกะที่ 0 และ 2 ตั้งแต่การเปิดตัว FAT32 โดยเซกเตอร์ตรรกะที่ 0 ขึ้นอยู่กับซับรูทีนในเซกเตอร์ตรรกะที่ 2 พื้นที่เซกเตอร์บูตสำรองประกอบด้วยเซกเตอร์ตรรกะสามเซกเตอร์ ได้แก่ เซกเตอร์ที่ 6, 7 และ 8 เช่นกัน ในบางกรณี Microsoft ยังใช้เซกเตอร์ที่ 12 ของพื้นที่เซกเตอร์ที่สงวนไว้สำหรับตัวโหลดบูตแบบขยายด้วย |
| ภาคข้อมูล FS (เฉพาะ FAT32) | |||
| พื้นที่สงวนเพิ่มเติม (ไม่บังคับ) | |||
| บริเวณไขมัน | (จำนวน FAT) * (จำนวนเซกเตอร์ต่อ FAT) | ตารางการจัดสรรไฟล์ #1 | โดยทั่วไปแล้ว ไฟล์นี้จะมีสำเนาของ ตารางการจัดสรรไฟล์ (File Allocation Table)สองชุดเพื่อตรวจสอบความซ้ำซ้อน แม้ว่าจะไม่ค่อยได้ใช้ แม้แต่ในโปรแกรมซ่อมแซมดิสก์ก็ตาม นี่คือแผนที่ของพื้นที่ข้อมูล (Data Region) ซึ่งระบุว่าคลัสเตอร์ใดถูกใช้โดยไฟล์และไดเร็กทอรี ในระบบไฟล์ FAT12 และ FAT16 แผนที่เหล่านี้จะอยู่ถัดจากเซกเตอร์ที่สงวนไว้ โดยทั่วไปแล้ว สำเนาเพิ่มเติมเหล่านี้จะถูกรักษาให้ตรงกันอย่างแน่นหนาในระหว่างการเขียน และในการอ่าน จะใช้เฉพาะเมื่อเกิดข้อผิดพลาดในระบบไฟล์ FAT ชุดแรกเท่านั้น คลัสเตอร์สองชุดแรก (คลัสเตอร์0และ1 ) ในแผนที่ประกอบด้วยค่าพิเศษ |
| ตารางการจัดสรรไฟล์ #2 ... (ไม่บังคับ) | |||
| ไดเร็กทอรีรากส่วนภูมิภาค | (จำนวนรายการรูท * 32) / (ไบต์ต่อเซกเตอร์) | ไดเร็กทอรีราก(เฉพาะ FAT12 และ FAT16) | นี่คือตารางไดเร็กทอรีที่เก็บข้อมูลเกี่ยวกับไฟล์และไดเร็กทอรีที่อยู่ในไดเร็กทอรีราก ตารางนี้ใช้ได้เฉพาะกับ FAT12 และ FAT16 เท่านั้น และกำหนดขนาดสูงสุดคงที่ให้กับไดเร็กทอรีราก ซึ่งจะถูกจัดสรรไว้ล่วงหน้าเมื่อสร้างวอลุ่มนี้ ส่วน FAT32 จะเก็บไดเร็กทอรีรากไว้ในพื้นที่ข้อมูล (Data Region) ร่วมกับไฟล์และไดเร็กทอรีอื่นๆ ทำให้สามารถขยายขนาดได้โดยไม่มีข้อจำกัดดังกล่าว ดังนั้น สำหรับ FAT32 พื้นที่ข้อมูลจึงเริ่มต้นที่นี่ |
| ภูมิภาคข้อมูล | (จำนวนคลัสเตอร์) * (จำนวนเซกเตอร์ต่อคลัสเตอร์) | พื้นที่ข้อมูล (สำหรับไฟล์และไดเร็กทอรี) ... (จนถึงส่วนท้ายของพาร์ติชั่นหรือดิสก์) | นี่คือบริเวณที่จัดเก็บข้อมูลไฟล์และไดเร็กทอรีจริง และใช้พื้นที่ส่วนใหญ่ของพาร์ติชัน โดยทั่วไปแล้ว FAT32 จะเริ่มต้นตารางไดเร็กทอรีรากในคลัสเตอร์หมายเลข 2 ซึ่งเป็นคลัสเตอร์แรกของพื้นที่ข้อมูล |
FAT ใช้ รูปแบบ little-endianสำหรับรายการทั้งหมดในส่วนหัว (ยกเว้นบางรายการในเซกเตอร์บูตของ Atari ST ที่ระบุไว้อย่างชัดเจน) และ FAT [ 5 ]สามารถจัดสรรเซกเตอร์ FAT ได้มากกว่าจำนวนคลัสเตอร์ที่จำเป็น ส่วนท้ายของเซกเตอร์สุดท้ายของแต่ละสำเนา FAT อาจไม่ได้ใช้งานหากไม่มีคลัสเตอร์ที่สอดคล้องกัน จำนวนเซกเตอร์ทั้งหมด (ตามที่ระบุไว้ในเรคอร์ดบูต) อาจมากกว่าจำนวนเซกเตอร์ที่ใช้โดยข้อมูล (คลัสเตอร์ × เซกเตอร์ต่อคลัสเตอร์) FAT (จำนวน FAT × เซกเตอร์ต่อ FAT) ไดเร็กทอรีรูท (ไม่มีใน FAT32) และเซกเตอร์ที่ซ่อนอยู่รวมถึงเซกเตอร์บูต: ซึ่งจะส่งผลให้มีเซกเตอร์ที่ไม่ได้ใช้งานที่ส่วนท้ายของวอลุ่ม หากพาร์ติชันมีเซกเตอร์มากกว่าจำนวนเซกเตอร์ทั้งหมดที่ระบบไฟล์ครอบครอง ก็จะส่งผลให้มีเซกเตอร์ที่ไม่ได้ใช้งานที่ส่วนท้ายของพาร์ติชันหลังจากวอลุ่มเช่นกัน
พื้นที่ส่วนที่สงวนไว้
บูตเซกเตอร์
สำหรับ อุปกรณ์จัดเก็บข้อมูลที่ไม่ได้แบ่ง พาร์ติชั่น เช่นฟลอปปี้ดิสก์เซกเตอร์บูต ( VBR )คือเซกเตอร์แรก (เซกเตอร์เชิงตรรกะ 0 ที่มีแอดเดรส CHS ทางกายภาพ 0/0/1 หรือแอดเดรส LBA 0) สำหรับอุปกรณ์จัดเก็บข้อมูลที่แบ่งพาร์ติชั่น เช่น ฮาร์ดดิสก์ เซกเตอร์บูตคือเซกเตอร์แรกของพาร์ติชั่น ตามที่ระบุไว้ในตารางพาร์ติชั่นของอุปกรณ์
| ออฟเซ็ตไบต์ | ความยาว (ไบต์) | สารบัญ |
|---|---|---|
| 0x000 | 3 | คำสั่งกระโดด (Jump instruction) หากเซกเตอร์บูตมีลายเซ็นที่ถูกต้องอยู่ในสองไบต์สุดท้ายของเซกเตอร์บูต (ซึ่งส่วนใหญ่จะถูกตรวจสอบโดยบูตโหลดเดอร์ที่อยู่ใน BIOS ของระบบหรือ MBR) และมีการบูตจากวอลุ่มนี้ บูตโหลดเดอร์ก่อนหน้าจะส่งการทำงานไปยังจุดเริ่มต้นนี้ด้วยค่ารีจิสเตอร์บางค่า และคำสั่งกระโดดจะข้ามส่วนหัวที่เหลือ (ที่ไม่สามารถเรียกใช้งานได้) ดูที่Volume Boot Record ตั้งแต่ DOS 2.0 เป็นต้นมา ดิสก์บูต x86 ที่ถูกต้องจะต้องเริ่มต้นด้วยการกระโดดสั้นๆ ตามด้วย NOP ( ลำดับสตริง คำสั่ง 0xEB 0x?? 0x90 [ 6 ] [ 7 ]ดังที่เห็นตั้งแต่ DOS 3.0 [ nb 1 ] —และบน DOS 1.1 [ 8 ] [ 9 ] ) หรือการกระโดดใกล้เคียง ( 0xE9 0x?? 0x?? [ 6 ] [ 7 ]ดังที่เห็นบนดิสก์ที่ฟอร์แมตด้วย DOS 2.x ส่วนใหญ่ ( Compaq , TeleVideo ) รวมถึงดิสก์ DOS 3.1 บางรุ่น ( Epson , Olivetti ) เพื่อความเข้ากันได้กับเวอร์ชันก่อนหน้า MS-DOS, PC DOS และ DR-DOS ยังยอมรับการกระโดด ( 0x69 0x?? 0x?? ) [ 6 ] [ 7 ] [ 10 ]บนดิสก์แบบถอดได้ บนฮาร์ดดิสก์ DR DOS ยังยอมรับลำดับ JMPS ที่สลับกันโดยเริ่มต้นด้วย NOP ( 0x90 0xEB 0x?? ) [ 10 ]ในขณะที่ MS-DOS/PC DOS ไม่ยอมรับ (ดูด้านล่างสำหรับความเข้ากันได้กับ Atari ST) การมีอยู่ของรูปแบบ opstring เหล่านี้ (ร่วมกับการทดสอบค่าตัวอธิบายสื่อที่ถูกต้องที่ออฟเซ็ต0x015 ) ทำหน้าที่เป็นตัวบ่งชี้สำหรับ DOS 3.3 และสูงกว่าว่ามี BPB บางประเภทอยู่ (แม้ว่าขนาดที่แน่นอนไม่ควรถูกกำหนดจากเป้าหมายการกระโดด เนื่องจากบางเซกเตอร์บูตมีข้อมูลบูตโหลดเดอร์ส่วนตัวตามหลัง BPB) ในขณะที่สำหรับวอลุ่ม DOS 1.x (และ DOS 3.0 บางส่วน) จะต้องกลับไปใช้วิธี DOS 1.x เพื่อตรวจจับรูปแบบผ่านไบต์สื่อใน FAT (ในเซกเตอร์ตรรกะ 1 ) |
| 0x003 | 8 | ชื่อผู้ผลิต (เติมช่องว่าง0x20 ) ค่านี้ใช้กำหนดว่าดิสก์ถูกฟอร์แมตในระบบใด แม้ว่าจะมีเอกสารอย่างเป็นทางการว่าใช้งานได้ฟรีสำหรับ OEM แต่ MS-DOS/PC DOS (ตั้งแต่เวอร์ชัน 3.1), Windows 95/98/SE/ME และ OS/2 จะตรวจสอบฟิลด์นี้เพื่อพิจารณาว่าส่วนอื่นๆ ของเรคอร์ดบูตส่วนใดที่เชื่อถือได้และวิธีการตีความ ดังนั้น การตั้งค่าป้ายกำกับ OEM เป็นค่าที่ไม่ถูกต้องหรือค่าปลอมอาจทำให้ MS-DOS, PC DOS และ OS/2 ไม่รู้จักวอลุ่มอย่างถูกต้องและทำให้ข้อมูลเสียหายระหว่างการเขียน[ 11 ] [ 12 ] [ 13 ]ตัวอย่างทั่วไปคือ " ผู้จำหน่ายบางรายจัดเก็บข้อมูลใบอนุญาตหรือรหัสการเข้าถึงไว้ในรายการนี้ โปรแกรม Volume Tracker ใน Windows 95/98/SE/ME จะเขียนทับฉลาก OEM ด้วย บูตโหลดเดอร์บางตัวจะทำการปรับเปลี่ยนหรือปฏิเสธการส่งการควบคุมไปยังเซกเตอร์บูต โดยขึ้นอยู่กับค่าบางอย่างที่ตรวจพบในที่นี้ (เช่น ค่าออฟเซ็ต NEWLDR 0x018 ) หน่วยความจำบูต ROM ของคอมพิวเตอร์ Wang Professionalจะถือว่าดิสก์นั้นสามารถบูตได้ก็ต่อเมื่ออักขระสี่ตัวแรกของฉลาก OEM เป็น " หากในFAT32 EBPBลายเซ็นที่ตำแหน่งออฟเซ็ตเซกเตอร์0x042คือ0x29และรายการจำนวนเซกเตอร์ทั้งหมดทั้งสองรายการเป็น 0 รายการระบบไฟล์อาจทำหน้าที่เป็นรายการจำนวนเซกเตอร์ทั้งหมด 64 บิต และรายการป้ายกำกับ OEM อาจใช้เป็นประเภทระบบไฟล์ทางเลือกแทนรายการปกติที่ตำแหน่งออฟเซ็ต 0x052 ในทำนองเดียวกัน หากตั้งค่ารายการนี้เป็น " |
| 0x00B | แตกต่างกันไป | บล็อกพารามิเตอร์ BIOS ( 13 , 19 , 21หรือ 25ไบต์),บล็อกพารามิเตอร์ BIOS แบบขยาย (32 หรือ 51 ไบต์) หรือบล็อกพารามิเตอร์ BIOS แบบขยาย FAT32 (60 หรือ 79 ไบต์); ขนาดและเนื้อหาจะแตกต่างกันไปตามระบบปฏิบัติการและเวอร์ชัน โปรดดูรายละเอียดด้านล่าง |
| แตกต่างกันไป | แตกต่างกันไป | โค้ดบูตเฉพาะระบบไฟล์และระบบปฏิบัติการ มักจะเริ่มต้นทันทีหลัง [E]BPB แต่บางครั้งข้อมูลบูตโหลดเดอร์ "ส่วนตัว" เพิ่มเติมจะถูกจัดเก็บไว้ระหว่างจุดสิ้นสุดของ [E]BPB และจุดเริ่มต้นของโค้ดบูต ดังนั้นการกระโดดที่ออฟเซ็ต0x001 จึง ไม่สามารถใช้เพื่อระบุรูปแบบ [E]BPB ที่แน่นอนได้อย่างน่าเชื่อถือ (เมื่อใช้ร่วมกับ DOS 3.31 BPBขึ้นไป บูตโหลดเดอร์ GPTบางตัว(เช่นBootDuet ) จะใช้0x1FA – 0x1FDเพื่อจัดเก็บ 4 ไบต์บนสุดของเซกเตอร์ที่ซ่อนอยู่สำหรับวอลุ่มที่อยู่นอก เซกเตอร์ 32-1 สอง เซกเตอร์แรก เนื่องจากตำแหน่งนี้อาจมีโค้ดหรือข้อมูลอื่น ๆ ในบูตเซกเตอร์อื่น จึงอาจไม่สามารถเขียนข้อมูลลงไปได้หาก0x1F9 – 0x1FDไม่เป็นศูนย์ทั้งหมด) |
| 0x1FD | 1 | หมายเลขไดรฟ์ทางกายภาพ (เฉพาะในเซกเตอร์บูตของ DOS 3.2 ถึง 3.31) ใน OS/2 1.0 และ DOS 4.0 ข้อมูลนี้ได้ย้ายไปยังออฟเซ็ตเซกเตอร์0x024 (ที่ออฟเซ็ต0x19ในEBPB ) เซกเตอร์บูตของ Microsoft และ IBM ส่วนใหญ่ยังคงรักษาค่า0x00 ไว้ ที่ออฟเซ็ต0x1FCและ0x1FDมาโดยตลอด แม้ว่าจะไม่ได้เป็นส่วนหนึ่งของลายเซ็นที่0x1FEก็ตาม หากไดรฟ์นี้เป็นส่วนหนึ่งของไดรฟ์บูต ระบบ MBR ที่ได้รับการปรับปรุงของ DR-DOS 7.07 สามารถกำหนดค่าได้ (ดูที่ออฟเซ็ต NEWLDR 0x014 ) เพื่ออัปเดตค่าในรายการนี้แบบไดนามิกเป็นค่า DL ที่ได้รับในระหว่างการบูตหรือค่าที่จัดเก็บไว้ในตารางพาร์ติชัน ซึ่งจะช่วยให้สามารถบูตจากไดรฟ์อื่นได้ แม้ว่า โค้ด VBRจะไม่สนใจค่า DL ก็ตาม |
| 0x1FE | 2 | ลายเซ็นเซกเตอร์บูต ( 0x55 0xAA ) [ 4 ] [ nb 2 ]ลายเซ็นนี้บ่งชี้ถึงรหัสบูตที่เข้ากันได้กับ IBM PC และจะถูกทดสอบโดยบูตโหลดเดอร์ส่วนใหญ่ที่อยู่ใน BIOS ของระบบหรือ MBR ก่อนที่จะส่งการดำเนินการไปยังรหัสบูตของเซกเตอร์บูต (แต่ เช่น ไม่ใช่โดย ROM-BIOS ดั้งเดิมของ IBM PC [ 16 ] ) ลายเซ็นนี้ไม่ได้บ่งชี้ถึงระบบไฟล์หรือระบบปฏิบัติการใดโดยเฉพาะ เนื่องจากลายเซ็นนี้ไม่มีอยู่ในดิสก์ที่ฟอร์แมตด้วย FAT ทั้งหมด (เช่น ไม่มีใน DOS 1.x [ 8 ] [ 9 ]หรือวอลุ่ม FAT ที่ไม่สามารถบูตได้ด้วย x86) ระบบปฏิบัติการจึงไม่ควรพึ่งพาลายเซ็นนี้เมื่อล็อกอินเข้าสู่วอลุ่ม (MS-DOS/PC DOS รุ่นเก่าก่อน 3.3 ตรวจสอบลายเซ็นนี้ แต่รุ่นใหม่กว่ารวมถึง DR-DOS ไม่ได้ตรวจสอบ) เครื่องมือฟอร์แมตต้องไม่เขียนลายเซ็นนี้หากเซกเตอร์บูตที่เขียนไม่มีอย่างน้อยสตับบูตโหลดเดอร์จำลองที่เข้ากันได้กับ x86 อย่างน้อยที่สุด จะต้องหยุดการทำงานของ CPU ในลูปที่ไม่สิ้นสุด ( 0xF4 0xEB 0xFD ) หรือออกคำสั่งINT 19hและ RETF ( 0xCD 0x19 0xCB ) อย่างไรก็ตาม ไม่ควรใช้ opstrings เหล่านี้ที่ตำแหน่งออฟเซ็ตเซกเตอร์0x000เนื่องจาก DOS ตรวจสอบ opcode อื่นๆ เป็นลายเซ็น ฟลอปปี้ดิสก์ MSX-DOS 2 จำนวนมากใช้0xEB 0xFE 0x90ที่ตำแหน่งออฟเซ็ตเซกเตอร์0x000เพื่อดักจับ CPU ในลูปที่แน่นหนา ในขณะที่ยังคงรักษารูปแบบ opcode ที่ MS-DOS/PC DOS รู้จัก ลายเซ็นนี้ต้องอยู่ที่ตำแหน่งออฟเซ็ตเซกเตอร์คงที่0x1FEสำหรับขนาดเซกเตอร์ 512 หรือสูงกว่า หากขนาดเซกเตอร์ทางกายภาพใหญ่กว่านั้น อาจมีการทำซ้ำลายเซ็นนี้ที่ส่วนท้ายของเซกเตอร์ทางกายภาพได้ เครื่อง Atari STจะถือว่าดิสก์นั้นสามารถบูตได้ด้วย Atari 68000หากค่า checksum ของ คำ big-endian 256 คำของ boot sector เท่ากับ0x1234 [ 17 ] [ nb 3 ]หากโค้ด boot loader เข้ากันได้กับ IBM สิ่งสำคัญคือต้องตรวจสอบให้แน่ใจว่าค่า checksum ของ boot sector ไม่ตรงกับค่า checksum นี้โดยบังเอิญ หากเกิดกรณีเช่นนี้ขึ้น การเปลี่ยนบิตที่ไม่ได้ใช้ (เช่น ก่อนหรือหลังพื้นที่โค้ดบูต) สามารถใช้เพื่อให้แน่ใจว่าเงื่อนไขนี้ไม่เกิดขึ้น ในบางกรณีที่พบได้ยาก ลายเซ็นกลับด้าน0xAA 0x55ได้ถูกสังเกตพบในอิมเมจดิสก์ นี่อาจเป็นผลมาจากการใช้งานที่ผิดพลาดในเครื่องมือจัดรูปแบบตามเอกสารที่ผิดพลาด[หมายเหตุ 2 ]แต่ก็อาจบ่งชี้ถึงลำดับไบต์ที่สลับกันของอิมเมจดิสก์ ซึ่งอาจเกิดขึ้นระหว่างการถ่ายโอนระหว่างแพลตฟอร์มที่ใช้ ลำดับ ไบต์ แบบต่างกัน ค่า BPB และระบบไฟล์ FAT12, FAT16 และ FAT32 มีไว้สำหรับใช้ การแสดงผลแบบ little-endianเท่านั้น และไม่มีการใช้งานรูปแบบใดๆ ที่รู้จักซึ่งใช้ ค่าแบบ big-endianแทน |
| ออฟเซ็ตไบต์ | ความยาว (ไบต์) | สารบัญ |
|---|---|---|
| 0x000 | 2 | คำสั่ง Jump เซกเตอร์บูต Atari ST ดั้งเดิมเริ่มต้นด้วย คำสั่ง 68000 BRA.S ( 0x60 0x?? ) [ 5 ]เพื่อความเข้ากันได้กับระบบปฏิบัติการพีซี ดิสก์ที่ฟอร์แมต Atari ST ตั้งแต่TOS 1.4 เป็นต้นไปจะเริ่มต้นด้วย0xE9 0x??แทน |
| 0x002 | 6 | ชื่อ OEM (เติมช่องว่าง0x20 ) เช่น " " ( 0x4C 0x6F 0x61 0x64 0x65 0x72 ) บนไดรฟ์ที่มีบูตโหลดเดอร์ Atari ST โปรดดูข้อควรระวังเกี่ยวกับชื่อ OEM สำหรับดิสก์ที่ฟอร์แมตด้วย PC ด้านบน ตำแหน่งและความยาวของรายการนี้แตกต่างจากรายการบนดิสก์ที่ฟอร์แมตด้วย PC Loader |
| 0x008 | 3 | หมายเลขซีเรียลของดิสก์[ 5 ] (ค่าเริ่มต้น: 0x00 0x00 0x00 ) ที่ใช้โดย Atari ST เพื่อตรวจจับการเปลี่ยนแปลงดิสก์ (Windows 9x Volume Tracker จะเก็บ " " ไว้ที่นี่เสมอในฟลอปปี้ดิสก์ที่ไม่มีการป้องกันการเขียน ดูด้านบน) ค่านี้ต้องเปลี่ยนหากเนื้อหาของดิสก์ถูกเปลี่ยนแปลงจากภายนอก มิฉะนั้น Atari ST อาจไม่รู้จักการเปลี่ยนแปลงเมื่อใส่ดิสก์กลับเข้าไปใหม่ รายการนี้ทับซ้อนกับฟิลด์ชื่อ OEM บนดิสก์ที่ฟอร์แมตด้วยพีซี เพื่อความเข้ากันได้สูงสุด อาจจำเป็นต้องจับคู่รูปแบบบางอย่างที่นี่ ดูด้านบน IHC |
| 0x00B | 19 | บล็อกพารามิเตอร์ BIOS ของ DOS 3.0 ( รูปแบบ little-endian ) |
| 0x01E | แตกต่างกันไป | ข้อมูลจากเซกเตอร์บูตส่วนตัว (รูปแบบผสมระหว่างbig-endianและlittle-endian ) |
| แตกต่างกันไป | แตกต่างกันไป | โค้ดบูต Atari ST เฉพาะระบบไฟล์และระบบปฏิบัติการ ไม่จำเป็นต้องตั้งสมมติฐานใดๆ เกี่ยวกับตำแหน่งการโหลดของโค้ด ซึ่งจะต้องสามารถย้ายตำแหน่งได้ หากการโหลดระบบปฏิบัติการ (TOS.IMG [ 5 ] ) ล้มเหลว โค้ดสามารถกลับไปยัง BIOS ของ Atari ST ด้วยคำสั่ง 68000 RTS ( opcode 0x4E75พร้อมลำดับไบต์แบบbig-endian 0x4E 0x75 [ nb 2 ] ) และรีจิสเตอร์ทั้งหมดจะไม่เปลี่ยนแปลง |
| 0x1FE | 2 | ผลรวมตรวจสอบ ผลรวม ตรวจสอบ 16 บิต เหนือคำ แบบ big-endian 256 คำของเซกเตอร์บูตขนาด 512 ไบต์ รวมถึงคำนี้ จะต้องตรงกับค่าวิเศษ0x1234เพื่อระบุรหัสเซกเตอร์บูตที่สามารถเรียกใช้งานได้ของ Atari ST 68000 [ 17 ]รายการผลรวมตรวจสอบนี้สามารถใช้เพื่อจัดเรียงผลรวมตรวจสอบให้เหมาะสมได้[หมายเหตุ 3 ] หากขนาดของเซกเตอร์เชิงตรรกะมีขนาดใหญ่กว่า 512 ไบต์ ส่วนที่เหลือจะไม่รวมอยู่ในผลรวมตรวจสอบและโดยทั่วไปจะถูกเติมด้วยศูนย์[ 17 ] เนื่องจากระบบปฏิบัติการพีซีบางระบบไม่ยอมรับฟลอปปี้ดิสก์ที่ฟอร์แมตแบบ FAT อย่างผิดพลาดหาก ไม่มีลายเซ็น 0x55 0xAA [ nb 2 ]อยู่ที่นี่ จึงควรวาง0x55 0xAAไว้ในตำแหน่งนี้ (และเพิ่มบูตโหลดเดอร์หรือสตับที่เข้ากันได้กับ IBM) และใช้คำที่ไม่ได้ใช้ในข้อมูลส่วนตัวหรือพื้นที่รหัสบูตหรือหมายเลขซีเรียลเพื่อให้แน่ใจว่าผลรวมตรวจสอบ0x1234 [ nb 3 ]ไม่ตรงกัน (เว้นแต่ว่า โอเวอร์เลย์ รหัส FAT ที่ใช้ร่วมกัน จะเป็นไฟล์ปฏิบัติการของทั้ง IBM PC และ Atari ST ในเวลาเดียวกัน) |
| ออฟเซ็ตไบต์ | ความยาว (ไบต์) | สารบัญ |
|---|---|---|
| 0x000 | 3 | คำสั่งกระโดดจำลอง (เช่น0xEB 0xFE 0x90 ) |
| 0x003 | 8 | ชื่อผู้ผลิต (เติมช่องว่าง0x20 ) |
| 0x00B | 19 | DOS 3.0 BPB |
| 0x01E | แตกต่างกันไป (2) | จุดเริ่มต้นของโค้ด MSX-DOS 1 สำหรับโปรเซสเซอร์ Z80 ในโค้ดบูตของ MSX นี่คือตำแหน่งที่เครื่อง MSX-DOS 1 กระโดดไปเมื่อส่งการควบคุมไปยังเซกเตอร์บูต ตำแหน่งนี้ทับซ้อนกับรูปแบบ BPB ตั้งแต่ DOS 3.2 หรือโค้ดเซกเตอร์บูตที่เข้ากันได้กับ x86 ของเซกเตอร์บูตที่เข้ากันได้กับ IBM PC และจะทำให้เกิดการขัดข้องบนเครื่อง MSX เว้นแต่จะมีการใช้มาตรการป้องกันพิเศษ เช่น การดักจับ CPU ในลูปที่ทำงานอย่างรวดเร็ว ณ ตำแหน่งนี้ (opstring 0x18 0xFEสำหรับ JR 0x01E ) |
| 0x020 | 6 | ลายเซ็นวอลุ่ม MSX-DOS 2 " VOL_ID". |
| 0x026 | 1 | แฟล็กการกู้คืนไฟล์ที่ถูกลบของ MSX-DOS 2 (ค่าเริ่มต้น: 0x00หากมีลายเซ็น " " อยู่ที่ตำแหน่งออฟเซ็ตของเซกเตอร์0x020แฟล็กนี้จะระบุว่าไดรฟ์นั้นมีไฟล์ที่ถูกลบซึ่งสามารถกู้คืนได้หรือไม่ (ดูตำแหน่งออฟเซ็ต0x0Cในรายการไดเร็กทอรี)) VOL_ID |
| 0x027 | 4 | หมายเลขประจำเครื่องของดิสก์ MSX-DOS 2 (ค่าเริ่มต้น: 0x00000000 ) หากมีลายเซ็น " " อยู่ที่ตำแหน่งออฟเซ็ตเซกเตอร์0x020 MSX-DOS 2 จะจัดเก็บหมายเลขประจำเครื่องของวอลุ่มไว้ที่นี่เพื่อตรวจจับการเปลี่ยนสื่อ VOL_ID |
| 0x02B | 5 | ที่สงวนไว้ |
| 0x030 | แตกต่างกันไป (2) | จุดเริ่มต้นของโค้ด MSX-DOS 2 สำหรับโปรเซสเซอร์ Z80 ในโค้ดบูตของ MSX นี่คือตำแหน่งที่เครื่อง MSX-DOS 2 กระโดดไปเมื่อส่งการควบคุมไปยังเซกเตอร์บูต ตำแหน่งนี้ทับซ้อนกับรูปแบบ EBPB ตั้งแต่ DOS 4.0 / OS/2 1.2 หรือโค้ดเซกเตอร์บูตที่เข้ากันได้กับ x86 ของเซกเตอร์บูตที่เข้ากันได้กับ IBM PC และจะทำให้เกิดการขัดข้องบนเครื่อง MSX เว้นแต่จะมีการใช้มาตรการป้องกันพิเศษ เช่น การดักจับ CPU ในลูปที่ทำงานอย่างรวดเร็ว ณ ตำแหน่งนี้ (opstring 0x18 0xFEสำหรับ JR 0x030 ) |
| 0x1FE | 2 | ลายเซ็น |
บล็อกพารามิเตอร์ BIOS
| การชดเชยภาคส่วน | ค่าชดเชย BPB | ความยาว (ไบต์) | สารบัญ |
|---|---|---|---|
| 0x00B | 0x00 | 2 | หน่วยเป็นไบต์ต่อเซกเตอร์เชิงตรรกะ ค่าที่ใช้กันทั่วไปคือ 512 ไบต์ ระบบปฏิบัติการบางระบบอาจไม่รองรับขนาดเซกเตอร์อื่น เพื่อความเรียบง่ายและประสิทธิภาพสูงสุด ขนาดเซกเตอร์เชิงตรรกะมักจะเท่ากับขนาดเซกเตอร์ทางกายภาพของดิสก์ แต่ในบางกรณีอาจมีขนาดใหญ่กว่าหรือเล็กกว่าได้ ค่าต่ำสุดที่อนุญาตสำหรับวอลุ่ม FAT12/FAT16 ที่ไม่สามารถบูตได้ซึ่งมีเซกเตอร์เชิงตรรกะสูงสุด 65,535 เซกเตอร์คือ 32 ไบต์ หรือ 64 ไบต์สำหรับเซกเตอร์เชิงตรรกะมากกว่า 65,535 เซกเตอร์ ค่าต่ำสุดที่ใช้งานได้จริงคือ 128 เวอร์ชัน OEM ของ DOS ก่อน DOS 3.31 บางเวอร์ชันใช้ขนาดเซกเตอร์เชิงตรรกะสูงสุด 8192 ไบต์สำหรับFAT ที่มีเซกเตอร์เชิงตรรกะ Atari ST GEMDOSรองรับขนาดเซกเตอร์เชิงตรรกะระหว่าง 512 ถึง 4096 [ 17 ] DR-DOS รองรับการบูตจากวอลุ่ม FAT12/FAT16 ที่มีขนาดเซกเตอร์เชิงตรรกะสูงสุด 32 KB และการใช้งาน INT 13h รองรับเซกเตอร์ทางกายภาพสูงสุด 1024 ไบต์/เซกเตอร์[ nb 5 ] ขนาดเซกเตอร์เชิงตรรกะขั้นต่ำสำหรับวอลุ่ม FAT32 มาตรฐานคือ 512 ไบต์ ซึ่งสามารถลดลงเหลือ 128 ไบต์ได้หากไม่มีการรองรับเซกเตอร์ข้อมูลของระบบไฟล์ (FS Information Sector ) ฟลอปปี้ไดรฟ์และคอนโทรลเลอร์ใช้ขนาดเซกเตอร์ทางกายภาพ 128, 256, 512 และ 1024 ไบต์ (เช่น PC/AX) Atari Portfolioรองรับขนาดเซกเตอร์ 512 สำหรับวอลุ่มที่มีขนาดใหญ่กว่า 64 KB, 256 ไบต์สำหรับวอลุ่มที่มีขนาดใหญ่กว่า 32 KB และ 128 ไบต์สำหรับวอลุ่มที่มีขนาดเล็กกว่าไดรฟ์แม่เหล็กออปติคอลใช้ขนาดเซกเตอร์ 512, 1024 และ 2048 ไบต์ ในปี 2005 ฮาร์ดดิสก์แบบกำหนดเอง ของ Seagate บางรุ่น ใช้ขนาดเซกเตอร์ 1024 ไบต์แทนค่าเริ่มต้น 512 ไบต์[ 18 ] ฮาร์ดดิสก์Advanced Format ใช้ 4096 ไบต์ต่อเซกเตอร์ ( 4Kn ) ตั้งแต่ปี 2010 แต่จะสามารถจำลองเซกเตอร์ 512 ไบต์ ( 512e ) ได้ในช่วงเปลี่ยนผ่าน ลินุกซ์ และแอนดรอยด์ รองรับขนาดเซกเตอร์เชิงตรรกะที่ใหญ่กว่ามาก ซึ่งมีการระบุไว้อย่างเป็นทางการในหน้าคู่มือสำหรับยูทิลิตี้ระบบไฟล์ว่ามีขนาดสูงสุดถึง 32KB |
| 0x00D | 0x02 | 1 | จำนวนเซกเตอร์เชิงตรรกะต่อคลัสเตอร์ ค่าที่อนุญาตคือ 1, 2, 4, 8, 16, 32, 64 และ 128 MS-DOS 3.x บางเวอร์ชันรองรับขนาดคลัสเตอร์สูงสุดเพียง 4 KB เท่านั้น ในขณะที่ MS-DOS/PC DOS และ Windows 95 รุ่นใหม่รองรับขนาดคลัสเตอร์สูงสุด 32 KB Windows 98/SE/ME รองรับขนาดคลัสเตอร์ 64 KB บางส่วนเช่นกัน แต่บริการ FCB บางอย่างไม่สามารถใช้งานได้บนดิสก์ดังกล่าว และแอปพลิเคชันต่างๆ จะทำงานล้มเหลว ตระกูล Windows NTและ DOS เวอร์ชันทางเลือกบางเวอร์ชัน เช่นPTS-DOSรองรับคลัสเตอร์ 64 KB อย่างสมบูรณ์ สำหรับระบบปฏิบัติการที่ใช้ DOS ส่วนใหญ่ ขนาดคลัสเตอร์สูงสุดยังคงอยู่ที่ 32 KB (หรือ 64 KB) แม้ว่าขนาดเซกเตอร์จะใหญ่กว่า 512 ไบต์ก็ตาม สำหรับขนาดเซกเตอร์เชิงตรรกะ 1 KB, 2 KB และ 4 KB นั้น Windows NT 4.0 รองรับขนาดคลัสเตอร์สูงสุด 128 KB ในขณะที่สำหรับเซกเตอร์ขนาด 2 KB และ 4 KB นั้น ขนาดคลัสเตอร์สามารถสูงถึง 256 KB ได้ DR-DOS บางเวอร์ชันรองรับคลัสเตอร์ขนาด 128 KB ที่มี 512 ไบต์ต่อเซกเตอร์อย่างจำกัด โดยใช้ค่าเซกเตอร์ต่อคลัสเตอร์เป็น 0 MS-DOS/PC DOS จะค้างระหว่างการเริ่มต้นหากค่านี้ถูกระบุผิดพลาดเป็น 0 [ 19 ] : INT 21h AX=53h |
| 0x00E | 0x03 | 2 | จำนวนเซกเตอร์เชิงตรรกะที่สงวนไว้จำนวนเซกเตอร์เชิงตรรกะก่อน FAT แรกในอิมเมจระบบไฟล์ อย่างน้อย 1 สำหรับเซกเตอร์นี้ โดยปกติจะมี 32 สำหรับ FAT32 (เพื่อเก็บเซกเตอร์บูตแบบขยาย เซกเตอร์ข้อมูลระบบไฟล์ และเซกเตอร์บูตสำรอง) เนื่องจากไดรฟ์ที่ฟอร์แมตด้วย DR-DOS 7.0x ในรูปแบบ FAT32 ใช้เซกเตอร์บูต เซกเตอร์ข้อมูลระบบไฟล์ และเซกเตอร์สำรองข้อมูลแบบเซกเตอร์เดียว ดังนั้นไดรฟ์บางส่วนที่ฟอร์แมตด้วย DR-DOS จึงใช้ค่า 4 ในส่วนนี้ |
| 0x010 | 0x05 | 1 | จำนวนตารางจัดสรรไฟล์ (File Allocation Tables: FATs) โดยทั่วไปจะมี 2 ตารางดิสก์ RAMอาจใช้เพียง 1 ตาราง ระบบปฏิบัติการ MS-DOS/PC DOS ส่วนใหญ่ไม่รองรับ FATs มากกว่า 2 ตาราง ระบบปฏิบัติการ DOS บางระบบรองรับ FATs เพียง 2 ตารางในไดรเวอร์ดิสก์ในตัว แต่รองรับจำนวน FATs อื่นๆ สำหรับไดรเวอร์อุปกรณ์บล็อกที่โหลดในภายหลัง วอลุ่มที่ระบุค่า FAT 2 ค่าในรายการนี้ จะไม่ถูกพิจารณาว่าเป็น วอลุ่ม TFATหากค่าแตกต่างจาก 2 ระบบปฏิบัติการของ Microsoft บางระบบอาจพยายามเมานต์วอลุ่มนั้นเป็นวอลุ่ม TFAT และใช้คลัสเตอร์ที่สอง ( คลัสเตอร์ 1 ) ของ FAT แรกเพื่อกำหนดสถานะ TFAT |
| 0x011 | 0x06 | 2 | จำนวนสูงสุดของรายการในไดเร็กทอรีรากของ FAT12 หรือ FAT16 คือ 0 สำหรับ FAT32 ซึ่งไดเร็กทอรีรากจะถูกจัดเก็บไว้ในคลัสเตอร์ข้อมูลทั่วไป โปรดดูออฟเซ็ต0x02Cใน FAT32 EBPBs ค่า 0 โดยไม่มีFAT32 EBPB (ไม่มีลายเซ็น0x29หรือ0x28ที่ออฟเซ็ต0x042 ) อาจบ่งชี้ถึงไดเร็กทอรีรูทที่มีขนาดแปรผันได้ในการใช้งาน FAT12 และ FAT16 ที่ไม่เป็นมาตรฐานบางอย่าง ซึ่งจัดเก็บคลัสเตอร์เริ่มต้นของไดเร็กทอรีรูทไว้ใน รายการ คลัสเตอร์ 1ใน FAT [ 20 ]อย่างไรก็ตาม ส่วนขยายนี้ไม่ได้รับการสนับสนุนจากระบบปฏิบัติการหลัก[ 20 ]เนื่องจากอาจขัดแย้งกับการใช้งานอื่นๆ ของรายการคลัสเตอร์ 1 สำหรับแฟล็กการบำรุงรักษา เครื่องหมายสิ้นสุดโซ่ปัจจุบัน หรือส่วนขยาย TFAT ค่านี้จะต้องได้รับการปรับเพื่อให้รายการไดเร็กทอรีใช้เซกเตอร์ตรรกะเต็มเสมอ เนื่องจากแต่ละรายการไดเร็กทอรีใช้พื้นที่ 32 ไบต์ MS-DOS/PC DOS กำหนดให้ค่านี้เป็นพหุคูณของ 16 ค่าสูงสุดที่รองรับบนฟลอปปี้ดิสก์คือ 240 [ 6 ]ค่าสูงสุดที่รองรับโดย MS-DOS/PC DOS บนฮาร์ดดิสก์คือ 512 [ 6 ] DR-DOS รองรับการบูตจากวอลุ่ม FAT12/FAT16 หากไฟล์บูตอยู่ในรายการไดเร็กทอรีรูท 2048 รายการแรก |
| 0x013 | 0x08 | 2 | จำนวนเซกเตอร์เชิงตรรกะทั้งหมด 0 สำหรับ FAT32 (ถ้าเป็นศูนย์ ให้ใช้ค่า 4 ไบต์ที่ตำแหน่งออฟเซ็ต0x020 ) |
| 0x015 | 0x0A | 1 | คำอธิบายสื่อ (เปรียบเทียบ: FAT ID ): [ 21 ] [ 22 ] [ 23 ] [ nb 1 ]
ค่านี้ต้องสะท้อนถึงตัวอธิบายสื่อที่จัดเก็บไว้ (ในรายการสำหรับคลัสเตอร์ 0 ) ในไบต์แรกของสำเนาแต่ละชุดของ FAT ระบบปฏิบัติการบางระบบก่อน DOS 3.2 ( 86-DOS , MS-DOS / PC DOS 1.x และMSX-DOSเวอร์ชัน 1.0) จะไม่สนใจพารามิเตอร์ของเซกเตอร์บูตเลย และใช้ค่าตัวอธิบายสื่อจากไบต์แรกของ FAT เพื่อเลือกจากเทมเพลตพารามิเตอร์ที่กำหนดไว้ล่วงหน้าภายใน ต้องมากกว่าหรือเท่ากับ0xF0ตั้งแต่ DOS 4.0 เป็นต้นไป[ 6 ] บนไดร ฟ์แบบถอดได้ DR-DOS จะถือว่ามี BPB หากค่านี้มากกว่าหรือเท่ากับ0xF0 [ 6 ]ในขณะที่สำหรับดิสก์แบบคงที่ จะต้องเป็น0xF8จึงจะถือว่ามี BPB ในขั้นต้น ค่าเหล่านี้มีจุดประสงค์เพื่อใช้เป็นบิตแฟล็ก สำหรับสื่อแบบถอดได้ใดๆ ที่ไม่มีรูปแบบ BPB ที่รู้จักและตัวอธิบายสื่อเป็น0xF8หรือ0xFAถึง0xFF MS-DOS/PC DOS จะถือว่าบิตที่ 1 เป็นแฟล็กเพื่อเลือกรูปแบบ 9 เซกเตอร์ต่อแทร็กแทนที่จะเป็นรูปแบบ 8 เซกเตอร์ และบิตที่ 0 เป็นแฟล็กเพื่อระบุสื่อแบบสองด้าน[ 7 ] ค่า0x00ถึง0xEFและ0xF1ถึง0xF7สงวนไว้และห้ามใช้ |
| 0x016 | 0x0B | 2 | จำนวนเซกเตอร์เชิงตรรกะต่อตารางการจัดสรรไฟล์สำหรับ FAT12/FAT16 FAT32 กำหนดค่านี้เป็น 0 และใช้ค่า 32 บิตที่ตำแหน่งออฟเซ็ต0x024แทน |
DOS 3.0 BPB:
ส่วนขยายต่อไปนี้ได้รับการบันทึกไว้ตั้งแต่ DOS 3.0 อย่างไรก็ตาม ส่วนขยายเหล่านี้ได้รับการสนับสนุนแล้วใน DOS 2.11 บางฉบับ[ 28 ] MS-DOS 3.10 ยังคงรองรับรูปแบบ DOS 2.0 แต่สามารถใช้รูปแบบ DOS 3.0 ได้เช่นกัน
| การชดเชยภาคส่วน | ค่าชดเชย BPB | ความยาว (ไบต์) | สารบัญ |
|---|---|---|---|
| 0x00B | 0x00 | 13 | DOS 2.0 BPB |
| 0x018 | 0x0D | 2 | เซกเตอร์ทางกายภาพต่อแทร็กสำหรับดิสก์ที่มี เรขาคณิต INT 13h CHS [ 4 ]เช่น 15 สำหรับฟลอปปี้ดิสก์ขนาด "1.20 MB" (1200 KB) ค่าศูนย์ในช่องนี้หมายความว่าช่องนี้ถูกสงวนไว้ แต่ไม่ได้ถูกใช้งาน |
| 0x01A | 0x0F | 2 | จำนวนหัวสำหรับดิสก์ที่มีเรขาคณิต INT 13h CHS [ 4 ]เช่น 2 สำหรับฟลอปปี้ดิสก์สองด้าน บั๊กในระบบปฏิบัติการ MS-DOS/PC DOS ทุกเวอร์ชัน รวมถึงเวอร์ชัน 7.10 ทำให้ระบบปฏิบัติการเหล่านี้เกิดข้อผิดพลาดเมื่อใช้รูปทรงเรขาคณิต CHS ที่มีหัวอ่าน 256 หัว ดังนั้น BIOS เกือบทั้งหมดจึงเลือกใช้หัวอ่านสูงสุดเพียง 255 หัวเท่านั้น ค่าศูนย์ในช่องนี้หมายความว่าช่องนี้ถูกสงวนไว้ แต่ไม่ได้ถูกใช้งาน |
| 0x01C | 0x11 | 2 | จำนวนเซกเตอร์ที่ซ่อนอยู่ก่อนพาร์ติชันที่บรรจุวอลุ่ม FAT นี้ ฟิลด์นี้ควรเป็นศูนย์เสมอในสื่อที่ไม่ได้แบ่งพาร์ติชัน รายการใน DOS 3.0 นี้ไม่เข้ากันกับรายการที่คล้ายกันที่ตำแหน่งออฟเซ็ต0x01Cใน BPB ตั้งแต่ DOS 3.31 เป็นต้นไป ห้ามใช้หากค่าในช่องตรรกะที่ตำแหน่งออฟเซ็ต0x013เป็นศูนย์ |
DOS 3.2 BPB:
อย่างเป็นทางการแล้ว MS-DOS 3.20 ยังคงใช้รูปแบบของ DOS 3.0 แต่SYSได้FORMATมีการปรับเปลี่ยนเพื่อให้รองรับรูปแบบที่ยาวขึ้นอีก 6 ไบต์ (ซึ่งไม่ได้ใช้ทุกรายการ)
| การชดเชยภาคส่วน | ค่าชดเชย BPB | ความยาว (ไบต์) | สารบัญ |
|---|---|---|---|
| 0x00B | 0x00 | 19 | DOS 3.0 BPB |
| 0x01E | 0x13 | 2 | จำนวนเซกเตอร์เชิงตรรกะทั้งหมด รวมทั้งเซกเตอร์ที่ซ่อนอยู่ ข้อมูลใน DOS 3.2 นี้ไม่เข้ากันกับข้อมูลที่คล้ายกันที่ตำแหน่งออฟเซ็ต0x020ใน BPB ตั้งแต่ DOS 3.31 เป็นต้นไป ห้ามใช้หากค่าในช่องตรรกะที่ตำแหน่งออฟเซ็ต0x013เป็นศูนย์ |
DOS 3.31 BPB:
รูปแบบนี้ถูกนำมาใช้อย่างเป็นทางการใน DOS 3.31 และไม่ได้ใช้ใน DOS 3.2 อย่างไรก็ตาม โปรแกรมยูทิลิตี้บางตัวใน DOS 3.2 ได้รับการออกแบบให้รองรับรูปแบบใหม่นี้อยู่แล้ว เอกสารอย่างเป็นทางการแนะนำให้เชื่อถือค่าเหล่านี้เฉพาะในกรณีที่ค่าในช่องตรรกะที่ตำแหน่งออฟเซ็ต0x013เป็นศูนย์เท่านั้น
| การชดเชยภาคส่วน | ค่าชดเชย BPB | ความยาว (ไบต์) | สารบัญ |
|---|---|---|---|
| 0x00B | 0x00 | 13 | DOS 2.0 BPB |
| 0x018 | 0x0D | 2 | เซกเตอร์ทางกายภาพต่อแทร็กสำหรับดิสก์ที่มี เรขาคณิต INT 13h CHS [ 4 ]เช่น 18 สำหรับฟลอปปี้ดิสก์ขนาด "1.44 MB" (1440 KB) ไม่ได้ใช้สำหรับไดรฟ์ที่ไม่รองรับการเข้าถึง CHS อีกต่อไป เหมือนกับรายการที่มีตั้งแต่ DOS 3.0 ค่าศูนย์ในช่องนี้แสดงว่าช่องนี้ถูกสงวนไว้ แต่ไม่ได้ใช้งาน ค่า 0 อาจบ่งชี้ถึงการเข้าถึงเฉพาะ LBA เท่านั้น แต่ค่านี้อาจทำให้เกิดข้อผิดพลาดการหารด้วยศูนย์ในบูตโหลดเดอร์บางตัว ซึ่งสามารถหลีกเลี่ยงได้โดยการจัดเก็บค่ากลางคือ 1 ไว้ในช่องนี้ หากไม่สามารถจำลองรูปทรงเรขาคณิตของ CHS ได้อย่างเหมาะสม |
| 0x01A | 0x0F | 2 | จำนวนหัวสำหรับดิสก์ที่มีเรขาคณิต INT 13h CHS [ 4 ]เช่น 2 สำหรับฟลอปปี้ดิสก์แบบสองด้าน ไม่ได้ใช้สำหรับไดรฟ์ที่ไม่รองรับการเข้าถึง CHS อีกต่อไป เหมือนกับรายการที่มีตั้งแต่ DOS 3.0 บั๊กในระบบปฏิบัติการ MS-DOS/PC DOS ทุกเวอร์ชัน รวมถึงเวอร์ชัน 7.10 ทำให้ระบบปฏิบัติการเหล่านี้เกิดข้อผิดพลาดเมื่อใช้รูปทรงเรขาคณิต CHS ที่มีหัวอ่าน 256 หัว ดังนั้น BIOS เกือบทั้งหมดจึงเลือกใช้หัวอ่านสูงสุดเพียง 255 หัวเท่านั้น ค่าศูนย์ในช่องนี้แสดงว่าช่องนี้ถูกสงวนไว้ แต่ไม่ได้ใช้งาน ค่า 0 อาจบ่งชี้ถึงการเข้าถึงเฉพาะ LBA เท่านั้น แต่ค่านี้อาจทำให้เกิดข้อผิดพลาดการหารด้วยศูนย์ในบูตโหลดเดอร์บางตัว ซึ่งสามารถหลีกเลี่ยงได้โดยการจัดเก็บค่ากลางคือ 1 ไว้ในช่องนี้ หากไม่สามารถจำลองรูปทรงเรขาคณิตของ CHS ได้อย่างเหมาะสม |
| 0x01C | 0x11 | 4 | จำนวนเซกเตอร์ที่ซ่อนอยู่ก่อนพาร์ติชันที่มีวอลุ่ม FAT นี้ ฟิลด์นี้ควรเป็นศูนย์เสมอในสื่อที่ไม่ได้แบ่งพาร์ติชัน[ 24 ] [ 25 ] [ 26 ]รายการ DOS 3.31 นี้ไม่เข้ากันกับรายการที่คล้ายกันที่ออฟเซ็ต0x01Cใน BPB ของ DOS 3.0-3.3 อย่างน้อยที่สุด ก็สามารถเชื่อถือได้หากมีค่าเป็นศูนย์ หรือหากรายการเซกเตอร์เชิงตรรกะที่ออฟเซ็ต0x013เป็นศูนย์ หากพาร์ติชั่นนี้เป็นส่วนหนึ่งของAdvanced Active Partition (AAP) ที่เลือกไว้ในระหว่างการบูต ระบบ MBR ที่ได้รับการปรับปรุงจะอัปเดตรายการ BPB แบบไดนามิกเพื่อให้สะท้อนค่า "เซกเตอร์สัมพัทธ์" ในตารางพาร์ติชั่น ซึ่งจัดเก็บไว้ที่ออฟเซ็ต0x1B6ใน MBR ของ AAP หรือ NEWLDR เพื่อให้สามารถบูตระบบปฏิบัติการจากEBRได้ ( บูตโหลดเดอร์ GPT บางตัว (เช่นBootDuet ) ใช้ค่าออฟเซ็ตเซกเตอร์บูต0x1FA – 0x1FDเพื่อจัดเก็บ 4 ไบต์บนสุดของค่าเซกเตอร์ที่ซ่อนอยู่ 64 บิต สำหรับวอลุ่มที่อยู่นอกเซกเตอร์ 2 32 −1 แรก) |
| 0x020 | 0x15 | 4 | จำนวนเซกเตอร์เชิงตรรกะทั้งหมด (ถ้ามากกว่า 65535 มิฉะนั้น ให้ดูที่ออฟเซ็ต0x013 ) รายการใน DOS 3.31 นี้ไม่เข้ากันกับรายการที่คล้ายกันที่ออฟเซ็ ต 0x01Eใน DOS 3.2-3.3 BPBs ตามหลักการแล้ว จะต้องใช้เฉพาะเมื่อรายการเซกเตอร์เชิงตรรกะที่ออฟเซ็ต0x013เป็นศูนย์ แต่ระบบปฏิบัติการบางระบบ (DR DOS เวอร์ชันเก่าบางเวอร์ชัน) ใช้รายการนี้สำหรับดิสก์ขนาดเล็กกว่าด้วย สำหรับสื่อที่มีการแบ่งพาร์ติชั่น หากค่านี้และค่าที่ตำแหน่ง0x013เป็น 0 ทั้งคู่ (ดังที่พบในไดรฟ์ FAT16 ของ DOS 3.x บางไดรฟ์) ระบบปฏิบัติการหลายระบบ (รวมถึง MS-DOS/PC DOS) จะดึงค่าจากรายการของพาร์ติชั่นที่เกี่ยวข้อง (ที่ตำแหน่งออฟเซ็ต0xC ) ในMBRแทน หากค่าทั้งสองนี้เป็น 0 ในวอลุ่มที่ใช้FAT32 EBPBที่มีลายเซ็น0x29ค่าที่เกินขีดจำกัด 4,294,967,295 (2 32 −1) (เช่น วอลุ่ม DR-DOS บางส่วน ที่มีรายการคลัสเตอร์ 32 บิต) สามารถใช้รายการ 64 บิตที่ออฟเซ็ต0x052แทนได้ |
สูตรง่ายๆ แปลงหมายเลขคลัสเตอร์ที่กำหนดของวอลุ่มCNเป็นหมายเลขเซกเตอร์เชิงตรรกะLSN: [ 24 ] [ 25 ] [ 26 ]
- กำหนดค่า (เพียงครั้งเดียว) โดยที่จำนวนเซกเตอร์ที่สงวนไว้จะถูกจัดเก็บไว้ที่ออฟเซ็ต0x00Eจำนวน FAT ที่ออฟเซ็ต0x010จำนวนเซกเตอร์ต่อ FAT ที่ออฟเซ็ต0x016 (FAT12/FAT16) หรือ0x024 (FAT32) รายการในไดเร็กทอรีรูทที่ออฟเซ็ต0x011ขนาดเซกเตอร์ที่ออฟเซ็ต0x00Bและปัดเศษขึ้นเป็นจำนวนเต็ม
SSA=RSC+FN×SF+ceil((32×RDE)/SS)RSCFNSFRDESSceil(x) - กำหนด ตำแหน่งที่ จัดเก็บเซกเตอร์ต่อคลัสเตอร์ ไว้ที่ออฟเซ็ ต0x00D
LSN=SSA+(CN−2)×SCSC
ในสื่อที่ไม่ได้แบ่งพาร์ติชั่น จำนวนเซกเตอร์ที่ซ่อนอยู่ของวอลุ่มจะเป็นศูนย์ ดังนั้นLSNแอดเดรสLBAจึงเหมือนกันตราบใดที่ขนาดเซกเตอร์เชิงตรรกะของวอลุ่มเท่ากับขนาดเซกเตอร์ทางกายภาพของสื่อที่อยู่เบื้องหลัง ภายใต้เงื่อนไขเหล่านี้ การแปลงระหว่างCHSแอดเดรส จึงทำได้ง่าย LSNsเช่นกัน:
LSN=SPT×(HN+(NOS×TN))+SN−1โดยที่เซกเตอร์ต่อแทร็กSPTจะถูกจัดเก็บไว้ที่ออฟเซ็ต0x018และจำนวนด้านจะถูกจัดเก็บไว้ที่ออฟเซ็ต0x01Aหมายเลขแทร็กหมายเลขหัวและหมายเลขเซกเตอร์สอดคล้องกับCylinder-head-sector : สูตรนี้ให้การแปลง CHS เป็น LBA ที่ทราบแล้วNOSTNHNSN
บล็อกพารามิเตอร์ BIOS แบบขยาย
โครงสร้างเพิ่มเติมที่ใช้โดย FAT12 และ FAT16 ตั้งแต่ OS/2 1.0 และ DOS 4.0 หรือที่รู้จักกันในชื่อExtended BIOS Parameter Block (EBPB) (ไบต์ที่อยู่ต่ำกว่าตำแหน่งออฟเซ็ตเซกเตอร์0x024เหมือนกับ BPB ของ DOS 3.31):
| การชดเชยภาคส่วน | EBPB ออฟเซ็ต | ความยาว (ไบต์) | สารบัญ |
|---|---|---|---|
| 0x00B | 0x00 | 25 | DOS 3.31 BPB |
| 0x024 | 0x19 | 1 | หมายเลขไดรฟ์ทางกายภาพ ( 0x00สำหรับสื่อแบบถอดได้ (ตัวแรก), 0x80สำหรับดิสก์แบบติดตั้งถาวร (ตัวแรก) ตามINT 13h ) ค่าที่อนุญาตสำหรับไดรฟ์ทางกายภาพที่เป็นไปได้ขึ้นอยู่กับ BIOS คือ0x00 - 0x7Eและ0x80 - 0xFEค่า0x7Fและ0xFFสงวนไว้สำหรับวัตถุประสงค์ภายใน เช่น การบูตระยะไกลหรือ ROM และไม่ควรปรากฏในดิสก์ บูตโหลดเดอร์บางตัว เช่น บูตโหลดเดอร์ MS-DOS/PC DOS ใช้ค่านี้เมื่อโหลดระบบปฏิบัติการ บูตโหลดเดอร์อื่นๆ ไม่สนใจเลย หรือใช้หมายเลขไดรฟ์ที่ให้ไว้ในรีจิสเตอร์ DLโดยบูตโหลดเดอร์พื้นฐาน (เช่น ใน BIOS และ MBR หลายตัว) บางครั้งรายการนี้จะถูกเปลี่ยนแปลงโดย คำสั่ง SYSหรืออาจได้รับการแก้ไขแบบไดนามิกโดยบูตสแตรปโหลดเดอร์ก่อนหน้า เพื่อบังคับให้โค้ดเซกเตอร์บูตโหลดระบบปฏิบัติการจากดิสก์ทางกายภาพอื่นที่ไม่ใช่ค่าเริ่มต้น รายการที่คล้ายกันนี้เคยมีอยู่ (เฉพาะ) ในเซกเตอร์บูตของ DOS เวอร์ชัน 3.2 ถึง 3.31 ที่ตำแหน่งออฟเซ็ตเซกเตอร์ 0x1FD หากไดรฟ์นี้เป็นส่วนหนึ่งของไดรฟ์บูต ระบบ MBR ที่ได้รับการปรับปรุงของ DR-DOS 7.07 สามารถกำหนดค่าได้ (ดูที่ออฟเซ็ต NEWLDR 0x014 ) เพื่ออัปเดตค่า EBPB นี้แบบไดนามิกเป็นค่า DL ที่ให้ไว้ในระหว่างการบูตหรือค่าที่จัดเก็บไว้ในตารางพาร์ติชัน ซึ่งจะช่วยให้สามารถบูตจากไดรฟ์อื่นได้ แม้ว่า โค้ด VBRจะไม่สนใจค่า DL ก็ตาม |
| 0x025 | 0x1A | 1 | ที่สงวนไว้;
|
| 0x026 | 0x1B | 1 | ลายเซ็นบูตแบบขยาย (ควรเป็น0x29 [ 24 ] [ 25 ] [ 26 ] [ 21 ]เพื่อระบุว่ามี EBPB ที่มีรายการ 3 รายการต่อไปนี้ (ตั้งแต่ OS/2 1.2 และ DOS 4.0) อาจเป็น0x28บนดิสก์ OS/2 1.0-1.1 และ PC DOS 3.4 บางแผ่น ซึ่งบ่งชี้ถึงรูปแบบ EBPB รุ่นก่อนหน้าที่มีเพียงหมายเลขซีเรียลตามมา MS-DOS/PC DOS 4.0 ขึ้นไป, OS/2 1.2 ขึ้นไป รวมถึงตระกูล Windows NT รู้จักลายเซ็นทั้งสองแบบตามลำดับ) |
| 0x027 | 0x1C | 4 | รหัสประจำเครื่อง (หมายเลขซีเรียล) โดยทั่วไป หมายเลขลำดับ "xxxx-xxxx" จะถูกสร้างขึ้นโดยการบวกค่า DX ทั้งสองค่าที่ส่งคืนโดย INT 21h/AH=2Ah (รับวันที่ของระบบ) [ nb 6 ]และ INT 21h/AH=2Ch (รับเวลาของระบบ) [ nb 6 ]เข้าด้วยกันแบบ 16 บิต สำหรับคำสูง และการบวกค่า CX ทั้งสองค่าเข้าด้วยกันแบบ 16 บิต สำหรับคำต่ำของหมายเลขลำดับ หรืออีกทางเลือกหนึ่ง โปรแกรมยูทิลิตี้ดิสก์ DR-DOS บางตัวมี |
| 0x02B | 0x20 | 11 | ป้ายชื่อวอลุ่มของพาร์ติชั่น จะถูกเติมด้วยช่องว่าง ( 0x20 ) เช่น " " ซอฟต์แวร์ที่เปลี่ยนแปลงป้ายชื่อวอลุ่มของไดเร็กทอรีในระบบไฟล์ควรจะอัปเดตรายการนี้ด้วย แต่ไม่ใช่ทุกซอฟต์แวร์ที่จะทำเช่นนั้น ป้ายชื่อวอลุ่มของพาร์ติชั่นมักจะแสดงในเครื่องมือแบ่งพาร์ติชั่น เนื่องจากสามารถเข้าถึงได้โดยไม่ต้องเมานต์วอลุ่ม รองรับตั้งแต่ OS/2 1.2 และ MS-DOS 4.0 ขึ้นไป NO␠NAME␠␠␠␠ไม่สามารถใช้งานได้หากตั้งค่าลายเซ็นที่ 0x026 เป็น 0x28 พื้นที่นี้ถูกใช้โดยบูตเซกเตอร์ของ DOS เวอร์ชัน 3.2 ถึง 3.3 เพื่อจัดเก็บสำเนาส่วนตัวของตารางพารามิเตอร์ดิสก์ (DPT) แทนที่จะใช้ตัวชี้ INT 1Eh เพื่อดึงตาราง ROM เหมือนในบูตเซกเตอร์เวอร์ชันต่อมา การนำตำแหน่งนี้กลับมาใช้ใหม่สำหรับป้ายชื่อวอลุ่มพาร์ติชั่นซึ่งส่วนใหญ่เป็นเพียงการตกแต่ง ช่วยลดปัญหาหากยูทิลิตี้ระบบเก่าบางตัวยังคงพยายามแก้ไข DPT เดิม |
| 0x036 | 0x2B | 8 | ประเภทของระบบไฟล์ เติมด้วยช่องว่าง ( 0x20 ) เช่น " ", " ", " " FAT12␠␠␠FAT16␠␠␠FAT␠␠␠␠␠ข้อมูลนี้มีไว้สำหรับแสดงผลเท่านั้น และระบบปฏิบัติการไม่ควรนำไปใช้ในการระบุประเภทของระบบไฟล์ อย่างไรก็ตาม บางครั้งซอฟต์แวร์ของบุคคลที่สามอาจนำไปใช้ในการระบุประเภท ดังนั้นค่าที่ได้จึงไม่ควรแตกต่างจากค่าที่ใช้โดยทางการ รองรับตั้งแต่ OS/2 เวอร์ชัน 1.2 และ MS-DOS เวอร์ชัน 4.0 ขึ้นไป ไม่สามารถใช้งานได้หากตั้งค่าลายเซ็นที่ 0x026 เป็น 0x28 |
บล็อกพารามิเตอร์ BIOS แบบขยาย FAT32
โดยพื้นฐานแล้ว FAT32 จะแทรก 28 ไบต์ลงใน EBPB ตามด้วย ไบต์ EBPB ที่เหลืออีก 26 ไบต์ (หรือบางครั้งเพียง 7 ไบต์) ดังที่แสดงไว้ข้างต้นสำหรับ FAT12 และ FAT16 ระบบปฏิบัติการของ Microsoft และ IBM จะกำหนดประเภทของระบบไฟล์ FAT ที่ใช้ในวอลุ่มโดยพิจารณาจากจำนวนคลัสเตอร์เท่านั้น ไม่ใช่จากรูปแบบ BPB ที่ใช้หรือประเภทของระบบไฟล์ที่ระบุ กล่าวคือ ในทางเทคนิคแล้ว เป็นไปได้ที่จะใช้ "FAT32 EBPB" สำหรับวอลุ่ม FAT12 และ FAT16 เช่นเดียวกับ DOS 4.0 EBPB สำหรับวอลุ่ม FAT32 ขนาดเล็ก เนื่องจากพบว่าระบบปฏิบัติการ Windows สร้างวอลุ่มดังกล่าวภายใต้เงื่อนไขที่แปลกประหลาดบางประการ[ nb 7 ]ระบบปฏิบัติการจึงควรเตรียมพร้อมที่จะรับมือกับรูปแบบไฮบริดเหล่านี้
| การชดเชยภาคส่วน | ออฟเซ็ต FAT32 EBPB | ความยาว (ไบต์) | สารบัญ |
|---|---|---|---|
| 0x00B | 0x00 | 25 | DOS 3.31 BPB |
| 0x024 | 0x19 | 4 | ตารางการจัดสรรเซกเตอร์เชิงตรรกะต่อไฟล์ (ตรงกับรายการเดิมที่ตำแหน่งออฟเซ็ต 0x0B ใน DOS 2.0 BPB ) ไบต์ที่ตำแหน่งออฟเซ็ต0x026ในรายการนี้จะต้องไม่เป็น0x28หรือ0x29เพื่อหลีกเลี่ยงการตีความผิดพลาดในรูปแบบ EBPB บนระบบปฏิบัติการที่ไม่รองรับ FAT32 โชคดีที่ภายใต้สถานการณ์ปกติ (ขนาดเซกเตอร์ 512 ไบต์) เหตุการณ์นี้จะไม่เกิดขึ้น เนื่องจากระบบไฟล์ FAT32 มีคลัสเตอร์อย่างมากที่สุด 0xffffff6 = 268435446 คลัสเตอร์ เซกเตอร์ FAT หนึ่งเซกเตอร์สามารถบรรจุตัวอธิบายคลัสเตอร์ได้ 512 / 4 = 128 ตัว ดังนั้นจึงต้องการเซกเตอร์อย่างมากที่สุดเพียง ceil(268435446 / 128) = 2097152 = 0x200000 เซกเตอร์ ทำให้ไบต์ที่สามของจำนวนเซกเตอร์ FAT มีค่าอย่างมากที่สุด 0x20 ซึ่งน้อยกว่าค่าต้องห้าม 0x28 และ 0x29 |
| 0x028 | 0x1D | 2 | คำอธิบายไดรฟ์ / แฟล็กการทำมิเรอร์ (บิต 3-0: หมายเลข FAT ที่ใช้งานอยู่แบบศูนย์ หากบิต 7 ถูกตั้งค่า[ 4 ]หากบิต 7 ถูกล้าง FAT ทั้งหมดจะถูกทำมิเรอร์ตามปกติ บิตอื่นๆ สงวนไว้และควรเป็น 0) เซกเตอร์บูต FAT32 ของ DR-DOS 7.07 ที่รองรับทั้ง LBA และ CHS ใช้บิตที่ 15-8 ในการจัดเก็บแฟล็กการเข้าถึงและส่วนหนึ่งของข้อความ บิตเหล่านี้มีรูปแบบบิต0110:1111b (ตัวอักษร 'o' ตัวเล็ก บิตที่ 13 ตั้งค่าสำหรับการเข้าถึง CHS) หรือ0100:1111b (ตัวอักษร 'O' ตัวใหญ่ บิตที่ 13 ถูกล้างสำหรับการเข้าถึง LBA) ไบต์นี้ยังใช้สำหรับอักขระตัวที่สองในข้อความแสดงข้อผิดพลาด "No␠IBMBIO␠␠COM" (ดูออฟเซ็ต0x034 ) ซึ่งแสดงเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์ผสม เพื่อระบุว่าการเข้าถึงประเภทใดล้มเหลว เครื่องมือจัดรูปแบบหรือเครื่องมือที่ไม่ใช่ประเภท DR SYS อาจล้างบิตเหล่านี้ แต่เครื่องมือดิสก์อื่นๆ ควรปล่อยให้บิตที่ 15-8 ไม่เปลี่ยนแปลง |
| 0x02A | 0x1F | 2 | เวอร์ชัน (กำหนดเป็น 0.0) ไบต์สูงของหมายเลขเวอร์ชันจะถูกจัดเก็บที่ออฟเซ็ต0x02Bและไบต์ต่ำที่ออฟเซ็ต0x02A [ 4 ] การใช้งาน FAT32 ควรปฏิเสธการเมานต์วอลุ่มที่มีหมายเลขเวอร์ชันที่ไม่รู้จัก |
| 0x02C | 0x21 | 4 | หมายเลขคลัสเตอร์ของไดเร็กทอรีรากเริ่มต้น โดยทั่วไปคือ 2 (คลัสเตอร์แรก[ 33 ] ) หากไม่มีเซกเตอร์เสีย (การใช้งาน FAT32 ของ Microsoft กำหนดขีดจำกัดเทียมไว้ที่ 65,535 รายการต่อไดเร็กทอรี ในขณะที่การใช้งานของบุคคลที่สามจำนวนมากไม่ได้กำหนดขีดจำกัดนี้) ค่าคลัสเตอร์0ไม่ได้รับอนุญาตอย่างเป็นทางการ และไม่สามารถบ่งชี้คลัสเตอร์เริ่มต้นของไดเร็กทอรีรูทที่ถูกต้องได้ การใช้งาน FAT32 ที่ไม่ได้มาตรฐานบางอย่างอาจถือว่าค่านี้เป็นตัวบ่งชี้ในการค้นหาไดเร็กทอรีรูทที่มีขนาดคงที่ ซึ่งปกติแล้วจะพบได้ในวอลุ่ม FAT16 โปรดดูออฟเซ็ต 0x011 |
| 0x030 | 0x25 | 2 | หมายเลขเซกเตอร์เชิงตรรกะของเซกเตอร์ข้อมูลระบบไฟล์ (FS Information Sector)โดยทั่วไปคือ 1 ซึ่งหมายถึงเซกเตอร์บูตตัวที่สองจากทั้งหมดสามเซกเตอร์ของระบบไฟล์ FAT32 การใช้งาน FAT32 บางอย่างรองรับการเปลี่ยนแปลงเล็กน้อยของข้อกำหนดของ Microsoft ในการทำให้ FS Information Sector เป็นตัวเลือกโดยการระบุค่า0xFFFF [ 19 ] (หรือ0x0000 ) ในรายการนี้ เนื่องจากเซกเตอร์เชิงตรรกะ 0 ไม่สามารถเป็น FS Information Sector ที่ถูกต้องได้ แต่ FS Information Sector ใช้ลายเซ็นเดียวกันกับที่พบในเซกเตอร์บูตจำนวนมาก การใช้งานระบบไฟล์จึงไม่ควรพยายามใช้เซกเตอร์เชิงตรรกะ 0 เป็น FS Information Sector และควรสันนิษฐานว่าคุณสมบัตินี้ไม่ได้รับการสนับสนุนในวอลุ่มนั้นๆ หากไม่มี FS Information Sector ขนาดเซกเตอร์เชิงตรรกะ ขั้นต่ำที่อนุญาต ของวอลุ่ม FAT32 สามารถลดลงเหลือ 128 ไบต์สำหรับวัตถุประสงค์พิเศษได้ |
| 0x032 | 0x27 | 2 | หมายเลขเซกเตอร์เชิงตรรกะแรกของสำเนาของเซกเตอร์บูต FAT32 สามเซกเตอร์ โดยทั่วไปคือ 6 [ 4 ] เนื่องจากไดรฟ์ที่ฟอร์แมตด้วย FAT32 ใน DR-DOS 7.0x ใช้เซกเตอร์บูตแบบเซกเตอร์เดียว ดังนั้นไดรฟ์บางส่วนที่ฟอร์แมตด้วย DR-DOS จึงใช้ค่า 2 ในส่วนนี้ ค่า0x0000 [ 4 ] (และ/หรือ0xFFFF [ 19 ] ) จะถูกสงวนไว้และบ่งชี้ว่าไม่มีเซกเตอร์สำรองให้ใช้งาน |
| 0x034 | 0x29 | 12 | สงวนไว้ (อาจถูกเปลี่ยนเป็นไบต์เติมรูปแบบ0xF6 [ nb 8 ]เป็นอาร์ติแฟกต์โดย MS-DOS ต้องกำหนดค่าเริ่มต้นเป็น 0 โดยเครื่องมือจัดรูปแบบ แต่ห้ามเปลี่ยนแปลงโดยการใช้งานระบบไฟล์หรือเครื่องมือดิสก์ในภายหลัง) FDISKเซกเตอร์บูต FAT32 ของ DR-DOS 7.07 ใช้ 12 ไบต์เหล่านี้เพื่อเก็บชื่อไฟล์ของไฟล์ " " |
| 0x040 | 0x35 | 1 | ดู0x024สำหรับ FAT12/FAT16 (หมายเลขไดรฟ์ทางกายภาพ) BPB ของ exFATอยู่ที่ตำแหน่งออฟเซ็ตเซกเตอร์0x040ถึง0x077ซึ่งทับซ้อนกับรายการที่เหลือทั้งหมดของ EBPB มาตรฐานของ FAT32 รวมถึงรายการนี้ด้วย สามารถตรวจจับได้ผ่านลายเซ็นฉลาก OEM " " ที่ตำแหน่งออฟเซ็ตเซกเตอร์0x003ในกรณีนี้ ไบต์ที่ตำแหน่ง0x00B ถึง 0x03F โดยปกติจะถูกตั้งค่าเป็น0x00 |
| 0x041 | 0x36 | 1 | ดู0x025สำหรับ FAT12/FAT16 (ใช้สำหรับวัตถุประสงค์ต่างๆ โปรดดู FAT12/FAT16) อาจมีไบต์เติมรูปแบบ0xF6 [ nb 8 ] หลงเหลืออยู่ หลังจากการแบ่งพาร์ติชั่นด้วย MS-DOS FDISK แต่ยังไม่ได้ฟอร์แมต |
| 0x042 | 0x37 | 1 | ดู0x026สำหรับ FAT12/FAT16 (ลายเซ็นบูตแบบขยาย, 0x29 ) การใช้งานระบบไฟล์ FAT32 ส่วนใหญ่ไม่รองรับลายเซ็นทางเลือก0x28 [ 15 ]เพื่อระบุรูปแบบย่อของ FAT32 EBPB โดยมีเพียงหมายเลขซีเรียลตามมา (และไม่มีรายการป้ายชื่อวอลุ่มและประเภทระบบไฟล์) แต่เนื่องจากไบต์ที่ไม่ได้ใช้งานส่วนใหญ่ 19 ไบต์นี้อาจมีจุดประสงค์ที่แตกต่างกันในบางสถานการณ์ การใช้งานจึงควรยอมรับ0x28เป็นลายเซ็นทางเลือก จากนั้นจึงใช้ป้ายชื่อวอลุ่มไดเร็กทอรีในระบบไฟล์แทนใน EBPB เพื่อความเข้ากันได้กับส่วนขยายที่เป็นไปได้ |
| 0x043 | 0x38 | 4 | ดู0x027สำหรับ FAT12/FAT16 (รหัสไดรฟ์) |
| 0x047 | 0x3C | 11 | ดู0x02Bสำหรับ FAT12/FAT16 (ป้ายชื่อไดรฟ์) ไม่สามารถใช้งานได้หากตั้งค่าลายเซ็นที่ตำแหน่งออฟเซ็ต 0x042เป็น0x28 |
| 0x052 | 0x47 | 8 | ดู0x036สำหรับ FAT12/FAT16 (ประเภทระบบไฟล์ เติมด้วยช่องว่าง ( 0x20 ) เช่น " ") FAT32␠␠␠ไม่สามารถใช้งานได้หากตั้งค่าลายเซ็นที่ 0x042 เป็น 0x28 หากค่าจำนวนเซกเตอร์เชิงตรรกะทั้งหมดที่ตำแหน่งออฟเซ็ต0x020และ0x013เป็น 0 ทั้งสองค่าในวอลุ่มที่ใช้FAT32 EBPBที่มีลายเซ็น0x29วอลุ่มที่มีจำนวนเซกเตอร์มากกว่า 4,294,967,295 ( 2³² - 1) เซกเตอร์ (เช่น วอลุ่ม DR-DOS บางส่วน ที่มีรายการคลัสเตอร์ 32 บิต) สามารถใช้ค่านี้เป็น ค่า จำนวนเซกเตอร์เชิงตรรกะทั้งหมด 64 บิตแทนได้ ในกรณีนี้ ป้ายกำกับ OEM ที่ตำแหน่งออฟเซ็ตเซกเตอร์0x003 อาจถูกเรียกใช้เป็น ประเภทระบบไฟล์แบบใหม่แทน |
ข้อยกเว้น
ระบบปฏิบัติการ DOS เวอร์ชันก่อน 3.2 อาศัยไบต์ตัวอธิบายสื่อใน BPB หรือ ไบต์ FAT IDในคลัสเตอร์ 0 ของ FAT ตัวแรกทั้งหมดหรือบางส่วน เพื่อกำหนดรูปแบบดิสก์ FAT12 แม้ว่าจะมี BPB อยู่ก็ตาม โดยขึ้นอยู่กับ FAT ID ที่พบและประเภทของไดรฟ์ที่ตรวจพบ ระบบจะใช้ต้นแบบ BPB ต่อไปนี้โดยค่าเริ่มต้น แทนที่จะใช้ค่าที่จัดเก็บไว้จริงใน BPB [ nb 1 ]
เดิมที FAT ID ถูกออกแบบมาให้เป็นแฟล็กบิตที่มีบิตทั้งหมดตั้งค่าไว้ ยกเว้นบิตที่ 2 ที่ถูกล้างเพื่อระบุรูปแบบ 80 แทร็ก (เทียบกับ 40 แทร็ก) บิตที่ 1 ที่ถูกล้างเพื่อระบุรูปแบบ 9 เซกเตอร์ (เทียบกับ 8 เซกเตอร์) และบิตที่ 0 ที่ถูกล้างเพื่อระบุรูปแบบด้านเดียว (เทียบกับสองด้าน) [ 7 ]แต่รูปแบบนี้ไม่ได้ถูกนำไปใช้โดย OEM ทุกรายและกลายเป็นสิ่งล้าสมัยเมื่อมีการนำฮาร์ดดิสก์และรูปแบบความหนาแน่นสูงมาใช้ นอกจากนี้ รูปแบบ 8 นิ้วต่างๆ ที่รองรับโดย86-DOSและ MS-DOS ก็ไม่ตรงกับรูปแบบนี้
| FAT ID (เปรียบเทียบกับmedia IDที่ BPB offset 0x0A ) [ 22 ] [ 23 ] | 0xFF | 0xFE | 0xFD | 0xFC | 0xFB | 0xFA | 0xF9 | 0xF8 | 0xF0 | 0xED | 0xE5 | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| ขนาด | 8 นิ้ว | 5.25 นิ้ว | 8 นิ้ว | 8 นิ้ว | 5.25 นิ้ว | 8 นิ้ว | 8 นิ้ว | 5.25 นิ้ว | 5.25 นิ้ว | 5.25" / 3.5" | 5.25" / 3.5" | 5.25 นิ้ว | 3.5 นิ้ว | 3.5 นิ้ว | 5.25 นิ้ว | 5.25" / 3.5" | 3.5 นิ้ว | 3.5 นิ้ว | 3.5 นิ้ว | 5.25 นิ้ว | 8 นิ้ว |
| ความหนาแน่น | ? | DD 48tpi | เอสดี | ดีดี | DD 48tpi | เอสดี | เอสดี | DD 48tpi | DD 48tpi | ? | ? | HD 96tpi | DD 135tpi | ความละเอียดสูง 135tpi | QD 96tpi | ? | ดีดี | ความละเอียดสูง 135tpi | อีดี | QD 96tpi | เอสดี |
| การปรับสัญญาณ | ? | เอ็มเอฟเอ็ม | เอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอฟเอ็ม | เอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอ็มเอฟเอ็ม | เอฟเอ็ม |
| ความจุที่จัดรูปแบบแล้ว (KB) | ? | 320 | 250 ("เก่า") [ 28 ] [ 32 ] | 1200 | 160 | 250 ("ใหม่") [ 28 ] [ 32 ] | 500 | 360 | 180 | 640 | 320 | 1200 | 720 | 1440 | 720 | 360 | 360 | 1440 | 2880 | 720 | 243 / 250 |
| กระบอกสูบ (CHS) | 77 | 40 | 77 | 77 | 40 | 77 | 77 | 40 | 40 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 80 | 77 |
| เซกเตอร์ทางกายภาพ / แทร็ก(BPB ออฟเซ็ต0x0D ) | ? | 8 | 26 | 8 | 8 | 26 | 26 | 9 | 9 | 8 | 8 | 15 | 9 | 18 | 9 (8 [ 31 ] ) | 9 | 9 | 18 | 36 | 9 (8 [ 31 ] ) | 26 |
| จำนวนหัว(BPB offset 0x0F ) | ? | 2 | 1 [ 28 ] [ 32 ] | 2 [ 7 ] [ 22 ] [ 32 ] (1) | 1 | 1 [ 7 ] [ 28 ] [ 32 ] | 2 [ 22 ] | 2 | 1 | 2 | 1 | 2 | 2 | 2 | 2 | 1 | 1 | 2 | 2 | 2 | 1 |
| ไบต์เพย์โหลด / เซクターทางกายภาพ | ? | 512 | 128 | 1024 | 512 | 128 | 128 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 128 |
| ไบต์ / เซกเตอร์เชิงตรรกะ(ออฟเซ็ต BPB 0x00 ) | ? | 512 | 128 | 1024 | 512 | 128 | 128 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 512 | 128 |
| เซกเตอร์เชิงตรรกะ / คลัสเตอร์(BPB ออฟเซ็ต0x02 ) | ? | 2 | 4 | 1 | 1 | 4 | 4 | 2 | 1 | 2 | 1 [ 22 ] (2? [ 7 ] ) | 1 | 2 | 1 | ? | 2 | ? | 1 | 2 | ? | 4 |
| เซกเตอร์ตรรกะที่สงวนไว้(BPB ออฟเซ็ต0x03 ) | ? | 1 | 1 [ 28 ] [ 32 ] | 1 | 1 | 4 [ 28 ] [ 32 ] | 4 | 1 | 1 | 1 | 1 | 1 | 1 (2) | 1 | 1 | 1 | 1 | 1 | 1 | ? | 1 |
| จำนวน FAT (BPB offset 0x05 ) | ? | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
| รายการในไดเร็กทอรีราก(BPB ออฟเซ็ต0x06 ) | ? | 112 (7 ภาค) | 68 (17 ภาคส่วน) | 192 (6 ภาค) | 64 (4 ภาค) | 68 (17 ภาคส่วน) | 68 (17 ภาคส่วน) | 112 (7 ภาค) | 64 (4 ภาค) | 112 (7 ภาค) | 112 (7 ภาค) | 224 (14 ภาค) | 112 (7 ภาค) | 224 (14 ภาค) | ? | 112 (7 ภาค) | ? | 224 (14 ภาค) | 240 (15 ภาค) | ? | 64 (16 ภาค) |
| จำนวนเซกเตอร์เชิงตรรกะทั้งหมด(BPB offset 0x08 ) | ? | 640 | 2002 [ 28 ] [ 32 ] | 1232 [ 22 ] [ 32 ] (616 [ 7 ] ) | 320 | 2002 [ 7 ] [ 28 ] [ 32 ] | 4004 [ 22 ] | 720 | 360 | 1280 | 640 | 2400 | 1440 | 2880 | ? | 720 | ? | 2880 | 5760 | ? | 2002 |
| เซกเตอร์เชิงตรรกะ / FAT (ออฟเซ็ต BPB 0x0B ) | ? | 1 | 6 [ 28 ] [ 32 ] | 2 | 1 | 6 [ 28 ] [ 32 ] | 6? [ 22 ] | 2 | 2 | 2 | 2 [ 22 ] (1? [ 7 ] ) | 7 | 3 | 9 (7) | ? | 2 | ? | 9 | 9 | ? | 1 |
| เซกเตอร์ที่ซ่อนอยู่(BPB offset 0x11 ) | ? | 0 | 3 [ 22 ] (0 [ 7 ] ) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ? | 0 |
| จำนวนคลัสเตอร์ทั้งหมด | ? | 315 | 497 | 1227 | 313 | ? | 997? [ 22 ] | 354 | 351 | ? | ? | 2371 | 713 | 2847? | ? | ? | ? | 2847 | 2863 | ? | ? |
| ลำดับภาคตรรกะ | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? |
| การทำแผนที่ภาคส่วน | ? | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ เส้นทาง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ เส้นทาง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ? | ภาคส่วน+ เส้นทาง+ | ภาคส่วน+ เส้นทาง+ | ภาคส่วน+ หัว+ ราง+ | ภาคส่วน+ หัว+ ราง+ | ? | ภาคส่วน+ เส้นทาง+ |
| ภาคกายภาพแรก (CHS) | ? | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | ? | ? | 1 | 1 | 1 | ? | 1 | ? | 1 | 1 | ? | 1 |
DRIVER.SYS /F:n | ? | 0 | 3 | 4 | 0 | ? | 3 | 0 | 0 | ? | ? | 1 | 2 | 7 | ? | ? | ? | 7 | 9 | ? | 3 |
| การปรากฏตัวของ BPB | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ? | ใช่ | ใช่ | ใช่ | ? | ? | ? | ใช่ | ใช่ | ? | ? |
| สนับสนุน | ? | DOS 1.1 [ 32 ] | ดีโอเอส 2.0 | DOS 1.0 [ 32 ] | ? [ 28 ] [ 32 ] | ดีโอเอส 2.0 | ดีโอเอส 2.0 | ดีโอเอส 2.0 | ? | ? | ดีโอเอส 3.0 | ดีโอเอส 3.2 | ใช้ได้เฉพาะกับ DOS 3.2 เท่านั้น(DR-DOS) | Sanyo 55x DS-DOS 2.11 เท่านั้น | MS-DOS 3.1 [ 7 ] | เอ็มเอสเอ็กซ์-ดีโอเอส | ดีโอเอส 3.3 | ดีโอเอส 5.0 | Tandy 2000 เท่านั้น | DR-DOS เท่านั้น | |
Microsoft แนะนำให้แยกแยะความแตกต่างระหว่างรูปแบบ 8 นิ้วสองแบบสำหรับ FAT ID 0xFEโดยลองอ่านเครื่องหมายที่อยู่ความหนาแน่นเดียว หากเกิดข้อผิดพลาด สื่อจะต้องเป็นความหนาแน่นสองเท่า[ 23 ]
ตารางนี้ไม่ได้แสดงรายการ รูปแบบฟลอปปี้ดิสก์ FAT12ขนาด 8 นิ้วและ 5.25 นิ้วที่ไม่เข้ากันจำนวนหนึ่ง ซึ่งรองรับโดย 86-DOS ซึ่งแตกต่างกันทั้งในขนาดของรายการไดเร็กทอรี (16 ไบต์เทียบกับ 32 ไบต์) หรือในขอบเขตของพื้นที่เซกเตอร์ที่สงวนไว้ (หลายแทร็กทั้งหมดเทียบกับเซกเตอร์เชิงตรรกะเพียงหนึ่งเดียว)
การใช้งานรูปแบบ FAT12 ด้านเดียวขนาด 315 KB ที่ใช้ในMS-DOSสำหรับApricot PCและF1e [ 34 ]มีเค้าโครงเซกเตอร์บูตที่แตกต่างกัน เพื่อรองรับ BIOS ที่ไม่เข้ากันกับ IBM ของคอมพิวเตอร์เครื่องนั้น คำสั่งกระโดดและชื่อ OEM ถูกละเว้น และพารามิเตอร์ MS-DOS BPB (ออฟเซ็ต0x00B - 0x017ในเซกเตอร์บูตมาตรฐาน) อยู่ที่ออฟเซ็ต0x050 Portable , F1 , PC duoและXi FDรองรับรูปแบบ FAT12 สองด้านขนาด 720 KB ที่ไม่เป็นมาตรฐานแทน[ 34 ] ความแตกต่างในเค้าโครงเซกเตอร์บูตและรหัสสื่อทำให้รูปแบบเหล่านี้ไม่เข้ากันกับระบบปฏิบัติการอื่นๆ มากมาย พารามิเตอร์เรขาคณิตสำหรับรูปแบบเหล่านี้คือ:
- 315 KB: ไบต์ต่อเซกเตอร์เชิงตรรกะ: 512 ไบต์, เซกเตอร์เชิงตรรกะต่อคลัสเตอร์: 1, เซกเตอร์เชิงตรรกะที่สงวนไว้: 1, จำนวน FAT: 2, รายการไดเร็กทอรีรูท: 128, เซกเตอร์เชิงตรรกะทั้งหมด: 630, รหัส FAT: 0xFC , เซกเตอร์เชิงตรรกะต่อ FAT: 2, เซกเตอร์ทางกายภาพต่อแทร็ก: 9, จำนวนหัว: 1. [ 34 ] [ 35 ]
- 720 KB: ไบต์ต่อเซกเตอร์เชิงตรรกะ: 512 ไบต์, เซกเตอร์เชิงตรรกะต่อคลัสเตอร์: 2, เซกเตอร์เชิงตรรกะที่สงวนไว้: 1, จำนวน FAT: 2, รายการไดเร็กทอรีรูท: 176, เซกเตอร์เชิงตรรกะทั้งหมด: 1440, รหัส FAT: 0xFE , เซกเตอร์เชิงตรรกะต่อ FAT: 3, เซกเตอร์ทางกายภาพต่อแทร็ก: 9, จำนวนหัว: 2. [ 34 ]
เวอร์ชันต่อมาของApricot MS-DOSมีความสามารถในการอ่านและเขียนดิสก์ที่มีเซกเตอร์บูตมาตรฐาน นอกเหนือจากดิสก์ที่มีเซกเตอร์บูตของ Apricot รูปแบบเหล่านี้ยังได้รับการสนับสนุนโดยDOS Plus 2.1e/g สำหรับซีรี่ส์ Apricot ACT ด้วย
การดัดแปลง DOS Plus สำหรับBBC Master 512รองรับรูปแบบ FAT12 สองรูปแบบบนไดรฟ์ 5.25 นิ้ว 80 แทร็ก สองด้าน ความหนาแน่นสองเท่า ซึ่งไม่ได้ใช้เซกเตอร์บูตแบบดั้งเดิมเลย ดิสก์ข้อมูล 800 KB ละเว้นเซกเตอร์บูตและเริ่มต้นด้วยสำเนา FAT เพียงชุดเดียว[ 35 ]ไบต์แรกของ FAT ที่ย้ายตำแหน่งในเซกเตอร์ตรรกะ 0 ถูกใช้เพื่อกำหนดความจุของดิสก์ ดิสก์บูต 640 KB เริ่มต้นด้วย ระบบไฟล์ ADFS ขนาดเล็ก ที่มีบูตโหลดเดอร์ ตามด้วย FAT เพียงชุดเดียว[ 35 ] [ 36 ]นอกจากนี้ รูปแบบ 640 KB ยังแตกต่างกันโดยใช้หมายเลขเซกเตอร์ CHS ทางกายภาพที่เริ่มต้นด้วย 0 (ไม่ใช่ 1 อย่างที่ปกติใช้กัน) และเซกเตอร์ที่เพิ่มขึ้นตามลำดับ เซกเตอร์-แทร็ก-หัว (ไม่ใช่ เซกเตอร์-หัว-แทร็ก อย่างที่ปกติใช้กัน) [ 36 ] FAT เริ่มต้นที่จุดเริ่มต้นของแทร็กถัดไป ความแตกต่างเหล่านี้ทำให้ระบบปฏิบัติการอื่นไม่สามารถจดจำรูปแบบเหล่านี้ได้ พารามิเตอร์ทางเรขาคณิตสำหรับรูปแบบเหล่านี้มีดังนี้:
- 800 KB: ไบต์ต่อเซกเตอร์เชิงตรรกะ: 1024 ไบต์, เซกเตอร์เชิงตรรกะต่อคลัสเตอร์: 1, เซกเตอร์เชิงตรรกะที่สงวนไว้: 0, จำนวน FAT: 1, รายการไดเร็กทอรีรูท: 192, เซกเตอร์เชิงตรรกะทั้งหมด: 800, รหัส FAT: 0xFD , เซกเตอร์เชิงตรรกะต่อ FAT: 2, เซกเตอร์ทางกายภาพต่อแทร็ก: 5, จำนวนหัว: 2 [ 35 ] [ 36 ]
- 640 KB: ไบต์ต่อเซกเตอร์เชิงตรรกะ: 256 ไบต์, เซกเตอร์เชิงตรรกะต่อคลัสเตอร์: 8, เซกเตอร์เชิงตรรกะที่สงวนไว้: 16, จำนวน FAT: 1, รายการไดเร็กทอรีรูท: 112, เซกเตอร์เชิงตรรกะทั้งหมด: 2560, รหัส FAT: 0xFF , เซกเตอร์เชิงตรรกะต่อ FAT: 2, เซกเตอร์ทางกายภาพต่อแทร็ก: 16, จำนวนหัว: 2. [ 35 ] [ 36 ]
DOS Plus สำหรับ Master 512 ยังสามารถเข้าถึงดิสก์พีซีมาตรฐานที่ฟอร์แมตไว้ที่180 KBหรือ360 KB ได้ โดยใช้ไบต์แรกของ FAT ในเซกเตอร์ตรรกะที่ 1 เพื่อกำหนดความจุ
ไดร์ฟ DEC Rainbow 100 (ทุกรุ่น) รองรับฟอร์แมต FAT12 เพียงรูปแบบเดียว บนไดร์ฟ 5.25 นิ้ว แบบ 80 แทร็ก ด้านเดียว ความหนาแน่นสี่เท่า สองแทร็กแรกสงวนไว้สำหรับบูตโหลดเดอร์ แต่ไม่มี MBR หรือ BPB (MS-DOS ใช้ BPB แบบคงที่ในหน่วยความจำแทน) เซกเตอร์บูต (แทร็ก 0 ด้าน 0 เซกเตอร์ 1) เป็นโค้ด Z80 ที่ขึ้นต้นด้วย DI 0xF3บูตสแตรป 8088 ถูกโหลดโดย Z80 แทร็ก 1 ด้าน 0 เซกเตอร์ 2 เริ่มต้นด้วยไบต์ Media/FAT ID 0xFAดิสก์ที่ยังไม่ได้ฟอร์แมตจะใช้0xE5แทน ระบบไฟล์เริ่มต้นที่แทร็ก 2 ด้าน 0 เซกเตอร์ 1 มีสำเนา FAT 2 ชุด และ 96 รายการในไดเร็กทอรีรูท นอกจากนี้ยังมีการแมปแทร็กทางกายภาพไปยังตรรกะเพื่อให้เกิดการสลับเซกเตอร์แบบ 2:1 ดิสก์ได้รับการฟอร์แมตด้วย ภาคกายภาพเรียงลำดับหมายเลข 1 ถึง 10 บนแต่ละแทร็กหลังจากแทร็กที่สงวนไว้ แต่ภาคตรรกะตั้งแต่ 1 ถึง 10 ถูกจัดเก็บในภาคกายภาพ 1, 6, 2, 7, 3, 8, 4, 9, 5, 10 [ 37 ]
ภาคข้อมูล FS
“FS Information Sector” ถูกนำมาใช้ใน FAT32 [ 38 ]เพื่อเร่งความเร็วในการเข้าถึงการดำเนินการบางอย่าง (โดยเฉพาะการรับจำนวนพื้นที่ว่าง) โดยจะอยู่ที่หมายเลขเซกเตอร์เชิงตรรกะที่ระบุไว้ในเรคอร์ดบูต FAT32 EBPB ที่ตำแหน่ง0x030 (โดยปกติจะเป็นเซกเตอร์เชิงตรรกะที่ 1 ทันทีหลังจากเรคอร์ดบูต)
| ออฟเซ็ตไบต์ | ความยาว (ไบต์) | สารบัญ |
|---|---|---|
| 0x000 | 4 | ลายเซ็นภาคข้อมูล FS ( 0x52 0x52 0x61 0x41 = " ") RRaAตราบใดที่เซกเตอร์ข้อมูล FS ตั้งอยู่ในเซกเตอร์เชิงตรรกะที่ 1 ซึ่งเป็นตำแหน่งที่ FAT เริ่มต้นในระบบไฟล์ FAT12 และ FAT16 (โดยมีเซกเตอร์สำรองเพียงหนึ่งเดียว) การมีอยู่ของลายเซ็นนี้ทำให้มั่นใจได้ว่า DOS เวอร์ชันแรกๆ จะไม่พยายามเมานต์วอลุ่ม FAT32 เนื่องจาก DOS เวอร์ชันเหล่านั้นคาดหวังว่าค่าในคลัสเตอร์ 0และคลัสเตอร์ 1จะต้องเป็นไปตามรูปแบบบิตบางอย่าง ซึ่งลายเซ็นนี้ไม่ตรงตามเงื่อนไข |
| 0x004 | 480 | สงวนไว้ (ค่าไบต์ควรถูกตั้งค่าเป็น0x00ระหว่างการจัดรูปแบบ แต่ไม่ควรเชื่อถือและไม่ควรเปลี่ยนแปลงในภายหลัง) |
| 0x1E4 | 4 | ลายเซ็นภาคข้อมูล FS ( 0x72 0x72 0x41 0x61 = " ") rrAa |
| 0x1E8 | 4 | จำนวนคลัสเตอร์ข้อมูลว่างล่าสุดที่ทราบในวอลุ่ม หรือ0xFFFFFFFFหากไม่ทราบ ควรตั้งค่าเป็น0xFFFFFFFFระหว่างการฟอร์แมต และระบบปฏิบัติการจะอัปเดตในภายหลัง ไม่ควรเชื่อถือค่านี้อย่างแน่นอนในทุกกรณี ก่อนใช้ค่านี้ ระบบปฏิบัติการควรตรวจสอบความถูกต้องของค่านี้ว่าน้อยกว่าหรือเท่ากับจำนวนคลัสเตอร์ของวอลุ่ม |
| 0x1EC | 4 | หมายเลขคลัสเตอร์ข้อมูลที่ได้รับการจัดสรรล่าสุด ควรตั้งค่าเป็น0xFFFFFFFFระหว่างการฟอร์แมต และระบบปฏิบัติการจะอัปเดตในภายหลัง ด้วยค่า0xFFFFFFFFระบบควรเริ่มต้นที่คลัสเตอร์0x00000002ไม่ควรเชื่อถือค่านี้อย่างแน่นอนว่าถูกต้องในทุกสถานการณ์ ก่อนใช้ค่านี้ ระบบปฏิบัติการควรตรวจสอบความถูกต้องของหมายเลขคลัสเตอร์บนวอลุ่มก่อน |
| 0x1F0 | 12 | สงวนไว้ (ค่าไบต์ควรถูกตั้งค่าเป็น0x00ระหว่างการจัดรูปแบบ แต่ไม่ควรเชื่อถือและไม่ควรเปลี่ยนแปลงในภายหลัง) |
| 0x1FC | 4 | ลายเซ็นเซกเตอร์ข้อมูล FS ( 0x00 0x00 0x55 0xAA ) [ 4 ] [ nb 2 ] (ไบต์ทั้งสี่ต้องตรงกันก่อนจึงจะถือว่าเนื้อหาของเซกเตอร์นี้อยู่ในรูปแบบที่ถูกต้อง) |
ข้อมูลในเซกเตอร์นี้อาจล้าสมัยและไม่สะท้อนเนื้อหาสื่อปัจจุบัน เนื่องจากระบบปฏิบัติการบางระบบไม่ได้อัปเดตหรือใช้เซกเตอร์นี้ และถึงแม้จะใช้ เนื้อหาก็จะไม่ถูกต้องเมื่อถอดสื่อออกโดยไม่ได้ยกเลิกการเชื่อมต่อวอลุ่มอย่างถูกต้อง หรือหลังจากไฟฟ้าดับ ดังนั้น ระบบปฏิบัติการควรตรวจสอบบิตแฟล็กสถานะการปิดระบบเสริมของวอลุ่มที่อยู่ในรายการ FAT ของคลัสเตอร์ 1หรือ FAT32 EBPB ที่ออฟเซ็ต0x041 ก่อน และละเว้นข้อมูลที่จัดเก็บในเซกเตอร์ข้อมูล FS หากบิตแฟล็กเหล่านี้ระบุว่าวอลุ่มไม่ได้ถูกยกเลิกการเชื่อมต่ออย่างถูกต้องก่อนหน้านี้ การดำเนินการนี้ไม่ก่อให้เกิดปัญหาใด ๆ นอกเหนือจากอาจทำให้ความเร็วในการสอบถามพื้นที่ว่างครั้งแรกหรือการจัดสรรคลัสเตอร์ข้อมูลลดลง โปรดดูที่หัวข้อ การแตกกระจายของข้อมูล (fragmentation )
หากเซกเตอร์นี้มีอยู่ในวอลุ่ม FAT32 ขนาดเซกเตอร์เชิงตรรกะ ขั้นต่ำที่อนุญาต คือ 512 ไบต์ ในขณะที่ถ้าไม่มีเซกเตอร์นี้จะเป็น 128 ไบต์ การใช้งาน FAT32 บางอย่างรองรับการเปลี่ยนแปลงเล็กน้อยจากข้อกำหนดของ Microsoft โดยทำให้เซกเตอร์ข้อมูล FS เป็นตัวเลือกโดยการระบุค่า0xFFFF [ 19 ] (หรือ0x0000 ) ในรายการ ที่ ออฟเซ็ต0x030
บริเวณไขมัน
ตารางการจัดสรรไฟล์
แผนที่คลัสเตอร์
พื้นที่ข้อมูลของวอลุ่มจะถูกแบ่งออกเป็นคลัสเตอร์ ที่มีขนาดเท่ากัน ซึ่งเป็นบล็อก ขนาดเล็กของพื้นที่ต่อเนื่องกัน ขนาดของคลัสเตอร์จะแตกต่างกันไปขึ้นอยู่กับประเภทของระบบไฟล์ FAT ที่ใช้และขนาดของไดรฟ์ โดยทั่วไปขนาดของคลัสเตอร์จะมีตั้งแต่ 2 ถึง32 KiB [ 39 ]
แต่ละไฟล์อาจใช้พื้นที่ในคลัสเตอร์หนึ่งคลัสเตอร์หรือมากกว่านั้น ขึ้นอยู่กับขนาดของไฟล์ ดังนั้น ไฟล์จึงถูกแสดงใน FAT ด้วยรายการเชื่อมโยงแบบเดี่ยว (singly linked list ) FAT ประกอบด้วยรายการที่มีความยาว 12, 16 หรือ 32 บิต ขึ้นอยู่กับว่าเป็น FAT12, FAT16 หรือ FAT32 รายการที่ต่อเนื่องกันจะสอดคล้องกับคลัสเตอร์ที่ต่อเนื่องกัน และค่าของรายการนั้นเป็นลิงก์ที่บอกว่าคลัสเตอร์ถัดไปในไฟล์นั้นคืออะไร การดูที่รายการที่สอดคล้องกับคลัสเตอร์นั้นจะบอกว่าคลัสเตอร์ถัดไปอยู่ที่ไหน และเป็นเช่นนี้ไปเรื่อยๆ จนกว่าจะมีรายการที่ระบุว่าสอดคล้องกับคลัสเตอร์สุดท้ายในห่วงโซ่คลัสเตอร์ที่เก็บไฟล์นั้น คลัสเตอร์ไม่จำเป็นต้องอยู่ติดกันบนพื้นผิวของดิสก์ แต่ส่วนใหญ่จะกระจายอยู่ทั่วพื้นที่ข้อมูล (Data Region)
แต่ละเวอร์ชันของระบบไฟล์ FAT ใช้ขนาดที่แตกต่างกันสำหรับรายการ FAT ตัวเลขที่เล็กกว่าจะทำให้ไฟล์ FAT มีขนาดเล็กลง แต่จะสิ้นเปลืองพื้นที่ในพาร์ติชันขนาดใหญ่เนื่องจากต้องจัดสรรเป็นกลุ่มขนาดใหญ่
ระบบ ไฟล์ FAT12ใช้ 12 บิตต่อรายการ FAT ดังนั้นสองรายการจึงใช้พื้นที่ 3 ไบต์ ระบบนี้เป็นแบบlittle-endian อย่างสม่ำเสมอ : หากพิจารณาสามไบต์นั้นเป็นตัวเลข 24 บิตแบบ little-endian หนึ่งตัว บิตที่มีค่าต่ำที่สุด 12 บิตจะแสดงถึงรายการแรก (เช่น คลัสเตอร์ 0) และบิตที่มีค่าสูงที่สุด 12 บิตจะแสดงถึงรายการที่สอง (เช่น คลัสเตอร์ 1) กล่าวอีกนัยหนึ่งคือ บิตแปดบิตล่างของคลัสเตอร์แรกในแถวจะถูกเก็บไว้ในไบต์แรก บิตสี่บิตบนจะถูกเก็บไว้ใน nibble ล่างของไบต์ที่สอง ในขณะที่บิตสี่บิตล่างของคลัสเตอร์ถัดไปในแถวจะถูกเก็บไว้ใน nibble บนของไบต์ที่สอง และบิตแปดบิตบนจะถูกเก็บไว้ในไบต์ที่สาม
| ออฟเซ็ต | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +เอ | +บี | +ซี | +D | +E | +เอฟ |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| +0000 | เอฟ0 | เอฟ เอฟ | เอฟเอฟ | 03 | 40 | 00 | 05 | 60 | 00 | 07 | 80 | 00 | เอฟเอฟ | เอเอฟ | 00 | 14 |
| +0010 | ซี0 | 00 | 0D | อี0 | 00 | 0F | 00 | 01 | 11 | เอฟ 0 | เอฟเอฟ | 00 | เอฟ 0 | เอฟเอฟ | 15 | 60 |
| +0020 | 01 | 19 | 7 0 | เอฟเอฟ | เอฟ7 | เอเอฟ | 01 | เอฟเอฟ | 0 องศาฟาเรนไฮต์ | 00 | 00 | 7 0 | เอฟเอฟ | 00 | 00 | 00 |
- รหัส FAT / ตัวบ่งชี้ลำดับไบต์ (ในคลัสเตอร์ที่สงวนไว้#0 ) โดย0xF0บ่งชี้ถึงวอลุ่มบน ไดรฟ์ ซูเปอร์ฟลอปปี้ ที่ไม่ได้แบ่งพาร์ติชั่น (ต้องเป็น0xF8สำหรับดิสก์ที่แบ่งพาร์ติชั่นแล้ว)
- ตัวบ่งชี้สิ้นสุดของห่วงโซ่ / แฟล็กการบำรุงรักษา (ในคลัสเตอร์ที่สงวนไว้#1 )
- โซ่ที่สอง (7 คลัสเตอร์) สำหรับไฟล์ที่ไม่แตกเป็นส่วนๆ (ในที่นี้คือ: #2, #3, #4, #5, #6, #7, #8)
- โซ่ที่สาม (7 คลัสเตอร์) สำหรับไฟล์ที่แตกเป็นส่วนๆ ซึ่งอาจขยายใหญ่ขึ้น (ในที่นี้: #9, #A, #14, #15, #16, #19, #1A)
- โซ่ที่สี่ (7 คลัสเตอร์) สำหรับไฟล์ที่ไม่แตกเป็นส่วนๆ หรืออาจถูกตัดทอน (ในที่นี้: #B, #C, #D, #E, #F, #10, #11)
- คลัสเตอร์ว่างเปล่า (ในที่นี้: #12, #1B, #1C, #1E, #1F)
- โซ่ที่ห้า (1 คลัสเตอร์) สำหรับไดเร็กทอรีย่อย (ในที่นี้คือ: #13)
- คลัสเตอร์ที่มีปัญหา (3 คลัสเตอร์) (ในที่นี้: #17, #18, #1D)
The FAT16 file system uses 16 bits per FAT entry, thus one entry spans two bytes in little-endian byte order:
| Offset | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| +0000 | F0 | FF | FF | FF | 03 | 00 | 04 | 00 | 05 | 00 | 06 | 00 | 07 | 00 | 08 | 00 |
| +0010 | FF | FF | 0A | 00 | 14 | 00 | 0C | 00 | 0D | 00 | 0E | 00 | 0F | 00 | 10 | 00 |
| +0020 | 11 | 00 | FF | FF | 00 | 00 | FF | FF | 15 | 00 | 16 | 00 | 19 | 00 | F7 | FF |
| +0030 | F7 | FF | 1A | 00 | FF | FF | 00 | 00 | 00 | 00 | F7 | FF | 00 | 00 | 00 | 00 |
The FAT32 file system uses 32 bits per FAT entry, thus one entry spans four bytes in little-endian byte order. The four top bits of each entry are reserved for other purposes; they are cleared during formatting and should not be changed otherwise. They must be masked off before interpreting the entry as 28-bit cluster address.
| Offset | +0 | +1 | +2 | +3 | +4 | +5 | +6 | +7 | +8 | +9 | +A | +B | +C | +D | +E | +F |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| +0000 | F0 | FF | FF | 0F | FF | FF | FF | 0F | FF | FF | FF | 0F | 04 | 00 | 00 | 00 |
| +0010 | 05 | 00 | 00 | 00 | 06 | 00 | 00 | 00 | 07 | 00 | 00 | 00 | 08 | 00 | 00 | 00 |
| +0020 | FF | FF | FF | 0F | 0A | 00 | 00 | 00 | 14 | 00 | 00 | 00 | 0C | 00 | 00 | 00 |
| +0030 | 0D | 00 | 00 | 00 | 0E | 00 | 00 | 00 | 0F | 00 | 00 | 00 | 10 | 00 | 00 | 00 |
| +0040 | 11 | 00 | 00 | 00 | FF | FF | FF | 0F | 00 | 00 | 00 | 00 | FF | FF | FF | 0F |
| +0050 | 15 | 00 | 00 | 00 | 16 | 00 | 00 | 00 | 19 | 00 | 00 | 00 | F7 | FF | FF | 0F |
| +0060 | F7 | FF | FF | 0F | 1A | 00 | 00 | 00 | FF | FF | FF | 0F | 00 | 00 | 00 | 00 |
| +0070 | 00 | 00 | 00 | 00 | F7 | FF | FF | 0F | 00 | 00 | 00 | 00 | 00 | 00 | 00 | 00 |
- First chain (1 cluster) for the root directory, pointed to by an entry in the FAT32 BPB (here: #2)
- Second chain (6 clusters) for a non-fragmented file (here: #3, #4, #5, #6, #7, #8)
The File Allocation Table (FAT) is a contiguous number of sectors immediately following the area of reserved sectors. It represents a list of entries that map to each cluster on the volume. Each entry records one of four things:
- the cluster number of the next cluster in a chain
- a special end of cluster-chain (EOC) entry that indicates the end of a chain
- a special entry to mark a bad cluster
- a zero to note that the cluster is unused
For very early versions of DOS to recognize the file system, the system must have been booted from the volume or the volume's FAT must start with the volume's second sector (logical sector 1 with physical CHS address 0/0/2 or LBA address 1), that is, immediately following the boot sector. Operating systems assume this hard-wired location of the FAT in order to find the FAT ID in the FAT's cluster 0 entry on DOS 1.0-1.1 FAT diskettes, where no valid BPB is found.
Special entries
The first two entries in a FAT store special values:
รายการแรก (คลัสเตอร์ 0 ใน FAT) เก็บค่า FAT ID ตั้งแต่MS-DOS 1.20และPC DOS 1.1 (ค่าที่อนุญาตคือ0xF0 - 0xFFโดย สงวน 0xF1 - 0xF7 ) ในบิตที่ 7-0 ซึ่งจะถูกคัดลอกไปยัง BPB ของบูตเซกเตอร์ที่ออฟเซ็ต0x015ตั้งแต่ DOS 2.0 บิตที่เหลืออีก 4 บิต (ถ้าเป็น FAT12), 8 บิต (ถ้าเป็น FAT16) หรือ 20 บิต (ถ้าเป็น FAT32 โดย 4 บิต MSB เป็นศูนย์) ของรายการนี้จะเป็น 1 เสมอ ค่าเหล่านี้ถูกจัดเรียงเพื่อให้รายการนี้ทำหน้าที่เป็นเครื่องหมาย "ดักจับทั้งหมด" สำหรับจุดสิ้นสุดของห่วงโซ่สำหรับคลัสเตอร์ข้อมูลทั้งหมดที่มีค่าเป็นศูนย์ นอกจากนี้ สำหรับ FAT ID อื่นๆ นอกเหนือจาก0xFF (และ0x00 ) ก็สามารถกำหนดลำดับนิบเบิลและไบต์ที่ถูกต้องที่จะใช้โดยไดรเวอร์ระบบไฟล์ได้ อย่างไรก็ตาม ระบบไฟล์ FAT ใช้ การแสดงผลแบบ little-endianเท่านั้น และไม่มีการใช้งานรูปแบบใดๆ ที่ใช้ ค่า big-endianแทน86-DOS 0.42จนถึงMS-DOS 1.14ใช้โปรไฟล์ไดรฟ์แบบตายตัวแทน FAT ID แต่ใช้ไบต์นี้เพื่อแยกความแตกต่างระหว่างสื่อที่ฟอร์แมตด้วยรายการไดเร็กทอรี 32 ไบต์หรือ 16 ไบต์ ตามที่ใช้ก่อน 86-DOS 0.42
รายการที่สอง (คลัสเตอร์ 1 ในระบบไฟล์ FAT) โดยปกติจะเก็บเครื่องหมายสิ้นสุดของห่วงโซ่คลัสเตอร์ตามที่ตัวจัดรูปแบบใช้ แต่โดยทั่วไปแล้วจะเก็บค่า0xFFF / 0xFFFF / 0x0FFFFFFF เสมอ กล่าวคือ ยกเว้นบิตที่ 31-28 บนไดรฟ์ FAT32 บิตเหล่านี้มักจะถูกตั้งค่าไว้เสมอ อย่างไรก็ตาม ระบบปฏิบัติการของ Microsoft บางระบบจะตั้งค่าบิตเหล่านี้หากไดรฟ์นั้นไม่ใช่ไดรฟ์ที่เก็บระบบปฏิบัติการที่กำลังทำงานอยู่ (กล่าวคือ ใช้0xFFFFFFFFแทน0x0FFFFFFFในที่นี้) [ 40 ] (เมื่อใช้ร่วมกับเครื่องหมายสิ้นสุดโซ่ทางเลือก บิตต่ำสุด 2-0 สามารถเป็นศูนย์ได้สำหรับเครื่องหมายสิ้นสุดโซ่ที่อนุญาตต่ำสุด0xFF8 / 0xFFF8 / 0x?FFFFFF8 ; ควรสงวนบิต 3 ไว้เช่นกัน เนื่องจากคลัสเตอร์0xFF0 / 0xFFF0 / 0x?FFFFFF0และสูงกว่านั้นถูกสงวนไว้อย่างเป็นทางการ ระบบปฏิบัติการบางระบบอาจไม่สามารถเมานต์วอลุ่มบางส่วนได้หากบิตเหล่านี้ไม่ได้ตั้งค่า ดังนั้นเครื่องหมายสิ้นสุดโซ่เริ่มต้นจึงไม่ควรเปลี่ยนแปลง) สำหรับ DOS 1 และ 2 รายการนี้ได้รับการบันทึกไว้ว่าสงวนไว้สำหรับการใช้งานในอนาคต
ตั้งแต่ DOS 7.1 บิตที่มีนัยสำคัญที่สุดสองบิตของรายการคลัสเตอร์นี้อาจเก็บบิตแฟล็กเสริมสองตัวที่แสดงสถานะวอลุ่มปัจจุบันบน FAT16 และ FAT32 แต่ไม่ใช่บนวอลุ่ม FAT12 บิตแฟล็กเหล่านี้ไม่ได้รับการสนับสนุนโดยระบบปฏิบัติการทั้งหมด แต่ระบบปฏิบัติการที่รองรับคุณสมบัตินี้จะตั้งค่าบิตเหล่านี้เมื่อปิดระบบและล้างบิตที่มีนัยสำคัญที่สุดเมื่อเริ่มต้นระบบ: หากบิต 15 (บน FAT16) หรือบิต 27 (บน FAT32) [ 41 ]ไม่ได้รับการตั้งค่าเมื่อทำการเมานต์วอลุ่ม แสดงว่าวอลุ่มไม่ได้ถูกยกเลิกการเมานต์อย่างถูกต้องก่อนปิดระบบหรือนำออก ดังนั้นจึงอยู่ในสถานะที่ไม่ทราบและอาจ "สกปรก" [ 27 ]บนวอลุ่ม FAT32 เซกเตอร์ข้อมูล FSอาจมีข้อมูลที่ล้าสมัย ดังนั้นจึงไม่ควรใช้ โดยทั่วไประบบปฏิบัติการจะเรียกใช้SCANDISKหรือCHKDSKในการเริ่มต้นระบบครั้งถัดไป[ nb 10 ] [ 41 ] (แต่ไม่ใช่เมื่อเสียบสื่อแบบถอดได้) เพื่อให้แน่ใจและอาจสร้างความสมบูรณ์ของวอลุ่มขึ้นใหม่ หากบิตที่ 14 (บน FAT16) หรือบิตที่ 26 (บน FAT32) [ 41 ]ถูกล้าง ระบบปฏิบัติการจะพบข้อผิดพลาด I/O ของดิสก์เมื่อเริ่มต้นระบบ[ 41 ]ซึ่งอาจเป็นสัญญาณบ่งชี้ถึงเซกเตอร์เสีย ระบบปฏิบัติการที่รับรู้ส่วนขยายนี้จะตีความสิ่งนี้ว่าเป็นคำแนะนำให้ทำการสแกนพื้นผิว ( SCANDISK ) ในการบูตครั้งถัดไป[ 27 ] [ 41 ] (ชุดบิตแฟลกที่คล้ายกันมีอยู่ใน FAT12/FAT16 EBPB ที่ออฟเซ็ต0x1Aหรือ FAT32 EBPB ที่ออฟเซ็ต0x36ในขณะที่ไดรเวอร์ระบบไฟล์สามารถเข้าถึงรายการคลัสเตอร์ 1 ได้เมื่อติดตั้งวอลุ่มแล้ว รายการ EBPB จะพร้อมใช้งานแม้ว่าวอลุ่มจะยังไม่ได้ติดตั้ง ดังนั้นจึงใช้งานได้ง่ายกว่าโดยไดรเวอร์อุปกรณ์บล็อกดิสก์หรือเครื่องมือแบ่งพาร์ติชัน)
หากไม่ได้ตั้งค่าจำนวน FAT ใน BPB เป็น 2 รายการคลัสเตอร์ที่สองใน FAT แรก (คลัสเตอร์ 1) อาจสะท้อนสถานะของ วอลุ่ม TFATสำหรับระบบปฏิบัติการที่รองรับ TFAT หากรายการคลัสเตอร์ 1 ใน FAT นั้นมีค่าเป็น 0 อาจบ่งชี้ว่า FAT ที่สองแสดงถึงสถานะธุรกรรมที่ถูกต้องล่าสุดที่ทราบ และควรคัดลอกทับ FAT แรก ในขณะที่ FAT แรกควรคัดลอกทับ FAT ที่สองหากบิตทั้งหมดถูกตั้งค่า
การใช้งาน FAT12/FAT16 ที่ไม่เป็นไปตามมาตรฐานบางอย่างใช้รายการคลัสเตอร์ 1 เพื่อจัดเก็บคลัสเตอร์เริ่มต้นของไดเร็กทอรีรูทที่มีขนาดแปรผันได้ (โดยทั่วไปคือ 2 [ 33 ] ) ซึ่งอาจเกิดขึ้นเมื่อจำนวนรายการไดเร็กทอรีรูทใน BPB มีค่าเป็น 0 และไม่พบ FAT32 EBPB (ไม่มีลายเซ็น0x29หรือ0x28ที่ออฟเซ็ต0x042 ) [ 20 ]อย่างไรก็ตาม ส่วนขยายนี้ไม่ได้รับการสนับสนุนจากระบบปฏิบัติการหลัก[ 20 ]เนื่องจากขัดแย้งกับการใช้งานอื่นๆ ที่เป็นไปได้ของรายการคลัสเตอร์ 1 ความขัดแย้งส่วนใหญ่สามารถตัดออกได้หากอนุญาตให้ใช้ส่วนขยายนี้เฉพาะกับ FAT12 ที่มีคลัสเตอร์น้อยกว่า0xFEFและวอลุ่ม FAT16 ที่มีคลัสเตอร์น้อยกว่า0x3FEFและ 2 FAT เท่านั้น
เนื่องจากรายการ FAT สองรายการแรกนี้จัดเก็บค่าพิเศษ จึงไม่มีคลัสเตอร์ข้อมูล 0 หรือ 1 คลัสเตอร์ข้อมูลแรก (หลังจากไดเร็กทอรีรากหากเป็น FAT12/FAT16) คือคลัสเตอร์ 2 [ 33 ]ซึ่งเป็นจุดเริ่มต้นของพื้นที่ข้อมูล
ค่าคลัสเตอร์
ค่าอินพุต FAT:
| เอฟที12 | เอฟที16 | เอฟที32 | คำอธิบาย |
|---|---|---|---|
| 0x000 | 0x0000 | 0x?0000000 | Free Cluster; ยังใช้โดย DOS เพื่ออ้างถึงคลัสเตอร์เริ่มต้นของไดเร็กทอรีหลักในรายการ "..." ของไดเร็กทอรีย่อยของไดเร็กทอรีรากบนวอลุ่ม FAT12/FAT16 [ 42 ] [ 6 ] มิฉะนั้น หากค่านี้ปรากฏในกลุ่มโซ่ (เช่น ในรายการไดเร็กทอรีที่มีความยาวเป็นศูนย์หรือไฟล์ที่ถูกลบ) การใช้งานระบบไฟล์ควรถือว่าค่านี้เป็นเครื่องหมายสิ้นสุดโซ่[ 7 ] |
| 0x001 | 0x0001 | 0x?0000001 | สงวนไว้สำหรับวัตถุประสงค์ภายใน MS-DOS/PC DOS ใช้ค่าคลัสเตอร์นี้เป็นตัวบ่งชี้คลัสเตอร์ชั่วคราวที่ไม่ว่างในขณะที่สร้างโซ่คลัสเตอร์ระหว่างการจัดสรรไฟล์ (จะเห็นบนดิสก์เฉพาะในกรณีที่เกิดการขัดข้องหรือไฟฟ้าดับในระหว่างกระบวนการนี้) [ 42 ] [ 6 ] หากค่านี้ปรากฏในคลัสเตอร์เชนบนดิสก์ ระบบไฟล์ควรถือว่าค่านี้เป็นเครื่องหมายสิ้นสุดเชน |
| 0x002 - 0xFEF | 0x0002 - 0xFFEF (0x0002 - 0x7FFF) | 0x?0000002 – 0x?FFFFFEF | ใช้เป็นกลุ่มข้อมูล โดยค่าจะชี้ไปยังกลุ่มถัดไป MS-DOS/PC DOS ยอมรับค่าได้ถึง0xFEF / 0xFFEF / 0x0FFFFFEF (บางครั้งอาจมากกว่านั้น โปรดดูด้านล่าง) ในขณะที่ Atari GEMDOS อนุญาต เฉพาะค่าได้ถึง0x7FFF บนไดรฟ์ FAT16 เท่านั้น |
| 0xFF0 [ nb 11 ] - 0xFF5 (0xFF1 - 0xFF5) | 0xFFF0 - 0xFFF5 | 0x?FFFFFF0 – 0x?FFFFFF5 | สงวนไว้ในบางบริบท[ 43 ]หรือใช้[ 24 ] [ 25 ] [ 26 ] [ 4 ] [ 44 ]เป็นคลัสเตอร์ข้อมูลในระบบที่ไม่เป็นมาตรฐานบางระบบ ควรหลีกเลี่ยงขนาดวอลุ่มที่จะใช้ค่าเหล่านี้เป็นคลัสเตอร์ข้อมูล แต่หากค่าเหล่านี้ปรากฏในวอลุ่มที่มีอยู่ ระบบไฟล์จะต้องถือว่าค่าเหล่านี้เป็นคลัสเตอร์ข้อมูลปกติในคลัสเตอร์เชน (โดยควรใช้การตรวจสอบความถูกต้องเพิ่มเติม) คล้ายกับที่ MS-DOS, PC DOS และ DR-DOS ทำ[ 6 ]และควรหลีกเลี่ยงการจัดสรรให้กับไฟล์ในกรณีอื่น ๆ MS - DOS/PC DOS 3.3 และสูงกว่าจะถือว่าค่า0xFF0 [ nb 11 ] [ 6 ]บนวอลุ่ม FAT12 (แต่ไม่ใช่บน FAT16 หรือ FAT32) เป็นเครื่องหมายสิ้นสุดโซ่เพิ่มเติมคล้ายกับ0xFF8 - 0xFFF [ 6 ]เพื่อความเข้ากันได้กับ MS-DOS/PC DOS ระบบไฟล์ควรหลีกเลี่ยงการใช้คลัสเตอร์ข้อมูล0xFF0ในโซ่คลัสเตอร์บนวอลุ่ม FAT12 (นั่นคือ ให้ถือว่าเป็นคลัสเตอร์ที่สงวนไว้คล้ายกับ0xFF7 ) (หมายเหตุ: ความสัมพันธ์ของไบต์ต่ำของหมายเลขคลัสเตอร์กับค่า FAT ID และตัวอธิบายสื่อเป็นเหตุผลว่าทำไมค่าคลัสเตอร์เหล่านี้จึงถูกสงวนไว้) |
| 0xFF6 | 0xFFF6 | 0x?FFFFFF6 | สงวนไว้ ห้ามใช้[ 24 ] [ 25 ] [ 26 ] [ 4 ] [ 21 ] [ 44 ] (หมายเหตุ: สอดคล้องกับค่าตัวเติมรูปแบบเริ่มต้น0xF6บนเครื่องที่เข้ากันได้กับ IBM) ไม่ควรสร้างวอลุ่มที่จะใช้ค่านี้เป็นคลัสเตอร์ข้อมูล แต่หากค่านี้ปรากฏในวอลุ่มที่มีอยู่ ระบบไฟล์จะต้องถือว่าเป็นคลัสเตอร์ข้อมูลปกติในคลัสเตอร์เชน (โดยควรมีการตรวจสอบความถูกต้องเพิ่มเติม) และควรหลีกเลี่ยงการจัดสรรให้กับไฟล์อื่นๆ[ 7 ] |
| 0xFF7 | 0xFFF7 | 0x?FFFFFF7 | เซกเตอร์เสียในคลัสเตอร์หรือคลัสเตอร์สำรอง (ตั้งแต่ DOS 2.0) ค่าการเปลี่ยนผ่านสำหรับจำนวนคลัสเตอร์สูงสุดสำหรับระบบไฟล์ FAT12 และ FAT16 ถูกกำหนดไว้เช่นนั้น โดยที่ค่าคลัสเตอร์ข้อมูลสูงสุดที่เป็นไปได้ ( 0xFF5และ0xFFF5ตาม ลำดับ [ 6 ] ) จะมีค่าน้อยกว่าค่านี้เสมอ[ 6 ]ดังนั้น ค่านี้จึงไม่สามารถเกิดขึ้นได้ตามปกติในคลัสเตอร์เชน แต่ถ้าเกิดขึ้น ก็อาจถือว่าเป็นคลัสเตอร์ข้อมูลปกติ เนื่องจาก0xFF7อาจเป็นคลัสเตอร์ข้อมูลที่ไม่เป็นมาตรฐานบนวอลุ่ม FAT12 ก่อนการแนะนำเครื่องหมายคลัสเตอร์เสียใน DOS 2.0 หรือการแนะนำ FAT16 ใน DOS 3.0 [ 7 ]และ0xFFF7อาจเป็นคลัสเตอร์ข้อมูลที่ไม่เป็นมาตรฐานบนวอลุ่ม FAT16 ก่อนการแนะนำ FAT32 ใน DOS 7.10 ในทางทฤษฎี0x0FFFFFF7สามารถเป็นส่วนหนึ่งของคลัสเตอร์เชนที่ถูกต้องบนวอลุ่ม FAT32 ได้ แต่ยูทิลิตี้ดิสก์ควรหลีกเลี่ยงการสร้างวอลุ่ม FAT32 ซึ่งเงื่อนไขนี้อาจเกิดขึ้นได้ ระบบไฟล์ควรหลีกเลี่ยงการจัดสรรคลัสเตอร์นี้ให้กับไฟล์[ 7 ] โปรแกรมยูทิลิตี้ดิสก์ต้องไม่พยายามกู้คืน "คลัสเตอร์ที่สูญหาย" ซึ่งมีค่านี้อยู่ใน FAT แต่ให้ถือว่าคลัสเตอร์เหล่านั้นเป็นคลัสเตอร์เสีย |
| 0xFF8 – 0xFFF (และอาจเป็น 0xFF0; [ nb 11 ]ดูหมายเหตุ) | 0xFFF8 – 0xFFFF | 0x?FFFFFF8 - 0x?FFFFFFF | คลัสเตอร์สุดท้ายในไฟล์ (EOC) การใช้งานระบบไฟล์ต้องถือว่าค่าเหล่านี้ทั้งหมดเป็นเครื่องหมายสิ้นสุดของห่วงโซ่ในเวลาเดียวกัน[ 7 ]การใช้งานระบบไฟล์ส่วนใหญ่ (รวมถึง 86-DOS, MS-DOS, PC DOS และ DR-DOS) ใช้0xFFF [ 7 ] / 0xFFFF [ 7 ] / 0x0FFFFFFFเป็นเครื่องหมายสิ้นสุดไฟล์เมื่อจัดสรรไฟล์ แต่ Linux เวอร์ชันก่อน 2.5.40 ใช้0xFF8 / 0xFFF8 / 0x0FFFFFF8 [ 45 ] mkdosfs เวอร์ชัน ( dosfstoolsจนถึง 3.0.26) ยังคงใช้0x0FFFFFF8 สำหรับไดเร็กทอรีรูทบนวอลุ่ม FAT32 ในขณะที่เครื่องมือซ่อมแซมดิสก์และจัดเรียง ข้อมูลบางอย่างใช้ค่าอื่นในชุด (เช่น SCANDISK อาจใช้0xFF8 / 0xFFF8 / 0x0FFFFFF8แทน) ในขณะที่ใน การใช้งาน FAT 8 บิต ดั้งเดิมใน Standalone Disk BASICของ Microsoft มีการใช้ เครื่องหมายสิ้นสุดที่แตกต่างกัน ( 0xC0 .. 0xCD ) เพื่อระบุจำนวนเซกเตอร์ (0 ถึง 13) ที่ใช้ไปในคลัสเตอร์สุดท้ายที่ไฟล์ครอบครอง เครื่องหมายสิ้นสุดที่แตกต่างกันถูกนำมาใช้ใหม่ภายใต้ DOS เพื่อระบุประเภทของสื่อที่แตกต่างกัน[ 7 ]โดยเครื่องหมายสิ้นสุดที่ใช้ในปัจจุบันจะถูกระบุไว้ใน รายการ คลัสเตอร์ 1อย่างไรก็ตาม แนวคิดนี้ดูเหมือนจะไม่ได้ถูกนำมาใช้ในทางปฏิบัติอย่างกว้างขวาง และในบางสถานการณ์ วอลุ่มอาจไม่ได้รับการยอมรับจากระบบปฏิบัติการบางระบบ หากบิตลำดับต่ำบางส่วนของค่าที่เก็บไว้ในคลัสเตอร์ 1 ไม่ได้รับการตั้งค่า นอกจากนี้ การใช้งานระบบไฟล์ที่ผิดพลาดบางอย่างยอมรับเฉพาะ0xFFF / 0xFFFF / 0x?FFFFFFFเป็นเครื่องหมายสิ้นสุดของเชนที่ถูกต้องเท่านั้น การใช้งานระบบไฟล์ควรตรวจสอบค่าคลัสเตอร์ในโซ่คลัสเตอร์เทียบกับค่าคลัสเตอร์สูงสุดที่อนุญาตซึ่งคำนวณจากขนาดจริงของวอลุ่ม และถือว่าค่าที่สูงกว่านั้นเป็นเครื่องหมายสิ้นสุดโซ่ด้วย (ไบต์ต่ำของหมายเลขคลัสเตอร์สอดคล้องกับค่า FAT ID และตัวอธิบายสื่อ ในเชิงแนวคิด [ 7 ]ดูหมายเหตุข้างต้นสำหรับการใช้งานพิเศษของ MS-DOS/PC DOS ของ0xFF0 [ nb 11 ]บนวอลุ่ม FAT12 [ 6 ] ) |
FAT32 uses 28 bits for cluster numbers. The remaining 4 bits in the 32-bit FAT entry are usually zero, but are reserved and should be left untouched. A standard conformant FAT32 file system driver or maintenance tool must not rely on the upper 4 bits to be zero and it must strip them off before evaluating the cluster number in order to cope with possible future expansions where these bits may be used for other purposes. They must not be cleared by the file system driver when allocating new clusters, but should be cleared during a reformat.
Root directory region
The root directory table in FAT12 and FAT16 file systems occupies the special Root Directory Region location.
Data region
Aside from the root directory table in FAT12 and FAT16 file systems, which occupies the special Root Directory Region location, all directory tables are stored in the data region. The actual number of entries in a directory stored in the data region can grow by adding another cluster to the chain in the FAT.
Directory table
A directory table is a special type of file that represents a directory (also known as a folder). Since 86-DOS 0.42,[46] each file or (since MS-DOS 1.40 and PC DOS 2.0) subdirectory stored within it is represented by a 32-byte entry in the table. Each entry records the name, extension, attributes (archive, directory, hidden, read-only, system and volume), the address of the first cluster of the file/directory's data, the size of the file/directory, and the date[46] and (since PC DOS 1.1) also the time of last modification. Earlier versions of 86-DOS used 16-byte directory entries only, supporting no files larger than 16 MB and no time of last modification.[46]
ระบบไฟล์ FAT เองไม่ได้กำหนดข้อจำกัดใดๆ เกี่ยวกับความลึกของโครงสร้างไดเร็กทอรีย่อย ตราบใดที่มีคลัสเตอร์ว่างให้จัดสรรไดเร็กทอรีย่อย อย่างไรก็ตาม โครงสร้างไดเร็กทอรีปัจจุบันภายใน (CDS) ภายใต้ MS-DOS/PC DOS จำกัดเส้นทางสัมบูรณ์ของไดเร็กทอรีไว้ที่ 66 อักขระ (รวมถึงตัวอักษรไดรฟ์ แต่ไม่รวมตัวคั่นไบต์ NUL) [ 24 ] [ 25 ] [ 26 ]จึงจำกัดความลึกสูงสุดที่รองรับของไดเร็กทอรีย่อยไว้ที่ 32 ไม่ว่าจะเกิดขึ้นก่อนก็ตาม Concurrent DOS, Multiuser DOS และ DR DOS 3.31 ถึง 6.0 (รวมถึงการอัปเดต 1992-11) ไม่ได้จัดเก็บเส้นทางสัมบูรณ์ไปยังไดเร็กทอรีการทำงานภายใน ดังนั้นจึงไม่แสดงข้อจำกัดนี้[ 47 ]เช่นเดียวกันนี้ใช้กับ Atari GEMDOS แต่ Atari Desktop ไม่รองรับระดับไดเร็กทอรีย่อยมากกว่า 8 ระดับ แอปพลิเคชันส่วนใหญ่ที่รับรู้ถึงส่วนขยายนี้รองรับเส้นทางได้ถึงอย่างน้อย 127 ไบต์ FlexOS, 4680 OS และ 4690 OS รองรับความยาวได้ถึง 127 ไบต์เช่นกัน ทำให้สามารถมีความลึกได้ถึง 60 ระดับ[ 48 ] PalmDOS, DR DOS 6.0 (ตั้งแต่ BDOS 7.1) และเวอร์ชันที่สูงกว่า, Novell DOS และ OpenDOS มี CDS ที่เข้ากันได้กับ MS-DOS ดังนั้นจึงมีข้อจำกัดความยาวเช่นเดียวกับ MS-DOS/PC DOS
แต่ละรายการสามารถนำหน้าด้วย "รายการปลอม" เพื่อรองรับชื่อไฟล์แบบยาว (LFN) ของ VFATได้ โปรดดูรายละเอียดเพิ่มเติมด้านล่าง
อักขระที่ถูกต้องสำหรับการตั้งชื่อไฟล์แบบสั้นในระบบ DOS มีดังต่อไปนี้:
- ตัวอักษรพิมพ์ใหญ่
A–Z - ตัวเลข
0–9 - ช่องว่าง (ถึงแม้ว่าช่องว่างท้ายชื่อไฟล์หรือนามสกุลจะถือเป็นส่วนเติมเต็มและไม่ใช่ส่วนหนึ่งของชื่อไฟล์ก็ตาม และชื่อไฟล์ที่มีช่องว่างนั้นไม่สามารถใช้งานได้ง่ายบนบรรทัดคำสั่ง DOS ก่อน Windows 95 เนื่องจากขาดระบบการหลีกเลี่ยง ที่เหมาะสม ) ข้อยกเว้นอีกประการหนึ่งคือคำสั่งภายใน
MKDIR/MDและRMDIR/RDภายใต้ DR-DOS ซึ่งรับอาร์กิวเมนต์เดียวและอนุญาตให้ใส่ช่องว่างได้ ! # $ % & ' ( ) - @ ^ _ ` { } ~- ตัวละครหมายเลข 128–228
- ตัวละคร 230–255
ซึ่งไม่รวมอักขระ ASCIIต่อไปนี้:
" * / : < > ? \ |ระบบ ปฏิบัติการ Windows/MS-DOS ไม่มีอักขระหลีก (escape character) สำหรับ เชลล์+ , . ; = [ ]อนุญาตเฉพาะในชื่อไฟล์ที่ยาวเท่านั้น- ตัวอักษรพิมพ์เล็ก
a–zจัดเก็บเป็นA–Z; อนุญาตให้ใช้ในชื่อไฟล์ที่ยาวได้ - อักขระควบคุม 0–31
- ตัวละคร 127 (DEL)
อักขระหมายเลข 229 ( 0xE5 ) ไม่ได้รับอนุญาตให้ใช้เป็นอักขระตัวแรกในชื่อไฟล์ใน DOS 1 และ 2 เนื่องจากถูกใช้เป็นเครื่องหมายระบุตำแหน่งว่าง มีการเพิ่มกรณีพิเศษเพื่อหลีกเลี่ยงข้อจำกัดนี้ใน DOS 3.0 และเวอร์ชันที่สูงกว่า
อักขระเพิ่มเติมต่อไปนี้สามารถใช้ได้บน GEMDOS ของ Atari แต่ควรหลีกเลี่ยงเพื่อความเข้ากันได้กับ MS-DOS/PC DOS:
" + , ; < = > [ ] |
;ควรหลีกเลี่ยงการใช้เครื่องหมายเซมิโคลอน ( ) ในชื่อไฟล์ภายใต้ DR DOS 3.31 ขึ้นไป, PalmDOS, Novell DOS, OpenDOS, Concurrent DOS, Multiuser DOS, System Manager และ REAL/32 เนื่องจากอาจขัดแย้งกับไวยากรณ์ในการระบุรหัสผ่านไฟล์และไดเร็กทอรี: " ...\DIRSPEC.EXT;DIRPWD\FILESPEC.EXT;FILEPWD" ระบบปฏิบัติการจะตัดเครื่องหมายเซมิโคลอนออกหนึ่งตัว[ 47 ] (และสองตัว—ตั้งแต่ DR-DOS 7.02) และรหัสผ่านที่รออยู่ออกจากชื่อไฟล์ก่อนที่จะจัดเก็บลงดิสก์ (ตัวประมวลผลคำสั่ง4DOSใช้เครื่องหมายเซมิโคลอนสำหรับรายการที่รวมอยู่และต้องใช้เครื่องหมายเซมิโคลอนสองตัวสำหรับไฟล์ที่ป้องกันด้วยรหัสผ่านที่มีคำสั่งใดๆ ที่รองรับไวด์การ์ด[ 47 ] )
อักขระเครื่องหมาย @ ( @) ถูกใช้สำหรับรายการไฟล์โดย DR-DOS, PalmDOS, Novell DOS, OpenDOS และ Multiuser DOS, System Manager และคำสั่ง REAL/32 จำนวนมาก รวมถึง 4DOS ด้วย ดังนั้นบางครั้งอาจใช้งานในชื่อไฟล์ได้ยาก[ 47 ]
ภายใต้ Multiuser DOS และ REAL/32 เครื่องหมายอัศเจรีย์ (!) ไม่ใช่อักขระชื่อไฟล์ที่ถูกต้อง เนื่องจากใช้เพื่อแยกคำสั่งหลายคำสั่งในบรรทัดคำสั่งเดียว[ 47 ]
ในระบบปฏิบัติการ IBM 4680 OS และ 4690 OS ไม่อนุญาตให้ใช้ตัวอักษรต่อไปนี้ในชื่อไฟล์:
? * : . ; , [ ] ! + = < > " - / \ |
นอกจากนี้ ไม่อนุญาตให้ใช้ตัวอักษรพิเศษต่อไปนี้ในตัวอักษรตัวแรก ตัวที่สี่ ตัวที่ห้า และตัวที่แปดของชื่อไฟล์ เนื่องจากจะไปขัดแย้งกับชื่อไฟล์ของตัวประมวลผลคำสั่งโฮสต์ (HCP) และชื่อไฟล์สร้างตารางลำดับอินพุต:
@ # ( ) { } $ &
ชื่อไฟล์ DOS ใช้ชุดอักขระ OEM ปัจจุบัน ซึ่งอาจส่งผลกระทบที่คาดไม่ถึงได้ หากอักขระที่จัดการในลักษณะหนึ่งสำหรับหน้ารหัสหนึ่ง ถูกตีความแตกต่างกันสำหรับหน้ารหัสอื่น (คำสั่ง DOS CHCP) ในแง่ของตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ การเรียงลำดับ หรือความถูกต้องในฐานะอักขระชื่อไฟล์
รายการในสมุดรายชื่อ
ก่อนที่ Microsoft จะเพิ่มการรองรับชื่อไฟล์ยาวและการประทับเวลาสร้าง/เข้าถึง ไบต์0x0C – 0x15ของรายการไดเร็กทอรีถูกใช้โดยระบบปฏิบัติการอื่นๆ เพื่อจัดเก็บข้อมูลเมตาเพิ่มเติม โดยเฉพาะอย่างยิ่งระบบปฏิบัติการในตระกูล Digital Research ที่จัดเก็บรหัสผ่านไฟล์ สิทธิ์การเข้าถึง รหัสเจ้าของ และข้อมูลการลบไฟล์ไว้ที่นั่น แม้ว่าส่วนขยายใหม่ๆ ของ Microsoft จะไม่เข้ากันได้กับส่วนขยายเหล่านี้โดยค่าเริ่มต้น แต่ส่วนใหญ่สามารถใช้งานร่วมกันได้ในระบบไฟล์ FAT ของบริษัทอื่น (อย่างน้อยก็ในไดรฟ์ FAT12 และ FAT16)
รายการไดเร็กทอรีขนาด 32 ไบต์ ทั้งในส่วนไดเร็กทอรีรากและในไดเร็กทอรีย่อย มีรูปแบบดังต่อไปนี้ (ดูเพิ่มเติมที่8.3 ชื่อไฟล์ ):
| ออฟเซ็ตไบต์ | ความยาว (ไบต์) | สารบัญ | ||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0x00 | 8 | ชื่อไฟล์แบบสั้น (เติมช่องว่างก่อน) ไบต์แรกสามารถมีค่าพิเศษดังต่อไปนี้:
ระบบปฏิบัติการ DOS เวอร์ชันก่อน 5.0 จะเริ่มสแกนตารางไดเร็กทอรีจากด้านบนลงมาด้านล่าง เพื่อเพิ่มโอกาสในการกู้คืนไฟล์ที่ถูกลบได้สำเร็จ ระบบปฏิบัติการ DOS 5.0 ขึ้นไปจะจดจำตำแหน่งของรายการไดเร็กทอรีที่เขียนล่าสุด และใช้ตำแหน่งนั้นเป็นจุดเริ่มต้นในการสแกนตารางไดเร็กทอรี | ||||||||||||||||||||||||||||||||||||||||||
| 0x08 | 3 | นามสกุลไฟล์แบบสั้น (เติมช่องว่างเพื่อนำหน้า) | ||||||||||||||||||||||||||||||||||||||||||
| 0x0B | 1 | คุณลักษณะของไฟล์
ภายใต้ DR DOS 6.0 และเวอร์ชันที่สูงกว่า รวมถึง PalmDOS, Novell DOS และ OpenDOS คุณสมบัติของวอลุ่มจะถูกตั้งค่าสำหรับไฟล์และไดเร็กทอรีที่รอการลบภายใต้ DELWATCH ตั้งแต่ MS-DOS 7.0 เป็นต้นมา มีการใช้ ชุดค่าแอตทริบิวต์0x0Fเพื่อกำหนด รายการ ชื่อไฟล์ยาวของ VFAT DOS เวอร์ชันเก่ากว่าอาจเข้าใจผิดคิดว่าเป็นป้ายชื่อไดรฟ์ เนื่องจากจะใช้รายการแรกที่มีแอตทริบิวต์ไดรฟ์ตั้งค่าเป็นป้ายชื่อไดรฟ์ ปัญหานี้สามารถหลีกเลี่ยงได้หากมีการบังคับใช้ป้ายชื่อไดรฟ์เป็นส่วนหนึ่งของกระบวนการจัดรูปแบบ ด้วยเหตุนี้ เครื่องมือจัดการดิสก์บางตัวจึงเขียนป้ายชื่อไดรฟ์ปลอม " " อย่างชัดเจนเมื่อผู้ใช้ไม่ได้ระบุป้ายชื่อไดรฟ์[ nb 14 ]เนื่องจากโดยปกติแล้วป้ายชื่อไดรฟ์จะไม่มีแอตทริบิวต์ระบบตั้งค่าไว้พร้อมกัน จึงสามารถแยกแยะความแตกต่างระหว่างป้ายชื่อไดรฟ์และรายการ LFN ของ VFAT ได้ การรวมกันของแอตทริบิวต์0x0Fอาจเกิดขึ้นได้ในบางครั้งในฐานะส่วนหนึ่งของไฟล์ที่รอการลบที่ถูกต้องภายใต้ DELWATCH อย่างไรก็ตาม บนไดรฟ์ FAT12 และ FAT16 ค่าคลัสเตอร์ที่0x1A ในรายการ VFAT จะถูกตั้งค่าเป็น0x0000 เสมอ และค่าความยาวที่0x1Cจะไม่เป็น0x00000000ในขณะที่ค่าที่0x1Aจะเป็นค่าที่ไม่ใช่ศูนย์เสมอสำหรับไฟล์ที่รอการลบภายใต้ DELWATCH การตรวจสอบนี้ใช้ไม่ได้กับไดรฟ์ FAT32 | ||||||||||||||||||||||||||||||||||||||||||
| 0x0C | 1 |
| ||||||||||||||||||||||||||||||||||||||||||
| 0x0D | 1 |
Double usage for create time ms and file char does not create a conflict, since the creation time is no longer important for deleted files. | ||||||||||||||||||||||||||||||||||||||||||
| 0x0E | 2 |
ถ้าบิตที่ 15-11 > 23 หรือบิตที่ 10-5 > 59 หรือบิตที่ 4-0 > 29 หรือเมื่อบิตที่ 12-0 ที่ตำแหน่งออฟเซ็ต0x14เก็บค่าบิตแมปการเข้าถึง และนี่ไม่ใช่ไดรฟ์ FAT32 หรือไดรฟ์ที่ใช้แอตทริบิวต์เพิ่มเติมของ OS/2 แสดงว่ารายการนี้เก็บค่าแฮชรหัสผ่าน มิฉะนั้นจะถือว่าเป็นเวลาสร้างไฟล์ | ||||||||||||||||||||||||||||||||||||||||||
| 0x10 | 2 |
The usage for creation date for existing files does not conflict with last modified time for deleted files because they are never used at the same time. For the same reason, the usage for the record size of existing files and last modified time of deleted files does not conflict. Creation dates and record sizes cannot be used at the same time, however, both are stored only on file creation and never changed later on, thereby limiting the conflict to FlexOS, 4680 OS and 4690 OS systems accessing files created under foreign operating systems as well as potential display or file sorting problems on systems trying to interpret a record size as creation time. To avoid the conflict, the storage of creation dates should be an optional feature of operating systems supporting it. | ||||||||||||||||||||||||||||||||||||||||||
| 0x12 | 2 |
การใช้งานรหัสเจ้าของของไฟล์ที่มีอยู่จะไม่ขัดแย้งกับวันที่แก้ไขล่าสุดสำหรับไฟล์ที่ถูกลบ เนื่องจากไม่เคยใช้พร้อมกัน[ 47 ]การใช้งานวันที่แก้ไขล่าสุดสำหรับไฟล์ที่ถูกลบจะไม่ขัดแย้งกับวันที่เข้าถึง เนื่องจากวันที่เข้าถึงไม่สำคัญสำหรับไฟล์ที่ถูกลบอีกต่อไป อย่างไรก็ตาม รหัสเจ้าของและวันที่เข้าถึงไม่สามารถใช้พร้อมกันได้ | ||||||||||||||||||||||||||||||||||||||||||
| 0x14 | 2 |
การจัดเก็บข้อมูลสองไบต์บนสุดของคลัสเตอร์แรกในไฟล์บนระบบไฟล์ FAT32 ขัดแย้งกับบิตแมปสิทธิ์การเข้าถึงบางส่วน | ||||||||||||||||||||||||||||||||||||||||||
| 0x16 | 2 |
| ||||||||||||||||||||||||||||||||||||||||||
| 0x18 | 2 | |||||||||||||||||||||||||||||||||||||||||||
| 0x1A | 2 | จุดเริ่มต้นของไฟล์ในรูปแบบคลัสเตอร์ใน FAT12 และ FAT16 สองไบต์ล่างของคลัสเตอร์แรกใน FAT32 โดยสองไบต์บนถูกจัดเก็บไว้ที่ตำแหน่งออฟเซ็ต 0x14 รายการที่มีแฟล็ก Volume Label, ซับไดเร็กทอรี "." ที่ชี้ไปยังรูท FAT12 และ FAT16 และไฟล์ว่างที่มีขนาด 0 ควรมีคลัสเตอร์แรกเป็น 0 รายการ VFAT LFN จะมีค่านี้เป็น 0 เช่นกัน ในไดรฟ์ FAT12 และ FAT16 สามารถใช้เป็นส่วนหนึ่งของกลไกการตรวจจับเพื่อแยกแยะระหว่างไฟล์ที่รอการลบภายใต้ DELWATCH และ VFAT LFN ได้ โปรดดูรายละเอียดด้านบน | ||||||||||||||||||||||||||||||||||||||||||
| 0x1C | 4 | ขนาดไฟล์เป็นไบต์ รายการที่มีการตั้งค่าแฟล็ก Volume Label หรือ Subdirectory ควรมีขนาดเป็น 0 ค่า0x00000000 ในรายการ VFAT LFN จะไม่ถูกบันทึก ไว้ที่นี่ สามารถใช้เป็นส่วนหนึ่งของกลไกการตรวจจับเพื่อแยกแยะระหว่างไฟล์ที่รอการลบภายใต้ DELWATCH และ VFAT LFN ได้ โปรดดูรายละเอียดเพิ่มเติมด้านบน |
ระบบปฏิบัติการที่ใช้FlexOS เช่น IBM 4680 OSและIBM 4690 OSรองรับคุณลักษณะการแจกจ่ายเฉพาะที่จัดเก็บไว้ในบิตบางส่วนของพื้นที่ที่สงวนไว้ก่อนหน้านี้ในรายการไดเร็กทอรี: [ 62 ]
- โลคอล: อย่าแจกจ่ายไฟล์ แต่ให้เก็บไว้ในคอนโทรลเลอร์โลคอลเท่านั้น[ nb 15 ]
- คัดลอกไฟล์เมื่อมีการอัปเดต: แจกจ่ายไฟล์ไปยังเซิร์ฟเวอร์เฉพาะเมื่อไฟล์มีการอัปเดตเท่านั้น
- คัดลอกไฟล์เมื่อปิด: แจกจ่ายไฟล์ไปยังเซิร์ฟเวอร์เฉพาะเมื่อปิดไฟล์แล้วเท่านั้น
- การอัปเดตไฟล์แบบรวม: แจกจ่ายไฟล์ไปยังคอนโทรลเลอร์ทั้งหมดเมื่อไฟล์ได้รับการอัปเดต
- ไฟล์ผสมเมื่อปิด: กระจายไฟล์ไปยังตัวควบคุมทั้งหมดเมื่อปิดไฟล์[ 63 ]
ส่วนขยายที่ไม่เข้ากันบางส่วนที่พบในระบบปฏิบัติการบางระบบ ได้แก่:
| ออฟเซ็ตไบต์ | ความยาว (ไบต์) | ระบบ | คำอธิบาย |
|---|---|---|---|
| 0x0C | 2 | RISC OS | ประเภทไฟล์0x0000 – 0x0FFF |
| 0x0C | 4 | เปตรอฟ ดีโอเอสเอฟ | ที่อยู่โหลดไฟล์ |
| 0x0E | 2 | แอนดรอส | ที่อยู่ไฟล์ในหน่วยความจำ |
| 0x10 | 4 | เปตรอฟ ดีโอเอสเอฟ | ที่อยู่การเรียกใช้ไฟล์ |
ข้อจำกัดด้านขนาด
ระบบไฟล์ FAT ได้แก่ FAT12, FAT16, FAT16B และ FAT32 มีข้อจำกัดที่ชัดเจนโดยอิงจากจำนวนคลัสเตอร์และจำนวนเซกเตอร์ต่อคลัสเตอร์ (1, 2, 4, ..., 128) สำหรับค่าทั่วไปที่ 512 ไบต์ต่อเซกเตอร์:
FAT12 requirements : 3 sectors on each copy of FAT for every 1,024 clusters FAT16 requirements : 1 sector on each copy of FAT for every 256 clusters FAT32 requirements : 1 sector on each copy of FAT for every 128 clusters FAT12 range : 1 to 4,084 clusters : 1 to 12 sectors per copy of FAT FAT16 range : 4,085 to 65,524 clusters : 16 to 256 sectors per copy of FAT FAT32 range : 65,525 to 268,435,444 clusters : 512 to 2,097,152 sectors per copy of FAT FAT12 minimum : 1 sector per cluster × 1 clusters = 512 bytes (0.5 KiB) FAT16 minimum : 1 sector per cluster × 4,085 clusters = 2,091,520 bytes (2,042.5 KB) FAT32 minimum : 1 sector per cluster × 65,525 clusters = 33,548,800 bytes (32,762.5 KB) FAT12 maximum : 64 sectors per cluster × 4,084 clusters = 133,824,512 bytes (≈ 127 MB) [FAT12 maximum : 128 sectors per cluster × 4,084 clusters = 267,694,024 bytes (≈ 255 MB)] FAT16 maximum : 64 sectors per cluster × 65,524 clusters = 2,147,090,432 bytes (≈2,047 MB) [FAT16 maximum : 128 sectors per cluster × 65,524 clusters = 4,294,180,864 bytes (≈4,095 MB)] FAT32 maximum : 8 sectors per cluster × 268,435,444 clusters = 1,099,511,578,624 bytes (≈1,024 GB) FAT32 maximum : 16 sectors per cluster × 268,173,557 clusters = 2,196,877,778,944 bytes (≈2,046 GB) [FAT32 maximum : 32 sectors per cluster × 134,152,181 clusters = 2,197,949,333,504 bytes (≈2,047 GB)] [FAT32 maximum : 64 sectors per cluster × 67,092,469 clusters = 2,198,486,024,192 bytes (≈2,047 GB)] [FAT32 maximum : 128 sectors per cluster × 33,550,325 clusters = 2,198,754,099,200 bytes (≈2,047 GB)]
- Legend: 268435444+3 is 0x0FFFFFF7, because FAT32 version 0 uses only 28 bits in the 32-bit cluster numbers, cluster numbers 0x0FFFFFF7 up to 0x0FFFFFFF flag bad clusters or the end of a file, cluster number 0 flags a free cluster, and cluster number 1 is not used.[33] Likewise 65524+3 is 0xFFF7 for FAT16, and 4084+3 is 0xFF7 for FAT12. The number of sectors per cluster is a power of 2 fitting in a single byte, the smallest value is 1 (0x01), the biggest value is 128 (0x80). Lines in square brackets indicate the unusual cluster size 128, and for FAT32 the bigger than necessary cluster sizes 32 or 64.[64]
Because each FAT32 entry occupies 32 bits (4 bytes) the maximal number of clusters (268435444) requires 2097152 FAT sectors for a sector size of 512 bytes. 2097152 is 0x200000, and storing this value needs more than two bytes. Therefore, FAT32 introduced a new 32-bit value in the FAT32 boot sector immediately following the 32-bit value for the total number of sectors introduced in the FAT16B variant.
The boot record extensions introduced with DOS 4.0 start with a magic 40 (0x28) or 41 (0x29). Typically FAT drivers look only at the number of clusters to distinguish FAT12, FAT16, and FAT32: the human readable strings identifying the FAT variant in the boot record are ignored, because they exist only for media formatted with DOS 4.0 or later.
Determining the number of directory entries per cluster is straightforward. Each entry occupies 32 bytes; this results in 16 entries per sector for a sector size of 512 bytes. The DOS 5 RMDIR/RD command removes the initial "." (this directory) and ".." (parent directory) entries in subdirectories directly, therefore sector size 32 on a RAM disk is possible for FAT12, but requires 2 or more sectors per cluster. A FAT12 boot sector without the DOS 4 extensions needs 29 bytes before the first unnecessary FAT16B 32-bit number of hidden sectors, this leaves three bytes for the (on a RAM disk unused) boot code and the magic 0x55 0xAA at the end of all boot sectors. On Windows NT the smallest supported sector size is 128.
On Windows NT operating systems the FORMAT command options /A:128K and /A:256K correspond to the maximal cluster size 0x80 (128) with a sector size 1024 and 2048, respectively. For the common sector size 512 /A:64K yields 128 sectors per cluster.
Both editions of each ECMA-107[24] and ISO/IEC 9293[25][26] specify a Max Cluster NumberMAX determined by the formula MAX=1+trunc((TS-SSA)/SC), and reserve cluster numbers MAX+1 up to 4086 (0xFF6, FAT12) and later 65526 (0xFFF6, FAT16) for future standardization.
Microsoft's EFI FAT32 specification[4] states that any FAT file system with less than 4085 clusters is FAT12, else any FAT file system with less than 65,525 clusters is FAT16, and otherwise it is FAT32. The entry for cluster 0 at the beginning of the FAT must be identical to the media descriptor byte found in the BPB, whereas the entry for cluster 1 reflects the end-of-chain value used by the formatter for cluster chains (0xFFF, 0xFFFF or 0x0FFFFFFF). The entries for cluster numbers 0 and 1 end at a byte boundary even for FAT12, e.g., 0xF9FFFF for media descriptor 0xF9.
The first data cluster is 2,[33] and consequently the last cluster MAX gets number MAX+1. This results in data cluster numbers 2...4085 (0xFF5) for FAT12, 2...65525 (0xFFF5) for FAT16, and 2...268435445 (0x0FFFFFF5) for FAT32.
The only available values reserved for future standardization are therefore 0xFF6 (FAT12) and 0xFFF6 (FAT16). As noted below "less than 4085" is also used for Linux implementations,[44] or as Microsoft's FAT specification puts it:[4]
...when it says <, it does not mean <=. Note also that the numbers are correct. The first number for FAT12 is 4085; the second number for FAT16 is 65525. These numbers and the "<" signs are not wrong."
Fragmentation
The FAT file system does not contain built-in mechanisms which prevent newly written files from becoming scattered across the partition.[65] On volumes where files are created and deleted frequently or their lengths often changed, the medium will become increasingly fragmented over time.
While the design of the FAT file system does not cause any organizational overhead in disk structures or reduce the amount of free storage space with increased amounts of fragmentation, as it occurs with external fragmentation, the time required to read and write fragmented files will increase as the operating system will have to follow the cluster chains in the FAT (with parts having to be loaded into memory first in particular on large volumes) and read the corresponding data physically scattered over the whole medium reducing chances for the low-level block device driver to perform multi-sector disk I/O or initiate larger DMA transfers, thereby effectively increasing I/O protocol overhead as well as arm movement and head settle times inside the disk drive. Also, file operations will become slower with growing fragmentation as it takes increasingly longer for the operating system to find files or free clusters.
Other file systems, e.g., HPFS or exFAT, use free space bitmaps that indicate used and available clusters, which could then be quickly looked up in order to find free contiguous areas. Another solution is the linkage of all free clusters into one or more lists (as is done in Unix file systems). Instead, the FAT has to be scanned as an array to find free clusters, which can lead to performance penalties with large disks.
In fact, seeking for files in large subdirectories or computing the free disk space on FAT volumes is one of the most resource intensive operations, as it requires reading the directory tables or even the entire FAT linearly. Since the total amount of clusters and the size of their entries in the FAT was still small on FAT12 and FAT16 volumes, this could still be tolerated on FAT12 and FAT16 volumes most of the time, considering that the introduction of more sophisticated disk structures would have also increased the complexity and memory footprint of real-mode operating systems with their minimum total memory requirements of 128 KB or less (such as with DOS) for which FAT has been designed and optimized originally.
With the introduction of FAT32, long seek and scan times became more apparent, particularly on very large volumes. A possible justification suggested by Microsoft's Raymond Chen for limiting the maximum size of FAT32 partitions created on Windows was the time required to perform a "DIR" operation, which always displays the free disk space as the last line.[66] Displaying this line took longer and longer as the number of clusters increased. FAT32 therefore introduced a special file system information sector where the previously computed amount of free space is preserved over power cycles, so that the free space counter needs to be recalculated only when a removable FAT32 formatted medium gets ejected without first unmounting it or if the system is switched off without properly shutting down the operating system, a problem mostly visible with pre-ATX-style PCs, on plain DOS systems and some battery-powered consumer products.
With the huge cluster sizes (16 KB, 32 KB, 64 KB) forced by larger FAT partitions, internal fragmentation in form of disk space waste by file slack due to cluster overhang (as files are rarely exact multiples of cluster size) starts to be a problem as well, especially when there are a great many small files.
Various optimizations and tweaks to the implementation of FAT file system drivers, block device drivers and disk tools have been devised to overcome most of the performance bottlenecks in the file system's inherent design without having to change the layout of the on-disk structures.[67][68] They can be divided into on-line and off-line methods and work by trying to avoid fragmentation in the file system in the first place, deploying methods to better cope with existing fragmentation, and by reordering and optimizing the on-disk structures. With optimizations in place, the performance on FAT volumes can often reach that of more sophisticated file systems in practical scenarios, while at the same time retaining the advantage of being accessible even on very small or old systems.
DOS 3.0 and higher will not immediately reuse disk space of deleted files for new allocations but instead seek for previously unused space before starting to use disk space of previously deleted files as well. This not only helps to maintain the integrity of deleted files for as long as possible but also speeds up file allocations and avoids fragmentation, since never before allocated disk space is always unfragmented. DOS accomplishes this by keeping a pointer to the last allocated cluster on each mounted volume in memory and starts searching for free space from this location upwards instead of at the beginning of the FAT, as it was still done by DOS 2.x.[13] If the end of the FAT is reached, it would wrap around to continue the search at the beginning of the FAT until either free space has been found or the original position has been reached again without having found free space.[13] These pointers are initialized to point to the start of the FATs after bootup,[13] but on FAT32 volumes, DOS 7.1 and higher will attempt to retrieve the last position from the FS Information Sector. This mechanism is defeated, however, if an application often deletes and recreates temporary files as the operating system would then try to maintain the integrity of void data effectively causing more fragmentation in the end.[13] In some DOS versions, the usage of a special API function to create temporary files can be used to avoid this problem.
Additionally, directory entries of deleted files will be marked 0xE5 since DOS 3.0.[42] DOS 5.0 and higher will start to reuse these entries only when previously unused directory entries have been used up in the table and the system would otherwise have to expand the table itself.[6]
Since DOS 3.3 the operating system provides means to improve the performance of file operations with FASTOPEN by keeping track of the position of recently opened files or directories in various forms of lists (MS-DOS/PC DOS) or hash tables (DR-DOS), which can reduce file seek and open times significantly. Before DOS 5.0 special care must be taken when using such mechanisms in conjunction with disk defragmentation software bypassing the file system or disk drivers.
Windows NT will allocate disk space to files on FAT in advance, selecting large contiguous areas, but in case of a failure, files which were being appended will appear larger than they were ever written into, with a lot of random data at the end.
Other high-level mechanisms may read in and process larger parts or the complete FAT on startup or on demand when needed and dynamically build up in-memory tree representations of the volume's file structures different from the on-disk structures.[67][68] This may, on volumes with many free clusters, occupy even less memory than an image of the FAT itself. In particular on highly fragmented or filled volumes, seeks become much faster than with linear scans over the actual FAT, even if an image of the FAT would be stored in memory. Also, operating on the logically high level of files and cluster-chains instead of on sector or track level, it becomes possible to avoid some degree of file fragmentation in the first place or to carry out local file defragmentation and reordering of directory entries based on their names or access patterns in the background.
Some of the perceived problems with fragmentation of FAT file systems also result from performance limitations of the underlying block device drivers, which becomes more visible the lesser memory is available for sector buffering and track blocking/deblocking:
While the single-tasking DOS had provisions for multi-sector reads and track blocking/deblocking, the operating system and the traditional PC hard disk architecture (only one outstanding input/output request at a time and no DMA transfers) originally did not contain mechanisms which could alleviate fragmentation by asynchronously prefetching next data while the application was processing the previous chunks. Such features became available later. Later DOS versions also provided built-in support for look-ahead sector buffering and came with dynamically loadable disk caching programs working on physical or logical sector level, often utilizing EMS or XMS memory and sometimes providing adaptive caching strategies or even run in protected mode through DPMS or Cloaking to increase performance by gaining direct access to the cached data in linear memory rather than through conventional DOS APIs.
Write-behind caching was often not enabled by default with Microsoft software (if present) given the problem of data loss in case of a power failure or crash, made easier by the lack of hardware protection between applications and the system.
VFAT long file names

VFAT Long File Names (LFNs) are stored on a FAT file system using a trick: adding additional entries into the directory before the normal file entry. The additional entries are marked with the Volume Label, System, Hidden, and Read Only attributes (yielding 0x0F), which is a combination that is not expected in the MS-DOS environment, and therefore ignored by MS-DOS programs and third-party utilities. Notably, a directory containing only volume labels is considered as empty and is allowed to be deleted; such a situation appears if files created with long names are deleted from plain DOS. This method is very similar to the DELWATCH method to utilize the volume attribute to hide pending delete files for possible future undeletion since DR DOS 6.0 (1991) and higher. It is also similar to a method publicly discussed to store long filenames on Ataris and under Linux in 1992.[69][70]
Because older versions of DOS could mistake LFN names in the root directory for the volume label, VFAT was designed to create a blank volume label in the root directory before adding any LFN name entries (if a volume label did not already exist).[nb 14]
Each phony entry can contain up to 13 UCS-2 characters (26 bytes) by using fields in the record which contain file size or time stamps (but not the starting cluster field, for compatibility with disk utilities, the starting cluster field is set to a value of 0. See 8.3 filename for additional explanations). Up to 20 of these 13-character entries may be chained, supporting a maximum length of 255 UCS-2 characters.[55]
If the position of the LFN's last character is not at a directory entry boundary (13, 26, 39, ...), then a 0x0000 terminator is added in the next character position. Then, if that terminator is also not at the boundary, remaining character positions are filled with 0xFFFF. No directory entry containing a lone terminator will exist.
LFN entries use the following format:
| Byte offset | Length (bytes) | Description |
|---|---|---|
| 0x00 | 1 | Sequence Number (bit 6: last logical, first physical LFN entry, bit 5: 0; bits 4-0: number 0x01..0x14 (0x1F), deleted entry: 0xE5) |
| 0x01 | 10 | Name characters (five UCS-2 characters) |
| 0x0B | 1 | Attributes (always 0x0F) |
| 0x0C | 1 | Type (always 0x00 for VFAT LFN, other values reserved for future use; for special usage of bits 4 and 3 in SFNs see further up) |
| 0x0D | 1 | Checksum of DOS file name |
| 0x0E | 12 | Name characters (six UCS-2 characters) |
| 0x1A | 2 | First cluster (always 0x0000) |
| 0x1C | 4 | Name characters (two UCS-2 characters) |
If there are multiple LFN entries required to represent a file name, the entry representing the end of the filename comes first. The sequence number of this entry has bit 6 (0x40) set to represent that it is the last logical LFN entry, and it has the highest sequence number. The sequence number decreases in the following entries. The entry representing the start of the filename has sequence number 1. A value of 0xE5 is used to indicate that the entry is deleted.
On FAT12 and FAT16 volumes, testing for the values at 0x1A to be zero and at 0x1C to be non-zero can be used to distinguish between VFAT LFNs and pending delete files under DELWATCH.
For example, a filename like "File with very long filename.ext" would be formatted like this:
| Sequence number | Entry data |
|---|---|
| 0x03 | "me.ext" |
| 0x02 | "y long filena" |
| 0x01 | "File with ver" |
| ??? | Normal 8.3 entry |
A checksum also allows verification of whether a long file name matches the 8.3 name; such a mismatch could occur if a file was deleted and re-created using DOS in the same directory position. The checksum is calculated using the algorithm below. (pFCBName is a pointer to the name as it appears in a regular directory entry, i.e. the first eight characters are the filename, and the last three are the extension. The dot is implicit. Any unused space in the filename is padded with space characters (ASCII 0x20). For example, "Readme.txt" would be "README␠␠TXT".)
unsignedcharlfn_checksum(constunsignedchar*pFCBName){inti;unsignedcharsum=0;for(i=11;i;i--)sum=((sum&1)<<7)+(sum>>1)+*pFCBName++;returnsum;}If a filename contains only lowercase letters, or is a combination of a lowercase basename with an uppercase extension, or vice versa; and has no special characters, and fits within the 8.3 limits, a VFAT entry is not created on Windows NT and later versions of Windows such as XP. Instead, two bits in byte 0x0C of the directory entry are used to indicate that the filename should be considered as entirely or partially lowercase. Specifically, bit 4 means lowercase extension and bit 3 lowercase basename, which allows for combinations such as "example.TXT" or "HELLO.txt" but not "Mixed.txt". Few other operating systems support it. This creates a backwards-compatibility problem with older Windows versions (Windows 95 / 98 / 98 SE / ME) that see all-uppercase filenames if this extension has been used, and therefore can change the name of a file when it is transported between operating systems, such as on a USB flash drive. Current 2.6.x versions of Linux will recognize this extension when reading (source: kernel 2.6.18 /fs/fat/dir.c and fs/vfat/namei.c); the mount option shortname determines whether this feature is used when writing.[71]
See also
- Comparison of file systems
- Drive letter assignment
- exFAT
- Extended Boot Record (EBR)
- FAT filesystem and Linux
- List of file systems
- Master Boot Record (MBR)
- Partition type
- Timeline of DOS operating systems
- Transaction-Safe FAT File System
- Turbo FAT
- Volume Boot Record (VBR)
Notes
- ^ abcFor maximum compatibility with MS-DOS/PC DOS and DR-DOS, operating systems trying to determine a floppy disk's format should test on all mentioned opcode sequences at sector offset 0x000 in addition to looking for a valid media descriptor byte at sector offset 0x015 before assuming the presence of a BPB. Although PC DOS 1.0 floppy disks do not contain a BPB, they start with 0xEB as well, but do not show a 0x90 at offset 0x002. PC DOS 1.10 floppy disks even start with 0xEB 0x?? 0x90, although they still do not feature a BPB. In both cases, a test for a valid media descriptor at offset 0x015 would fail (value 0x00 instead of valid media descriptors 0xF0 and higher). If these tests fail, DOS checks for the presence of a media descriptor byte in the first byte of the first FAT in the sector following the boot sector (logical sector 1 on FAT12/FAT16 floppies).
- ^ abcdeThe signature at offset 0x1FE in boot sectors is 0x55 0xAA, that is 0x55 at offset 0x1FE and 0xAA at offset 0x1FF. Since little-endian representation must be assumed in the context of IBM PC compatible machines, this can be written as 16-bit word 0xAA55 in programs for x86 processors (note the swapped order), whereas it would have to be written as 0x55AA in programs for other CPU architectures using a big-endian representation. Since this has been mixed up numerous times in books and even in original Microsoft reference documents, this article uses the offset-based byte-wise on-disk representation to avoid any possible misinterpretation.
- ^ abcThe checksum entry in Atari boot sectors holds the alignment value, not the magic value itself. The magic value 0x1234 is not stored anywhere on disk. In contrast to Intel x86 processors, the Motorola 680x0 processors as used in Atari machines use a big-endian memory representation and therefore a big-endian representation must be assumed when calculating the checksum. As a consequence of this, for checksum verification code running on x86 machines, pairs of bytes must be swapped before the 16-bit addition.
- ^bytes at sector offset 0x00B to 0x017 are stored since DOS 2.0, but not always used before DOS 3.2, values at 0x018 to 0x01B are used since DOS 3.0.
- ^DR-DOS is able to boot off FAT12/FAT16 logical sectored media with logical sector sizes up to 1024 bytes.
- ^ abThe following DOS functions return these register values: INT 21h/AH=2Ah "Get system date" returned values: CX = year (1980..2099), DH = month (1..12), DL = day (1..31). INT 21h/AH=2Ch "Get system time" returned values: CH = hour (0..23), CL = minute (0..59), DH = second (0..59), DL = 1/100 seconds (0..99).
- ^Windows XP has been observed to create such hybrid disks when reformatting FAT16B formatted ZIP-100 disks to FAT32 format. The resulting volumes were FAT32 by format, but still used the FAT16B EBPB. (It is unclear how Windows determines the location of the root directory on FAT32 volumes, if only a FAT16 EBPB was used.)
- ^ abOne utility providing an option to specify the desired format filler value for hard disks is DR-DOS' FDISK R2.31 with its optional wipe parameter
/W:246. In contrast to other FDISK utilities, DR-DOS FDISK is not only a partitioning tool, but can also format freshly created partitions as FAT12, FAT16 or FAT32. This reduces the risk to accidentally format wrong volumes. - ^In order to support the coexistence of DR-DOS with PC DOS and multiple parallel installations of DR-DOS, the extension of the default "
IBMBIO␠␠COM" boot file name can be changed using theSYS /DR:extoption, where ext represents the new extension. Other potential DR-DOS boot file names to be expected in special scenarios are "DRBIOS␠␠SYS", "DRDOS␠␠␠SYS", "IO␠␠␠␠␠␠SYS", "JO␠␠␠␠␠␠SYS". - ^If a volume's dirty shutdown flag is still cleared on startup, the volume was not properly unmounted. This would, for example, cause Windows 98 WIN.COM to start SCANDISK in order to check for and repair potential logical file system errors. If the bad sector flag is cleared, it will force a surface scan to be carried out as well. This can be disabled by setting AUTOSCAN=0 in the [OPTIONS] section in MSDOS.SYS file.
- ^ abcdSee other links for special precautions in regard to occurrences of a cluster value of 0xFF0 on FAT12 volumes under MS-DOS/PC DOS 3.3 and higher.
- ^ abSome versions of FORMAT since MS-DOS 1.25 and PC DOS 2.0 supported an option
/O(for old) to fill the first byte of all directory entries with 0xE5 instead of utilizing the end marker 0x00. Thereby. the volume remained accessible under PC DOS 1.0-1.1, while formatting took somewhat longer and newer versions of DOS could not take advantage of the considerable speed-up caused by using the end marker 0x00. - ^This is the reason, why 0xE5 had a special meaning in directory entries.
- ^ abTo avoid potential misinterpretation of directory volume labels with VFAT LFN entries by non-VFAT aware operating systems, the DR-DOS 7.07 FDISK and FORMAT tools are known to explicitly write dummy "
NO␠NAME␠␠␠␠" directory volume labels if the user skips entering a volume label. The operating system would internally default to return the same string if no directory volume label could be found in the root of a volume, but without a real volume label stored as the first entry (after the directory entries), older operating systems could erroneously pick up VFAT LFN entries instead. - ^This IBM 4680 OS and 4690 OS distribution attribute type must have an on-disk bit value of 0 as files fall back to this type when attributes get lost accidentally.
External links
- ECMA-107 Volume and File Structure of Disk Cartridges for Information Interchange, identical to ISO/IEC 9293.
- Microsoft Extensible Firmware Initiative FAT32 File System Specification, FAT: General Overview of On-Disk Format
- Understanding FAT32 file systems (explained for embedded firmware developers)
- Understanding FAT including lots of info about LFNs
- Detailed Explanation of FAT Boot Sector: Microsoft Knowledge Base Article 140418, copy made by Internet Archive Wayback Machine
- Description of the FAT32 File System: Microsoft Knowledge Base Article 154997, copy made by Internet Archive Wayback Machine
- FAT12/FAT16/FAT32 file system implementation for *nix: Includes libfat libraries and fusefat, a FUSE file system driver
- MS-DOS: Directory and Subdirectory Limitations: Microsoft Knowledge Base Article 39927, copy made by Internet Archive Wayback Machine
- Overview of FAT, HPFS, and NTFS File Systems: Microsoft Knowledge Base Article 100108
- Volume and file size limits of FAT file systems: Microsoft Technet, copy made by Internet Archive Wayback Machine
- Microsoft TechNet: A Brief and Incomplete History of FAT32 by Raymond Chen
- FAT32 FormatterArchived 2009-07-21 at the Wayback Machine: allows formatting volumes larger than 32 GB with FAT32 under Windows 2000, Windows XP and Windows Vista
- Fdisk does not recognize full size of hard disks larger than 64 GB: Microsoft Knowledge Base Article 263044, copy made by Internet Archive Wayback Machine. Explains inability to work with extremely large volumes under Windows 95/98.
- Microsoft Windows XP: FAT32 File System. Copy made by Internet Archive Wayback Machine of an article with summary of limits in FAT32 which is no longer available on Microsoft website.
- Visual Layout of a FAT16 drive