FAT32 Dosya Sistemi

| Aralık 5, 2019 Tarihinde güncellendi
FAT32 Dosya Sistemi

FAT32 Dosya sistemi oldukça karışık olmakla birlikte basit olarak açıklamaya çalıştım. Öncelikle disk veya medya (SD/MMC veya CF kart) üzerindeki ilk sektör Master Boot Record (MBR) olarak isimlendirilir ve ilk olarak bu sektör incelenmelidir. Bir sektör 512 bayt uzunluğundadır. Aşağıdaki şekillerde ve tabloda önemli kısımları açıklanmıştır. Genel senaryo olarak disk üzerinde tek partition (bölüm) olacağı için 2, 3 ve 4. partition’lar göz ardı edilebilir.

MBR’nin doğrulanması için son 2 bayt (510. ve 511.) daima 55 AA değerini vermelidir. Aşağıdaki gibi partition’lar MBR’nin 0x1BE (446. bayt) adresinden başlar. Her bir partition 16 bayt alanı kaplar. Toplam 4 adet partition tanımlanabilir.

master-boot-record-ilk-sektor
Şekil 1: MBR (Master Boot Record – İlk Sektör))

Partitationların önemli kısımları renkli olarak işaretlenmiştir. Boot Flag olarak görülen ilk kısım PC nin hangi partitiondan açılacağını bildirir. Bilgisayarın açılacağı partition’ın ilk baytının (Boot Flag) değeri 0x80 dir diğerleri 0x00 veya başka olabilir. Tabi ancak tek partition 0x80 değeri alabilir aksi halde hata verecektir. Bu kısım bizim için önemli değil şimdilik.

Type Code ise partitionun dosya sistemi hakkında bilgi verir. Örneğin 0x0C = FAT32, 0x82 = linux swap, 0x83 = linux native vs.

LBA Begin Partitionun hangi adresten (sektörden) başladığını gösterir. Burda dikkat edilmesi gereken nokta FAT32 sisteminin “Little Endian” olmasıdır yani ilk okunan bayt en küçük bayt değeridir. Örnek vermek gerekirse 3F 00 00 00 –> 00 00 00 3F adresini gösterir.

16-bayt-partition-entry
Şekil 2: 16-bayt partition entry

Yukarıdaki örnekte olduğu gibi eğer LBA begin 3F adresi ise FAT32 boot sektörü 3F sektöründe yerleşmiştir. Aşağıda (3F) Fat32 boot sektörünün önemli kısımları işaretlenmiş olup tabloda da bunların açıklamaları verilmiştir.

fat-32-onemli
Şekil 3: FAT32 sisteminin önemli bölümleri

fat32-tablo

Şimdi biraz hesaplama yapalım;

Önce Kök (root) dizininin başlangıç sektörü hesaplanır.

RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec – 1)) / BPB_BytsPerSec;

Burda BPB_RootEntCnt FAT 32 sisteminde daima 0x00 olacağı için RootDirSectors = 0x00 olur. (küsürat aşağıya doğru yuvarlanır)

Fat tablosunun başlangıç sektörü;

FatStart = BPB_RsvdSecCnt +LBA Begin

FAT16 veya FAT32 olup olmadığına bakıp ona göre FATSz değeri boot sektörden okunur.
Örnek C kodu aşağıdaki gibi;

İf (BPB_FATSz16 != 0)
FATSz = BPB_FATSz16;
else
FATSz = BPB_FATSz32;

İlk datanın başlangıç sektörü;

FirstDataSector = FatStart + (BPB_NumFATs * FATSz) + RootDirSectors;

Evet dosyalarımızın nereden başladığını bulduk.

Aşağıda örnek olarak benim PC nin WINHEX programı ile hesaplamış olduğumuz sektördeki görünümü

İlk sektör;

ilk-sektor-fat32

Yukarıda ilk sektör (ofsett 0) İlk partition kırmızı ile işaretlenmiştir. Koyu mavi olarak işaretlenmiş olan 4 bayt ise (3F 00 00 00) ilk partitionun başlangıç adresi(LBA Begin). (0x3F Little Endian)

Buna göre boot adresi 0x3F * 0x200 = 7E00 (bir sektör 512 bayt = 0x200 hex gösterimi)

