(file allocation table) fat :
فایل سیستمی که در اواخر دهه 1970 و اوایل دهه 1980 تولید شد فایل سیستمی بود که توسط سیستم عامل MS-DOS پشتیبانی می شد.
این فایل به اندازه یک فایل سیستمی ساده ای که برای فلاپی دیسک درایوهای کمتر از k500 بود پیشرفت کرد.
بعد از آن زمان آن بیشتر و بیشتر به عنوان یک واسطه بکار گرفته شد.
به طور متداول سه نوع از فایل سیستمی F AT وجود دارد : FAT32 , FAT16 , FAT12 .
دلیل تفاوت انواع FAT و اسمهایشان در سایز و در بیتهایی است که در ساختار واقعی FAT روی دیسک ثبت شده می باشند.
در FAT12، 12 بیت ورودی، در FAT16، 16 بیت ورودی و در FAT32 ، 32 بیت ورودی وجود دارد.
نکات مورد توجه در این تحقیق :
اعدادی که با کاراکتر 0x آغاز می شوند اعداد هگزا دسیمال (مبنای 16) هستند.
هر عددی که کاراکتر 0X را ندارد عدد دسیمال (مبنای 10) است.
دیگر کدهای نوشته شده در این تحقیق به زبان C هستند.
کدهای دیگر باقی مانده در این تحقیق به طور آزاد مخلوطی از دیتا المنتهای 16 و 32 بیتی است.
توضیحات عمومی (تمام انواع فایلهای FAT قابل اجرا)
تمام فایلهای سیستمی FAT به طور خودکار برای معماری کامپیوترهای IBM توسعه پیدا می کند.
اهمیت FAT بخاطر این است که تمام ساختار داده ای روی دیسک little endian هستند.
اگر ما به ورودی یک FAT ،32 بیتی نگاه کنیم داده ها روی دیسک به صورت یک سری از بایتهای 8 بیتی-شروع بایت صفر و پایان بایت 4- ذخیره می شوند.
در اینجا این 32 بیت از 00 تا 31 شماره گذاری شده اند .(00 بیت شروع لیست)
 byte[3] 3 3 2 2 2 2 2 2 
 1 0 9 8 7 6 5 4
byte[2] 2 2 2 2 1 1 1 1 
 3 2 1 0 9 8 7 6 
byte[1] 1 1 1 1 1 10 0 
 5 4 3 2 1 0 9 8 
byte[0] 0 0 0 0 0 0 0 0
 7 6 5 4 3 2 1 0 
این مهم است که شما بدانید که کامپیوتر شما یک کامپیوتر big endian است، چون به همان مقدار که داده را انتقال میدهد و از دیسک میگیرد به شما مقداری در رنج خودش برخواهد گرداند .
یک فایل سیستمی FAT از چهار بخش اصلی تشکیل شده است که در زیر راجع به ولوم ذکر شده است :
0 بخش رزرو شده 
1 بخش FAT 
2 بخش فهرست ریشه ( در ولومهای FAT 32 موجود نیست)
 3بخش فهرست فایل و داده 
