(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 واکشی مقادیر از کلاستر: برای واکشی مقادیر از کلاستر از مجموعه دستورات زیر استفاده میکینم: if(fattype==fat16) *((word*) & secbuff[thisfatent offset])=fat16cluster entryval; else[ fat32clusterentryval=fat32 clus entryval& oxoF FFFFFF; *((Dword*)& secBuff[thisFAT ent offset])= (*((Dword*)& secbuff[this fat ent offset]))&oxoF ooooooo; *((Dword*)& secbuff[this fat ent offset]=(*((Dword*)& secBuff[this FatEnt offset]))]FAT32clus Entryval; حالا توجه کنید که Fat32 بالا چگونه کار می کند.
یک ورودی Fat32 در حقیقت فقط یک ورودی 28 بیتی است 40 بیت با ارزش ورودی Fat32 رزرو شده هستند.
تنها زمانی که ورودیهای Fat32 تغییر می کند زمان فرمت ولوم است، که در آن زمان تمام ورودیهای Fat باید صفر شوند که این 4 بیت نیز شامل آن می شود.ورودیهای FAT،32 بیتی واقعاً مقدار آنها 32 بیتی نیستند آنها فقط مقادیر 28 بیتی هستند.
به عنوان مثال وقادیر ورودی کلاستر 32 بیتی: OX00000000, OXF0000000,OX10000000 همه شان نشان دهنده اینند که کلاستر آزاد است ، چون از 4 بیت با ارزش در هنگام خواندن کلاستر صرفنظر شده است.
اگر 32 بیت آزاد کلاستر OX30000000 باشد و شما بخواهید آنرا به عنوان کلاستر علامت بزنید این کار توسط ذخیره سازی مقدار OXOfffffff در آن انجام می شود.
بعد از انجام این کار ورودی 32 بیتی دارای مقدار OX3FFFFFFF خواهد شد.
مقدار BPB-Bytspersec قابل تقسیم بر 2 و 4 است.
شما در مورد ظرفیت ورودی FAT32,FAT16 نگران نباشید.
کد نوشته شده زیر برای FAT12 پیچیده تر است چون 5/1 بایت(12 بیت) در ورودی fat وجود دارد.
If(FATType==FAT12) FAToffset=N+(N/2); /*multiply by 15 without using floating point, the divide by 2 rounds down*/ this FATsecnum=BPB-Resvdseccnt+(fatoffset/BPB-Bytspersec) ; thisFATEntoffset=RBM(FAToffset/BPB-Bytspersec) ; حالا ظرفیت سکتور بندی را چک می کنیم: if(hisfatentoffset==(BPB-bytspersec-1)){ fat12clusentryval=*((word*)&secBuff[thisfatentoffset]); if(N&ox0001) */ تعداد کلاستر فرد است fat12clusentryval=fat12clusentryval>>4;/* else */ تعداد کلاستر زوج است fat12clusentryval=fat12clusentryval&ox0fff,/* برای واکشی محتویات از کلاستر برای این کار از روش زیر استفاده می شود: if(N&ox00011111){ fat12clusentryval=fat12clusentryval *((word*)&secbuff[thisfatentoffset])=(*(word*)& secbuff[thisfatent offset]))&ox000F; }else{ /* تعداد کلاسترها زوج است fat12clusentryval=fat12clusterentryval& oxoFFF;/* *((word*)&secBuff[this fat en to offset])=(*(wprd*)& secBuf[thisfatentoffset]))&oxfooo; *((word*)&secBuff[this FATentoffset]))|fat12clusteryval, secBuff[thisfatentoffset])) fat12clusentryval, توجه:عملگر>>4 بیت high را شیفت می دهد با ورودی صفر و عملگر» 4 بیت low را شیفت می دهد.
روشی که داده یک فایل به آن فایل مربوط می شود در زیر آمده است.
در ورودی فهرست تعداد کلاستر اولین سکتور فایل ذخیره شده است.
اولین کلاستر فایل داده به اولین شماه کلاستر مربوط می شود و محل داده روی ولوم توسط روش شرح داده شده حساب می شود.
توجه کنید که یک فایل با طول صفر فایلی است که داده ای به آن تخصیص داده نشده.
مکان این کلاستر در fat شامل هر یک از دو علامت EOC یا شماره کلاستر کلاستر بعدی فایل است.
مقدار EOC بستگی به نوع FAT دارد: iseef=false; if(fattype==fat12){ if(fat countent>=oxoff 8 isEOF=true; } else if(fattype==fat16){ if(fatcount>=oxFFF 8) iseof=true; } else if(fattype==fat32){ if(fatcountent>=oxoFFFFFF 8) is eof=true; } توجه کنید که کلاستری که در fat شامل EOC است به فایل و همچنین آخرین کلاستر فایل اختصاص داده می شود.
درایورهای FAT سیتم عامل مایکروسافت از مقدار oxoFFF برای OXFFFF,FAT12 برای OXOFFFFFFF,FAT16 برای FAT32 در زمانی که محتویات کلاستر آنها با EOC نشانی دهی شده است استفاده می کنند.
نشان bad cluster نیز وجود دارد.
هر کلاستری که در ورودی bad sector, fat داشته باشد نباید روی فهرست آزاد مکانی برای آن در نظر گرفته شود چون آن مستعد خطا است، مقدار bad cluster در oxoFF7,fat12 است، در oxFFF7,FAT16 و در oxoFFFFFF7 , FAT32 است.
کار دیگر دیسک اینست که باید کلاسترهای از دست رفته را تشخیص داده و آنها را مرمت کند.
لیست کلاسترهای خالی در FAT همان لیست تمام کلاسترهای دارای مقدار صفر در ورودی کلاستر FAT است.
توجه داشته باشید که این مقدار باید برای دیگر ورودیهای FAT که آزاد نیستند واکشی شود.
لیست کلاسترهای آزاد روی ولوم در هیچ جا ذخیره نشده است.
آن باید زمانی که ولوم نصب می شود بوسیله پویش FAT برای ورودیهایی که مقدار صفر است محاسبه شود.
روی ولومهای fat32 سکتورBPB-FSINFO ممکن است شامل تعداد کلاسترهای آزاد روی ولوم باشد.
در دو کلاستر شروعی fat چه چیزی ذخیره شده است؟
در اولین کلاستر رزرو شده fat[0]; شامل مقدار بایت BPB-media در بیت اول low است.
و بقیه بیتها یک هستند.
برای مثال، اگر مقدار oxF8 BPB-media, باشد، برای fat[0]=oxoff8,fat12 و برای fat[0]=oxFFF8 , fat16 و برای fat[0]=oxoFFFFFF8,fat32 است .
دومین کلاستر رزرو شده، به وسیله نشانه EOC فرمت شده است،درایور فایل سیستم ممکن است از 2 بیت با ارزش ورودی fat[1] برای فلگهای ولوم باشد.
توجه داشته باشید که محل بیت در fat32,fat16 با هم متفاوت است.
برای fat16 : clnshutBitmask=ox8000; HrdErBitmask=ox4000; برای fat32 : clnshutBitmask=oxo8000000; HrdErrBitmask=oxo4000000; بیتclnshutBitmask اگر این بیت 1 باشد ولوم تمیز است.
اگر این بیت o باشد ولوم کثیف است.
این نشان می دهد که درایور فایل سیستم درست نصب نشده.
بیت HrdErrBitmask اگر این بیت 1 باشد با error های خواندن/نوشتن دیسک مواجه می شویم.
اگر این بیت o باشد درایور فایل سیستم با یک خطای I/O روی ولوم آخر دیسک که شاخصی برای سکتورهایی است که علامت بد دارند مواجه می شود.
این بیت برای مرمت دیسک بکار می رود.
دو نکته مهم درباره ناحیه fat یک ولوم fat وجود دارد: 1-کد fat نباید هیچ تصمیمی در مورد اینکه سکتور آخر fat شامل چه چیزهایی باشد بگیرد.
2-مقدار BPB-fatsz16 (BPB-fatsz32 برای ولومهای 32) ممکن است بیشتر از مقدار مورد نیاز باشد.
آخرین سکتور FAT مقدارش از countofclusters+1 بدست می آید.
کد FAT باید محتویات سکتورهای اضافی FAT را صفر کند.
ارزش دهی اولیه به ولوم FAT نوع fat بستگی به تعداد کلاسترها دارد و سکتورهای قابل استفاده در ناحیه داده یک ولوم fat بستگی به سایز fat دارد.
سیستم های عامل مایکروسافت فقط فرمت fat12 را روی فلاپی دیسکها انجام می دهند، چون تعداد فرمتهای فلاپی دیسکها محدود است و همه یک سایز ثابت دارند با یک جدول ساده انجام می شود.
برای fat12 محاسبات dynamic است.
برای فرمت fat12 تمام محاسبات برای BPB-secperclus و BPB-fatsz16 در خارج با دست روی یک تکه کاغذ انجام می شود و در جدول ذخیره می شود.
(تعداد کلاستر سوار شده کمتر از 40 85 تا است) اگر رسانه شما بیشتر از 4MG است با fat12 مشکلی ندارد.
باقیمانده این بخش در کل خاص درایورهایی است که 512 بایت در سکتور دارند.
با درایورهایی که سایز سکتورشان متفاوت است نمی توانید از جدولها یا محاسبات هوشمند استفاده کنید.
سایز ولوم fat32,fat16 یک مقدار ثابتی است.
برای پنجره ها این مقدار 512 MG است.
هر ولوم fatی که کوچکتر از 512mg باشد fat16 است و هر ولومی که fatآن 512MG یا بزرگتر از آن باشد FAT32 است.
کوچکترین مقدار برای ولومهای windows ms-Dos, که هنوز فرمت نشده است چیست؟
دو تا جدول وجود دارد.
یکی اش برای fat16 و دیگری برای fat32 .
یک ورودی در این جدولها بر اساس سایز ولوم(مقداری که در BPB-Totsec32 یا Totsec16 می رود)انتخاب می شود و همچنین مقدار مجموع جدول در BPB-secperclus وجود دارد.
Struct Dsksz Tosecperclus { Dword Disksize; Byte secperclusval; }; توضیح: این جدول برای درایورهای fat16 می باشد.
توجه کنید که این جدول شامل ورودیهایی برای دیسکها با سایزهای بزرگتر از512MG است حتی با وجود آنکه نوعا ورودیها فقط برای دیسکهای با سایز 512M استفاده می شود.
روش این جدول بدین گونه است که این ورودی را در فیلد disksize برای سایز دیسک کوچکتر یا مساوی با آن جستجو می کند.
برای اینکه جدول به طور شایسته ای کار کند، باید BPB-Rsvdseccnt ،1 باشد، BPB-numFATs ، 2 باشد و BPB-RootEntcnt باید 512 باشد.
Dsksz Tosec perclus Dsk Table fat16[]={ */ دیسکهای بالای MG4.1 مقدار صفر برای خطاهای secperc lusval */ [84000] */ دیسکهای بالای 1k, 16mg کلاستر */ [32680, 2] */ دیسکهای بالاتر از MG128و 2k کلاستر */ [262144,4] /*دیسکهای بیشتر از MG 256 و 4k کلاستر */ [524288,8] */ دیسکهای بیشتر از 512MG و 8K کلاستر */ [1048576,16] ورودیهای بیشتر از این درجه بندی استفاده نمی شوند مگر اینکه در fat16 مجبور شوند.
دیسکهای بیشتر از 1GB، 16k کلاستر [2097152,32] دیسکهای بیشتر از 2GB، 32k کلاستر [4193304,64] دیسک بزرگتر از 2G و مقدار صفر برای خطاهای secperclusval [oxoFFFFFFFF,0] جدول بعدی برای درایورهای fat32 است.
توجه کنید که این جدول شامل ورودیهایی برای دیسک سایزهای کوچکتر از 512MG حتی با وجود اینکه نوعا فقط ورودیها برای دیسکهای بزرگتر مساوی 512 است.
روش دستیابی جدول به اولین ورودی در جدول نگاه کردن به فیلد disksize و پیدا کردن عدد کوچکتر یا مساوی این فیلد در جدول است.
برای اینکه جدول به طور شایسته کار کند باید BPB-Rsvdseccnt ،32 باشد و BPB-numfats باید 2 باشد.
Dsksz to sec perclus Dsk Table fat32[]={ مقدار سکتور در fat چگونه محاسبه می شود؟
RootDirsectors=((BPB-RootEntcnt*32)+(BPB-Bytspersec-1))/BPB-Bytspersec; Tmpval 1=Dsksize-(BPB-secperclus)+BPB-numfats; If(fatType==fat32) Tmpval2=Tmpval2/2; Fatsz=(Tmpval1+(tmpval2-1))/Tmval2; If(fatType==fats32){ BPB-fats32=fatsz; } else{ BPB-fatsz10=lowrd(fatsz); /**/BPB-fatsz32 در یک fat16 , BPB وجود ندارد.*/ } اساس محاسبات پیچیده است، اما مسئله مهم اینجاست که سیستم های عامل مایکروسافت آنرا چگونه انجام می دهند و کار می کنند.
توجه داشته باشیدکه این محاسبه ریاضی ممکن است به درستی کار نکند.
آن بعضی اوقات یک fatsz را برای fat16 خیلی بزرگ به اندازه 2 سکتور مرتب می کند و بعضی اوقات به اندازه 8 سکتور برای fat32 خیلی بزرگ مرتب می کند.
آن با مقدار کوچک fat32 کار نمی کند.
هزینه هدر رفته سکتورها کم است، در واقع این محاسبه یک روش ساده اطمینان بخش در اغلب حالتها است.
ساختار سکتور fat32, Fsinfo و سکتور بوت backup روی یک ولوم fat,fat32 می تواند یک ساختار داده ای بزرگی باشد بر خلاف fat16 که تا ماکسیمم 128k در سکتورها محدودیت دارد و fat12 که تا ماکسیمم 6k محدودیت دارد.
شماره سکتور fstno یک مقدار در فیلد BPB-Fsinfo است.
برای سیستم های عامل مایکروسافت مقدار آن همیشه 1 است.
در زیر ساختار سکتور Fsino آمده است.
ساختار سکتور fat32,Fsinfo و سکتور backup خصوصیت دیگر ولومهای FAT32 این است که روی فیلد FAT16/12,BPB-BKBOOTSE موجود نمی باشد.
ولومهای FAT16/12 اگر محتویات سکتور صفر ولوم overwrite یا بد باشد و نتوان آنرا خواند بکلی از بین می روند.
این یک عیب برای ولومهای FAT12 و FAT16 است.فیلد BPB-BKBOOTSEC روی ولومهای FAT32 این مشکل را برطرف کرده است، چون یک کپی backup از اطلاعات سکتور بوت روی ولوم 6 قرار دارد.
اگر اطلاعات سکتور صفر به طور تصادفی overwrite باشد سکتورهای بوت را از کپی backup بر می گرداند.
در حالتی که سکتور صفر بد باشد، این اجازه را می دهد که ولوم نصب شود به این جهت که کابر بتواند به داده ها قبل از تعویض دیسک دستیابی پیدا کند.
در حالت دوم دلیل اینکه چرا مقدار همیشه در سکتور 6 از BPB-BKBOOTSEC گذاشته میشود این است که اگر سکتور صفر غیر قابل خواندن باشد، سیستم عاملهای مختلف سکتورهای بوت backup را که از سکتور 6 لوم fat32 شروع می شود چک می کنند.
توجه کنید که شروع سکتور BPB-BK BOOTSEC یک رکورد خوب کامل است.
سکتور بوت FAT32 مایکروسافت در واقع به طول سه سکتور 512 بایتی است.
یک کپی از تمام سه سکتور شروعی در سکتور BPB-BKBOOTSEC وجود دارد.
همچنین یک کپی از سکتور FSINFO در اینجا هست ، حتی با وجود اینکه فیلد BPB-FSINFO در این سکتور بوت پشتیبان وجود دارد اما با همان مقدار ذخیره شده در سکتور صفر BPB شروع می شود .
ساختار FAT directory یک دایرکتوری FAT به خودی خود بی ارزش است اما آن یک فایل مرکب از یک لیست خطی از ساختارهای 32 بایتی است.
تنها دایرکتوری خطی که همیشه باید حضور داشته باشد دایرکتوری ریشه است.
برای رسانه FAT12 و FAT16 دایرکتوری ریشه در مکان ثابتی روی دیسک بلافاصله در انتهای FAT از یک سایز ثابت در سکتورهای محاسبه شده از BPB-ROOTENTCNT قرار دارد .
در رسانه FAT12 و FAT16 اولین سکتور از دایرکتوری ریشه شماره سکتور منسوب به اولین سکتور از ولوم FAT است: firstrootDirsecnum=BPB-resvdseccnt+(BPB-numfats*BPB-fats16); در fat32 دایرکتوری ریشه می تواند سایز متغیری باشد که یک کلاستر رشته ای است مانند هر دایرکتوری دیگری.
اولین کلاستر دایرکتوری بوت روی یک ولوم fat32 در BPB-ROOTCLUS ذخیره می شود.
برخلاف دیگر دایرکتوریها، دایرکتوری بوت روی انواع FATها هیچ چیزی ندارد تا آنرا نشاندار کند (اسامی فایلها با\ مشخص می شود.) ساختار بایت ورودی دایرکتوری FAT32 DIR-name [0] : مطالب خاصی درباره اولین بایت (dir-name[0]) از ورودی دایرکتوری fat.
اگر dir-name[0]=0xe5 ورودی دایرکتوری خالی است(در این ورودی هیچ فایل یا دایرکتوری موجود نیست) اگر dir-name[0]=ox00 ورودی دایرکتوری خالی است.(مثل oxe5 ) و ورودی دایرکتوری پس از آن اختصاص داده نشده است.(در کل ورودیها پس از این صفر هستند) اگر dir-name[0]=oxo5همان مشخصات oxe5 را داراست .
oxe5 در حقیقت یک مقدار بایت صحیح KANJI برای کارکتر در ژاپن استفاده شد.
فیلد DIR-NAME از دو قسمت تشکیل شده است: 8 کاراکتر برای قسمت نام و 3 کاراکتر برای تمدید.
بین قسمت نام و قسمت تمدید(صفت) یک کاراکتر “0” قرار دارد.
کاراکترهای زیر در هیچ بایتی از DIR-NAME مجاز نیستند.
مقادیر کمتر از OX20 مگر برای حالت خاص oxo5درdir_name[0] .
ox3c,ox3c,0x3b,ox3a,ox2f,ox2e,ox2c,ox2b,ox2a,ox22,ox7c,ox5d,ox5c,ox5b,ox3f,ox3e,ox3d .
در زیر نمونه های معتبر ورودی یک اسم توسط کابر آمده است: “foo.bar” “Foo BAR” “foo.BAR” “Foo BAR” “foo.BAR” “Foo BAR” “foo” “Foo ” “foo” “Foo ” “PICKLE.A” “PICKLE A” “Pretty by.big” “PRETTY BG BIG” “.big” illegal , DIR_name [0]cannot be oxzo در دایرکتوریهای FAT تمام نامها یگانه هستند.
DIR-ATTR خواص فایل را ذکر می کند: ATTR-READ-ONLY یعنی اینکه نمی شود روی فایل نوشت.
ATTR_HIDDEN : می گوید که در لیست دایرکتوری این فایل نشان داده نشو د.
ATTR-SYSTEM:یعنی اینکه این فایل ، یک فایل سیستم عملیاتی است.
ATTR-VOLUME-ID : این فایل باید در دایرکتوری ریشه باشد .
نام این فایل در واقع lable ولوم است.dir-fstclusHI و DIR-FSTCLUSLO باید همیشه برای LABLE ولوم صفر باشند.
ATTR-DIRECTORY : یعنی اینکه این فایل در عمل یک ظرف برای دیگر فایل هاست.
ATTR-ARCHIVE : این خصوصیت فواید backup را پشتیبانی می کند.
این بیت زمانی که یک فایل ایجاد می شود ، تغییر نام می دهد یا وقتی که بوسیله درایور فایل سیستم ایجاد میشود یا زمانی که نوشته می شود .
backup ممکن است از این خصوصیت برای نشان دادن فایلهایی که روی ولوم پس از آخرین باری که یک backup انجام شد استفاده کند.
توجه کنید که بیت خصوصیت ATTR-LONG-NAME ترکیب را نشان می دهد و فایل در واقع قسمتی از ورودی اسم LONG برای دیگر فایلهاست.
وقتی که یک دایرکتوری ایجاد می شود، یک فایل با بیتATTR-DIRECTORY در فیلد DIR-ATTR قرار می گیرد.
DIR-FILESIZE صفر می شود.
DIR-FILESIZE روی یک فایل که خصوصیت ATTRE-DIRECTORY دارد همیشه صفر است و استفاده نمی شود(دایرکتوریها بوسیله کلاستر زنجیره ای MARK شده با EOC قالب بندی می شوند).
یک کلاستر به دایرکتوری اختصاص داده می شود(مگر اینکه دایرکتوری ریشه روی ولوم fat12/fat16 باشد).
Dir-fstcluslo و dir-fstclusHI که تعداد کلاستر و مکان یک مارک EOC در ورودی کلاسترهایی که درFAT است می باشد قرار داده می شود.
پس شما بایتهای واقع در آغاز کلاستر را صفر می کنید.
اگر دایرکتوری، دایرکتوری ریشه باشد نمیتوان این کار را انجام داد.
اگر دایرکتوری، دایرکتوری ریشه است، نیاز به دو ورودی خاصی در اول دو 32 بایتی ورودی دایرکتوری داریم.
فیلد dir-filesize روی هر دو ورودی ها صفر است و تمام فیلدهای داده در هر دوتایی این ورودیها با همان مقداری که قبلا بودند در ورودی دایرکتوری مستقر می شوند .
حالا dir-fstcluslo و dir-fstclusHI را برای ورودی نقطه set می کنیم.
در خاتمه ورودی dir-fstcluslo و dir-fstclushi را دو نقطه می گذارید برای شماره کلاستر اول دایرکتوری که ایجاد کرده اید.
در ذیل خلاصه ورودیها نقطه و دو نقطه آمده است: ورودی نقطه دایرکتوری است.
ورودی دو نقطه شروع کلاستر حاضر در این دایرکتوری را نقطه گذاری می کند(اگر این دایرکتوری ها در دایرکتوری ریشه موجود باشند کد صفر می شود) فرمتهای data and time اغلب فایلهای سیستمی data/time, fat را پشتیبانی نمی کنند بجز در موارد dir-wrttime .
dir- wrtdate .
به همین دلیل,dir-crttime , DIR_Lstancc Date,dirwrtdate dir-crttimemil درواقع فیلدهای اختیاری هستند .
با این حال DIR_Wrttime و DIR_WrtDate باید پشتیبانی شوند.
اگر دیگر فیلدهای تاریخ و زمان پشتیبانی نشوند باید روی فایل ایجاد شده آنها را صفر کرد و از آنها چشم پوشید.
فرمت تاریخ یک ورودی دایرکتوری fat تاریخ ، نشانه اش یک فیلد 16 بیتی است.
فرمتش به این صورت است(بیت صفر LSB یک کلمه 16 بیتی است ، بیت 15 ام msb کلمه 16 بیتی است) بیت0-4 :روز،ماه مقدار آن بین 31-1 است.
بیت 5-8 : ماه، سال مقدار آن بین 12-1 است.
بیت 9-15 :شماره سالها از سال 1980.
مقدار آن بین 127-0 است(2107-1980) فرمت زمان یک ورودی دایرکتوری fat زمان، نشانه اش یک فیلد 16 بیتی است.
بیت 0-4 : ثانیه، رنج آن بین 29-0 است (58-0 ثانیه) بیت 5-10 : دقیقه، رنج آن بین 59-0 است.
بیت 11-15 : ساعت، رنج آن بین 23-0 است ورودیهای دایرکتوری طولانی fat .
پیدا کردن ورژن قبلی ms-dos نیاز است.
در مجموعه ورژنهای windows95 از دایرکتوری ms-dos\windows .
,ms-dos,Api نمی توانست به طور تصادفی یک entry تکی را پیدا کند.
روی رسانه فیزیکی directory entryهای کوتاه در انتها جاسازی شده است که به هم پیوسته هستند.
تغییر خصوصیات دیسک فایل داده را به خطر نمی اندازد.
مطابق اهداف مکان دستیابی directory entry طولانی به عنوان یک directory entry کوتاه با ویژگی خاصی تعریف شده است.
همانطور که قبلا توضیح داده شدیک directory entry طولانی فقط یک directory entry معمولی با فیلدهای زیر است: ATTR-LONG-NAME ATTR-READ-ONLY | ATTR-HIDDEN ATTR-SYSTEM ATTR-VOLUME-ID اجزاء ماسکی که برای تعیین ورودی LONG-NAME باید همیشه تعریف شود به صورت زیر است: ATTR-LONG-NAME-MASK ATTR-READ-ONLY | ATTR_HIDDEN | ATTR_system | ATTR_Directoty | ATTR_Archive وقتی که با یک directory-entry مواجه شود فایل سیستم یک رفتار خاصی نشان می دهد.
این رفتارها قسمتی از یک directory entry که وابسته به یک directory entry کوتاه است می باشد.
هر directory entryطولانی مشخصات زیر دارد: سازماندهی directory entry های کوتاه و بلند یک سری از ورودیهای طولانی همیشه وابسته به یک ورودی کوتاه که همیشه جلوتر از ورودیهای بلند هستند، هستند.
ورودیهای طولانی به ورودیهای کوتاه پیوسته هستند به یک دلیل: فقط directory entry های کوتاه در ورژنهای قدیمی ms-dos\windows قابل رویت هستند.
بدون یک ورودی کوتاه ضمیمه کردن directory entry طولانی به طور کاملاً نامرئی روی ورژنهای قدیمی ms-dos\windows انجام می شود.
یک ورودی طولانی به خودی خود هرگز وجود ندارد.
اگر ورودیهای طولانی بدون وابستگی به یک مقدار صحیح ورودی کوتاه پیدا شوند در اصطلاح به آنها بی پدر و مادر می گویند.
شکل زیر یک مجموعه از n تا directory entry طولانی پیوسته را نشان می دهد.