İlk partition başlangıcı (boot sektör);

ilk-partition-baslangici-boot-sektor

(Offset 0x24) -> BPB_FATSz32= 00 00 25 48 = 0x2548 (little Endian olduğunu hiç bir zaman unutmuyoruz !)

(Ofsett 0x0B) ->BPB_BytsPerSec = 02 00 = 0x200

(Ofsett 0x0D) ->BPB_SecPerClus = 0x40

(Offset 0x0E) ->BPB_RsvdSecCnt= 0x20

(Ofsett 0x10) ->BPB_NumFATs = 0x02

Formüle koyarsak eğer;
FatStart = BPB_RsvdSecCnt +LBA Begin = 0x20 + 0x3F = 5F

FirstDataSector = FatStart + (BPB_NumFATs * FATSz) + RootDirSectors;

= 5F + (0x02 * 0x2548) + 0x00 = 4AEF (* 0x200) = 95DE00

Aşağıda görüldüğü gibi artık dosyalarımızın başladığı sektörü (Root Sektör) bulunmuş oldu.

fat32-root-sector

Sizde winhex programı kullanarak hard diskinizi inceleyebilirsiniz.

Şimdi ise klasörlerimizi inceleyelim. Kısa dosya isimli dosya girişi 32 bayt uzunluğundadır. İlk 11 bayt dosya ismi (8+3 ilk sekiz bayt isim son üç bayt uzantısı örn; erdal txt = erdal.txt) 12. bayt ise dosya özelliği (Attrib) dir.

1. Normal Kayıt – Kısa İsimli – Attrib normal
2. Uzun İsimli Dosyalar (LFN) – Attrib ilk dört biti bir.
3. Kullanılmayan (silinmiş dosyalar) – İlk Bayt 0xE5 ile başlar
4. Klasör sonu – İlk bayt sıfır.

fat32-alan-microsoft-ismi-offset-boyut

fat32-attrib-bit-lfn-aciklama-fonksiyon

Eğer uzun dosya ismi olursa (LFN) işler biraz daha karışmakta. Kısa dosya isminde 8 bit uzunluktaki ASCII karakter kümesi kullanılırken uzun dosya isminde artık 16 bit uzunluktaki “Unicode” harf kodlaması kullanılır. (Unicode arap alfabesinden matematik sembollere kadar içerisinde barındırır. İlk 256 biti ASCII karakter kümesidir. Detaylar için Bkz. www.unicode.org )

LFN girişi;

microsoft-ismi-offset-aciklama

Aşağıda uzun isim girişinin nasıl olacağı açıklanmakta;

fat32-sequence-of-long-directory-entries

Örneğin dosyamızın ismi “The quick brown. fox” olsun.

fat32-long-entry

Görüldüğü gibi 2. ve son uzun giriş ilk baytı 0x40 sayısı ile maskelenmiş yani son giriş 2 (hatırlatma : her dosya girişi 32 bayt) 2 x 32 bayt aşağıda ise kısa dosya ismi görülmekte (THEQUI~1.FOX)

fat32-00-00-00-03-3-cluster

Örneğin BOOTLOG.TXT 00 00 00 03 (3. cluster) da başlayacak ve dosya uzunluğu CF 77 yani 0xCF77 (desimal olarak 53.111 bayt =~ 52 Kb)

Dosya başlangıç adresi = 0x03 (cluster) * 0x200(bytes per sector) * 0x40 ( Sektör Per Cluster) + FirstDataSector x 0x200(baytes per sector) = 975E00 İşte size BOOTLOG.TXT nin içeriği aşağıda sunulmuş (ilk baytları)

first-data-sector-x-baytes-per-sector-975e00

Geriye artık dosyamızın içeriğini okuyup işlemek kalıyor.:)

Şimdilik bu kadar daha sonra FAT32 tablosunun incelenmesini yapacağız.

Hazırlayan: Mp3dragon Nisan 2006

KAYNAKLAR:

en.wikipedia.org/wiki/FAT32
www.pjrc.com/tech/8051/ide/fat32.html
www.microsoft.com/whdc/system/platform/firmware/fatgen.mspx

Yayım tarihi: 2019/05/26



Bir cevap yazın

E-posta hesabınız yayımlanmayacak.