boot sector و BPB (سکتور بوت و BPB )
اولین ساختار داده ای مهم روی یک ولوم (bios parameter block) BPB, FAT نامیده میشود، که در اولین سکتور از ولوم در بخش رزرو شده قرار داده می شود.
این سکتور گاهی اوقات سکتور بوت یا سکتور ذخیره یا سکتور 0 نامیده می شود، اما آن در واقع اولین سکتور از ولوم می باشد.
این اولین چیزی است که در مورد فایل سیستمی FAT باید بدانیم.
در ورژن MS-DOS 1.0 در سکتور بوت یک BPB ، وجود نداشت.
در ورژن اولیه فایل سیستم FAT،فقط دو نوع فرمت وجود داشت، یکی برای فلاپی دیسکهای یک طرفه و دیگری برای دو طرفه k 360 یا 28/5 اینچ.
تعیین اینکه دیسک از کدام نوع بود بوسیله نگاه کردن به بایت اول F AT انجام می شد (8 بیت پایین FAT[0] ).
این نقص در ورژن MS-DOS, 2.X بوسیله قرار دادن یک BPB در سکتور بوت از بین رفت و شیوه قدیمی تعیین واسطه (نگاه کردن به اولین بایت FAT ) دیگر کمتر استفاده می شد.
تمام ولومهای FAT باید یک BPB در سکتور بوت داشته باشد.
این نقص در ورژن MS-DOS, 2.X بوسیله قرار دادن یک BPB در سکتور بوت از بین رفت و شیوه قدیمی تعیین واسطه (نگاه کردن به اولین بایت FAT ) دیگر کمتر استفاده می شد.
این باعث می شود تا دومین نقص بر حسب مشخصه ولوم FAT را بیان کنیم.
BPB شبیه چه چیزی است؟
BPB تعریف شده در سکتور بوت MS-DOS 2.X فقط به ولومهای FAT کمتر از 65536 اجازه می داد.
(32 MB و 512 بایت سکتور).
این محدودیت در واقع تنها برای یک فیلد 16 بیتی بود.
این محدودیت در MS-DOS 3.X توسط اصلاح BPB با یک فیلد جدید 32 بیتی برای مقدار کل سکتورها از بین رفت.
BPB بعدی توسط سیستم عامل windows 95 تغییر پیدا کرد، در جاهایی که FAT32 استفاده می شد به طور مشخص سرویس OE M2 را منتشر ساخت (OSR 2) .
FAT 16 بوسیله ماکسیم رده بندی FAT و ماکسیم رده بندی کلاستر محدود شده بود.
FAT 32 این محدودیت را در فضای خالی دیسک در یک ولوم FAT که می توانست فضا اشغال کند آدرس دهی کرد آنقدر که بزرگترین دیسکها که فقط 2 GB بودند یک پارتیشن تعریف شده داشتند.
FAT 32 , BPB کاملا مطابق با FAT16 , FAT12, BPB است و شامل یک فیلد BPB BPB_to tsec32 است.شروع آدرس آنها تفاوت دارد که روی نوعی واسطه از FAT12 ، FAT16 یا FAT 32 در آفست 36 تعریف شده اند.
در اینجا یادآور می شویم که BPB موجود در سکتور بوت یک ولوم FAT باید همیشه نسبت به تمام فیلدهای BPB جدید برای هر یک از انواع BPB برای FAT12 ، FAT16 یا FAT32 یگانه باشد.
توجه: در جدول زیر، تمام فیلدهایی که نام آنها با BPB شروع شده قسمتی از BPB هستند.
تمام فیلدهایی که با BS شروع شده اند قسمتی از سکتور بوت هستند و به طور کامل قسمتی از BPB نیستند.
شرحهایی که با سکتور صفر از ولوم FAT شروع شده اند BPB را در بر دارند.
سکتور بوت و ساختار BPB دراین بخش تفاوتهای سکتور بوت BPB برای FAT12 وFAT16 با سکتور BPB برای FAT32 بیان می شود.
در جدول اول ساختار نشان داده شده برای FAT12 و FAT16 میباشد که از آفست 36 سکتور بوت شروع می شود.
ساختار FAT16 و FAT12 با شروع از آفست 36 در اینجا ساختار را برای FAT32 بررسی می کنیم از آفست 36 سکتور بوت آغاز می شود ساختار FAT32 با شروع از آفست 36 نکات مهم دیگری درباره سکتور صفر ولوم FAT وجود دارد.
اگر ما فکر کنیم که محتویات سکتور آرایه ای از بایت است، خوشه های زیر باید درست باشد که: sector[510]=ox55, sector[511]=oxAA نکته: اغلب Document های FAT به اشتباه می گویند که امضاء oxAA55 دو بایت آخر سکتور بوت را اشغال می کند.
این جمله درست است اگر و تنها اگر 512, BPB –byt spersec باشد.
اگر BPB-bytes_persec بیشتر از 512 باشد آفستهای این امضا بایتها را تغییر می دهند.
(با اینکه آن برای دو بایت آخر از انتهای سکتور بوت درست است).
فرض کنید مقدار فیلد به صورت روبرو است : B PB- totsec 18/32 .فرض ما دارای یک دیسک یا سایز دیسک در سکتورهای Dsksz است .
اگر فیلد BPB_Topsec (در هر دوی BPB_Topsec16 یا BPB_Topsec32 - هر کدام که صفر است- ) کوچکتر یا مساوی با DSKSZ باشد در ولوم FAT ابدا هیچ خطایی وجود ندارد.
در واقع غیرعادی نیست که مقدار B PB- Topsec 16/32 کمی کوچکتر از Dsksz باشد.
تمام اینها به معنی این است که فضای دیسک هدر رفته است.
این بدان معنی نیست که خود ولوم FAT معیوب می شود.
اما اگر BPB- Topsec 16/32بیشتر از Dsksz باشد ولوم FAT به طور جدی آسیب می بیند یا ناقص می شود چون داده های over lap که روی یک دیسک سوار شده اند خاتمه پیدا کرده اند.
ساختار داده ای FAT ساختار داده ای بعدی که مهم است خود FAT است.
آنچه را که این ساختار داده ای انجام می دهد در تک تک کلاسترهای یک فایل تعریف شده است.
بدین نکته توجه کنید که فهرست FAT یا فایل محتوی هیچ چیزی نیست اما یک فایل مرتب با صفتی خاص نشان میدهد که آن یک فهرست است.
چیز دیگری که درباره دایرکتوری موجود است این است که داده یا مقدار فایل یک سری از دایرکتوریهای 32 بایتی است.
در دیگر موارد یک دایرکتوری فقط شبیه یک فایل است.
FAT ناحیه داده ای ولوم را بوسیله تعداد کلاستر ترسیم می کند.
اولین کلاستر داده کلاستر 2 است.
اولین سکتور از کلاستر 2 (ناحیه داده ای روی دیسک) فیلدهای B PB را برای ولومی که روی آن منتج شده است حساب می کند .
تعداد سکتورهای اشغال شده بوسیله ریشه از فرمول زیر بدست می آید: RootDirsectors=((BPB-Root Entcnt*32)+(BPB –Bytspersec-1)/BPB-bytspersec توجه کنید که روی یک ولوم FAT32 مقدار BPB- Rootentcnt همیشه صفر است، بنابراین روی یک ولوم FAT32 مقدار root dirsectors نیز همیشه صفر است.
عدد 32 در بالا سایز ورودیهای دایرکتوری FAT در بایتهاست.
توجه داشته باشید که نتیجه محاسبات به بالا گرد می شود.
اولین ناحیه داده از اولین سکتور کلاستر 2 به صورت زیر محاسبه می شود: if (BPB- FATSZ 16!=0) FATSZ=BPB-FATSZ16, Else FAT32=BPB-FATSZ32; First data sector=BPB-Resvdseccnt +(BPB-num FATS*FATSZ)+Rootdirsectors; نکته: این شماره سکتور منسوب به اولین سکتور از ولومی است که شامل BPB می باشد.
(سکتوری که شامل BPB می باشد که شماره سکتورش صفر است.) هر داده خاصی روی کلاستر شماره N شماره سکتور سکتور اول (دوباره به سکتور صفر از ولوم FAT نسبت داده می شود) از فرمول زیر بدست می آید: firstsectorofcluster=((N-2)*BPB-secperclus)+firstdatasector; نکته: چون BPB-secperclus توانی از 2 است (1، 2، 4، 8، 16، 32 و …) این به این معنی است که ضرب و تقسیم بوسیله BPB-secperclus عملا می تواند از طریق عملیات shift با روش مکمل 2 که معمولا ساختارهای سریعتری نسبت به ساختارهای ضرب و تقسیم معمولی هستند انجام شود.
روی پردازشگرهای اینتل x 86 چون ساختارهای ماشینی ضرب و تقسیم خیلی سخت بهینه سازی می شوند روی آن انجام نمی شود.
تعیین نوع FAT نوع اول FAT از FAT16, FAT12 یا FAT32 بوسیله تعداد کلاسترها روی ولوم تعریف شد نه چیز دیگری.
این بخش خیلی مهم است و باید به آن توجه زیادی شود.تمام کلمات مهم هستند.
برای مثال جمله تعداد کلاسترها مهم است.
این آن چیزی نیست که ماکسیم تعداد کلاستر نامیدیم.
چون اولین داده کلاستر 2 است نه 0 و 1.
برای شروع، چگونگی تعیین تعداد کلاستر ها را تعریف می کنیم.
این تمام فیلدهای BPB استفاده شده برای ولوم است.
ابتدا تعداد سکتورهای اشغال شده بوسیله فهرست ریشه را مورد ملاحظه قرار می دهیم.
RootDirsectors=((BPB-Rootentcnt*32)+(BPB-bytspersec-1))/BPB-Bytspersec; توجه کنید که روی ولوم FAT32 مقدار BPB-Rootentcnt همیشه صفر است.
بنابراین روی یک ولوم FAT32 ، RootDirsectors همیشه صفر است.
تعداد سکتورها در ناحیه داده ولوم به روش زیر بدست می آید: if(BPB-FATsz!=0) FATSZ=BPB-FATsz16; Else FATsz=BPB-FATsz32; If(BPB-Topsec16!=0) Totsec=BPB-Totsec16; Else Totsec=BPB-Totsec32; Datasec=Totsec-(BPB-Resvdseccnt+(BPB-numFATsz*FATSZ)+(RootDirsectors); تعداد کلاسترها از فرمول زیر بدست می آید: count ofclusters=Datasec/BPB-secperclus; توجه کنید که نتیجه محاسبه به عدد کوچکتر گرد می شود.
حالا می توانیم نوع FAT را مشخص کنیم : if(count of clusters /*volume is Fat12*/ } else if (count of clusters /* volume is FAT16*/ else {{ /*volume is FAT32*/ } این تنها روشی است که می توان نوع FAT را تعیین کرد.
هنگامی که کلاسترهای FAT12 بیشتر از 4084 شود چیزهای موجود روی دیسک دیگر وجود نخواهد داشت.
اگر کلاسترها کمتر از 4085 یا بیشتر از 65524 باشد چیزهایی که روی ولوم FAT16 قرار دارد دیگر وجود نخواهد داشت.اگر تعداد کلاسترها کمتر از 65525 باشد چینه هایی که روی ولوم FAT32 قرار گیرد دیگر وجود نخواهد داشت .
اگر شما سعی کنید ولومی را تولید کنید که از این قوانین پیروی نکند، سیستم های عامل مایکروسافت به آنها اجازه نمی دهند تا به درستی کار کنند چون آنها ولوم مختلفی نسبت به FAT ی که شما با آن کار می کنید دارند.
توجه کنید که مقدار count of cluster کاملاً صحیح است.
تعداد کلاسترهای داده از کلاستر 2 شروع می شود.
ماکسیمم تعداد کلاستر برای ولوم count of cluster+1 است و تعداد کلاسترهایی که شامل دو کلاستر رزرو شده است.
C ount of cluster+2 است.
محاسبه تعداد داده کلاستر N مهمترین محاسبات مربوط به FAT است.
تعداد کلاسترها برای ورودی FAT در کجا هستند؟
این سئوال برای FAT12 سؤال پیچیده ای است اما برای FAT16 و 32 FATمحاسبات آن آسان است: if (BPB- FATsz16!=0) FATsz=BPB-FATsz16; Else FATsz=BPB-FATsz32; If(FATType==FAT16) FAT offset=N*2; Else if(FATType==FAT32) FAToffset=N*4; This FATsecnum=BPB-Resvdseccnt+(FAToffset/BPB-Bytspersec); This FATEntOffset=REM(FAToffset/BPB-Bytspersec); REM عملگر باقیمانده است.
به معنی باقیمانده تقسیم FAToffset بر BPB-Bytspersec.
FATsecnum شماره سکتوری از سکتور FAT است که شامل ورودی برای کلاستر N در اولین FAT است اگر شماره سکتور در دومین FAT را بخواهید، باید FATsz را باFATsecnum جمع کنید.
برای سومین FAT شما آنرا با 2*Fatsz جمع می کنید و همینطور تا آخر.
حالا شماره سکتور FATsecnum را می خوانیم( به خاطر دارید که این شماره سکتور منسوب به سکتور صفر ولوم FAT است.)فرض کنید که آنرا داخل یک آرایه 8 بیتی به نام secbuff خوانده ایم.
همچنین فرض کنید که نوع word ، 16 بیتی است(بدون علامت) و نوع Dword یک 32 بیتی بدون علامت است.
If(FATType==FAT16) FAT16clusEntryval=*((word*)& sec Buff[thisFATEntoff set]); Else FAT32 clusEntryval=(*((Dword*)&secBuff[thisFaTEnt offset])) &ox of FFFFFF واکشی