# برنامه نویسی سطح پایین > برنامه نویسی اسمبلی خانواده x86 >  نحوه فرمت كردن و ايجاد فايل سيستم

## m-taheri

با سلام. 

نميدونم سوالمو جاي درستي مطرح كردم يا نه
من ميخوام بدونم كه وقتي يه درايو رو (هارد يا فلاپي -يا فلش مموري و يا sd-card) را فرمت ميكنيم دقيقا چه اتفاقي ميوفته؟ 
ظاهرا توي سكتور 0 يه سري اطلاعات نوشته ميشه. آيا كسي ميدونه دقيقا چه چيزائي و توي چه آدرسهائي نوشته ميشه؟ آيا بقيه قسمتها دست نخورده باقي ميمونه؟
آيا وقتي يه حافظه bootable هست اطلاعات بوت هم در همين سكتور 0 نوشته ميشه؟
و اينكه اگر ما يك سيستم بدون سيستم عامل داشته باشيم آيا باز هم ميشه توي سكتور 0 هارد چيزي(مثلا اطلاعات مربوط به بوت) نوشت؟

----------


## MostafaMohammadi

> نميدونم سوالمو جاي درستي مطرح كردم يا نه


جای درستی مطرح نکردید، واقعیت اینه که این سوال نه تنها ربطی به زبان برنامه نویسی اسمبلی نداره، بلکه هیچ کدوم از تالارهای دیگه سایت برنامه نویس برای مطرح کردن چنین سوالی جای مناسبی نیست.
ولی متاسفانه جای دیگه ای هم تو وب فارسی سراغ ندارم که این سوال رو بپرسید. من جواب سوالات تون رو نمی دونم ولی مطمئن ام اگه ایمیل یه استاد "بدرد بخور" ذخیره و بازیابی اطلاعات یا مفاهیم سیستم عامل گیر رو بیاری، می تونه بهتر راهنمایی ات کنه.
در هر صورت، من سعی می کنم با وجود پایین بودن سطح دانش ام کمک ات کنم.



> من ميخوام بدونم كه وقتي يه درايو رو (هارد يا فلاپي -يا فلش مموري و يا sd-card) را فرمت ميكنيم دقيقا چه اتفاقي ميوفته؟


یه هارد درایو، فلاپی و ... هایی که هنوز پارتیشن بندی نشده اند (بگو پارتیشن بندی، نگو فرمت) اولین سکتور شون Boot Sector است. وقتی پارتیشن بندی میشن اولین سکتور میشه Master Boot Record و Boot Sector منتقل میشه به اولین سکتور هر پارتیشن.



> ظاهرا توي سكتور 0 يه سري اطلاعات نوشته ميشه. آيا كسي ميدونه دقيقا چه  چيزائي و توي چه آدرسهائي نوشته ميشه؟ آيا بقيه قسمتها دست نخورده باقي  ميمونه؟


فرمت های مختلف اطلاعات توی سکتورهای اولیه شون متفاوته. مثلا توی FAT از خونه اولی یعنی 0x000 تا سه بایت، دستور مربوط به پرش ذخیره میشه. اینکه نرم افزاری که می خوایم باهاش بوت کنیم توی چه درایوی است و از چه آدرسی فراخوانی میشه. خونه بعدی یعنی 0x003 تا 8 بایت توضیح میده که Device مون تو چه محیطی پارتیشن بندی شده، ویندوز 98، 2000 و ...
خونه بعدی یعنی 0x00B الی آخر حاوی اطلاعات اولیه مورد نیاز BIOS است، که بسته به نرم افزار مورد نظر فرق می کنه و اگه من بخوام بگم چی هستند، باید 100 صفحه چیز میز بنویسم.
این رویه ادامه داره تا چیزی حدود 11 بایت، بعد یه فضای رزرو شده هست، بعد پارتیشن ها شروع میشن. من میدونم سر پارتیشن و ته پارتیشن اطلاعاتی مربوط به پارتیشن رو می نویسن، یه گپی هم معمولا بین دوتا پارتیشن میزارن.



> آيا وقتي يه حافظه bootable هست اطلاعات بوت هم در همين سكتور 0 نوشته ميشه؟


بله دقیقا



> و اينكه اگر ما يك سيستم بدون سيستم عامل داشته باشيم آيا باز هم ميشه توي سكتور 0 هارد چيزي(مثلا اطلاعات مربوط به بوت) نوشت؟


وقتی چیزی داخل هارد نباشه که باهاش سیستم رو بوت کنیم، نباید بنویسیم. البته اگه بنویسیم خطای خاصی رخ نمیده، فوق اش میره به اون آدرس و می گه هیچ نرم افزار boot able ای پیدا نکردم و ... مثل وقت هایی که ویندوز ایکس پی می پره، یا درایو سی مون فرمت میشه.

----------


## m-taheri

خیلی ممنون از راهنمائیتون بسیار خوبتون  استاد عزیر.
فقط یه سوال دیگه هم دارم. من اگر بخوام یک رم موبایل رو. مثلا یه micro sd 1GB رو با fat 16 فرمت کنم باید تو سکتور 0 چه چیزائی بنویسم؟ (البته من یه sdcard را با fat16 و با ویندوز فرمت کردم و بعد سکتور 0 رو از روش خوندم و 512 بایت بدست آمده را توی یه فایل txt ذخیره کردم. و حالا وقتی این 512 بایت رو روی هر sdcard دیگه میریزم دقیقا انگار که اونو فرمت کردیم ) البته من هیچ نیازی به bootable بودن و یا دستور پرش ندارم. فقط میخوام با fat16 فرمت بشه. در واقع میخوام بدونم وقتی با ویندوز یه sdcard رو فرمت میکنیم ویندوز چه کاری انجام میده؟
 و در نهایت  تفاوت quick format , format و low level format چیه؟

----------


## xman_1365_x

سوال رو جای درستی مطرح کردین اما بهتر بود در بخش سیستم عامل باشه،کتاب فیض ا... خاکپور - جلد دوم - فصل 15 عملیات دیسک رو مطالعه کنید به جواب سوال هاتون میرسید.
موفق باشی

----------


## ssbostan

> با سلام. 
> 
> نميدونم سوالمو جاي درستي مطرح كردم يا نه
> من ميخوام بدونم كه وقتي يه درايو رو (هارد يا فلاپي -يا فلش مموري و يا sd-card) را فرمت ميكنيم دقيقا چه اتفاقي ميوفته؟ 
> ظاهرا توي سكتور 0 يه سري اطلاعات نوشته ميشه. آيا كسي ميدونه دقيقا چه چيزائي و توي چه آدرسهائي نوشته ميشه؟ آيا بقيه قسمتها دست نخورده باقي ميمونه؟
> آيا وقتي يه حافظه bootable هست اطلاعات بوت هم در همين سكتور 0 نوشته ميشه؟
> و اينكه اگر ما يك سيستم بدون سيستم عامل داشته باشيم آيا باز هم ميشه توي سكتور 0 هارد چيزي(مثلا اطلاعات مربوط به بوت) نوشت؟



سلام؛
در مورد شماره گذاري سكتور ها بايد توجه كنيد كه شماره بندي سكتور ها از 1  شروع ميشه و در تمامي رسانه ها اولين sector از اولين track از اولين  cylinder از اولين head به Master Boot Record معروف هست و اين فضا كه بسته  به نوع رسانه حجم هاي متغيري داره، براي نگهداري bootloader و partition  allocation table استفاده ميشه.
اين سكتور كه حجمي برابر با ديگر سكتور ها داره معمولا 512 بايت هست كه از  اين 512 بايت، 64 بايت مروبط به جدول تخصيص پارتيشن يا همون partition  allocation table هست.
اين 64 بايت به 4 تا 16 بايت تقسيم ميشه و دليل اينكه شما بيشتر از 4 پارتيشن اوليه نميتونيد داشته باشيد همين موضوع هست.
در مورد پارتيشن هاي توسعه يافته يا همان extended نيز اين موضوع صدق ميكنه  و شما با ايجاد يك پارتيشن extended در اصل 16 بايت از جدول تخصيص پارتيشن  رو اشغال ميكنيد و اين 16 بايت براي مشخص كردن پارتيشن هاي منطقي يا  logical به نقطه اي ديگر از رسانه اشاره ميكنه كه به اين بخش در اصطلاح  extended boot record گفته ميشه.

فكر كنم تا اينجا جواب بعضي از سوال هايي كه براتون پيش اومده و پيش خواهد اومد رو گرفته باشيد. در مورد سوال هاي ديگه اي كه مطرح كرديد هم مطالب كوتاهي رو براتون مينويسم كه يك ديد كلي از سكتور MBR بدست بياريد.

اطلاعات مربوط به بوت و بوت لودر هم ميتونن در MBR نوشته بشن، هم ميتونن در اولين سكتور پارتيشن بوت يا first sector of boot partition نوشته بشن.

بله، امكانش هست شما بدون داشتن سيستم عامل، در سكتور 1 اطلاعات دلخواه رو ذخيره كنيد.

اطلاعات مروبط به هر فايل سيستم متفاوت هست و ترتيب نوشته شدنشون در اون 16 بيت هم معمولا متفاوت هست.
- شماره پارتيشن
- نوع پارتيشن (اوليه يا توسعه يافته)
- شماره head
- شماره cylinder
- شماره سكتور شروع
- شماره سكتور پايان
و...

در مورد فرمت كردن هم:
فرمت معمولي: در اين نوع فرمت اطلاعات مروبط به آدرس فايل ها و راهنما ها نيز از روي پارتيشن حذف ميشن.
فرمت سريع: در اين نوع فرمت فقط جدول تخصيص فضا حذف ميشه.
فرمت سطح پايين: در اين نوع تمامي محتواي سكتور ها با صفر مقدار دهي ميشه و MBR مجددا تجديد ميشه، در اين نوع فرمت بايد از نرم افزار مخصوص ارائه شده توسط شركت توليد كننده رسانه استفاده كنيد.

موفق باشيد.

----------


## m-taheri

> سوال رو جای درستی مطرح کردین اما بهتر بود در بخش سیستم عامل باشه،کتاب فیض ا... خاکپور - جلد دوم - فصل 15 عملیات دیسک رو مطالعه کنید به جواب سوال هاتون میرسید.
> موفق باشی


مرسی. فقط این کتاب که فرمودید اسمش چیه دقیقا؟

----------


## xman_1365_x

> فقط این کتاب که فرمودید اسمش چیه دقیقا؟


برنامه نویسی به زبان اسمبلی برای کامپیوتر های شخصی

موفق باشید

----------


## ssbostan

سلام مجدد؛

در مورد فايل سيستم هاي مايكروسافت ساختاري كه براتون نوشتم كاربرد داره و تمام فايل سيستم هاي مايكروسافت طبق اين ساختار پياده سازي ميشن.
يك نمونه تعريف پارتيشن هم براتون مثال زدم، اگر متوجه نشديد بگيد بيشتر توضيح بدم.




    ; Master Boot Record

    ; 000 - 1BD        446 byte for bootloader.
    ; 1BE - 1CD         16 byte for primary partition 1.
    ; 1CE - 1DD         16 byte for primary partition 2.
    ; 1DE - 1ED         16 byte for primary partition 3.
    ; 1EE - 1FD         16 byte for primary partition 4.
    ; 1FE - 1FF          2 byte for BRS (55h, AAh).

    ; Microsoft Partition Structure

    ; 1 byte  for partition status.                             (p_s)
    ; 1 byte  for beginning head.                               (p_b_h)
    ; 1 word  for beginning cylinder/sector.                    (p_b_c)
    ; 1 byte  for partition type.                               (p_t)
    ; 1 byte  for end head.                                     (p_e_h)
    ; 1 word  for end cylinder/sector.                          (p_e_c)
    ; 1 dword for number of sector between partition and MBR.   (p_s_m)
    ; 1 dword for number of sector in partition.                (p_s_n)


    ; = p1 ===========================

    p_s            db        80h
    p_b_h        db        00h
    p_b_c        dw        0002h
    p_t            db        04h
    p_e_h        db        00h
    p_e_c        dw        000ah
    p_s_m        dd        00000001h
    p_s_n        dd        00000009h

    ; = p1 ===========================



موفق باشيد.

----------


## m-taheri

اين مطالبي كه گفتيد رو دقيقا متوجه شدم. ممنون از راهنمائيتون .
توي اين 512 بايت ما ميتونيم تعيين كنيم كه  پارتيشن هاي هارد از چه آدرس تا چه آدرسي ادامه داره - ولي بازم چند تا سوال برام 
1-  من بازم متوجه نشدم كه اطلاعات مربوط به fat16 و يا fat32 كجا قرار ميگيره 
2- سيستم عامل از كجا متوجه ميشه كه يك هارد داراي چند پارتيشن است؟ 
3 - آيا bootable بودن يك پارتيشن  از partition status آن مشخص ميشود؟
4 - در مورد حافظه هاي فلش كه داراي سيلندر و هد نيستند چطور اطلاعات يك پارتيشن را مشخص كنيم؟

----------


## ssbostan

> اين مطالبي كه گفتيد رو دقيقا متوجه شدم. ممنون از راهنمائيتون .
> توي اين 512 بايت ما ميتونيم تعيين كنيم كه  پارتيشن هاي هارد از چه آدرس تا چه آدرسي ادامه داره - ولي بازم چند تا سوال برام 
> 1-  من بازم متوجه نشدم كه اطلاعات مربوط به fat16 و يا fat32 كجا قرار ميگيره 
> 2- سيستم عامل از كجا متوجه ميشه كه يك هارد داراي چند پارتيشن است؟ 
> 3 - آيا bootable بودن يك پارتيشن  از partition status آن مشخص ميشود؟
> 4 - در مورد حافظه هاي فلش كه داراي سيلندر و هد نيستند چطور اطلاعات يك پارتيشن را مشخص كنيم؟


اطلاعات اوليه براي مشخص كردن تعداد پارتيشن ها در سكتور 1 ذخيره ميشه، سيستم عامل 64 بايت اين سكتور رو ميخونه و ميفهمه كه چندتا پارتيشن داريم، طبق توضيحاتي كه قبلا دادم بيشتر از 4 تا نميتونه باشه.
براي مشخص كردن ديگر پارتيشن ها پس از خواندن سكتور 1، سيستم عامل به سكتور شروع هر پارتيشن مراجعه ميكنه، اگر اطلاعات درون سكتور، مربوط به EBR باشه متوجه ميشه كه اين پارتيشن از نوع توسعه يافته هست و از طريق pointer هايي كه تعريف شده به اطلاعات پارتيشن هاي منطقي دسترسي پيدا ميكنه.
خلاصه مطلب اين هست كه سكتور 1 براي معرفي پارتيشن ها به صورت كلي در نظر گرفته شده و اطلاعات كامل در مورد هر پارتيشن، سيستم فايل و... در اولين سكتور شروع پارتيشن ذخيره ميشه.

partition status مشخص ميكنه كه كدوم پارتيشن به صورت Active در نظر گرفته شده و اطلاعات مربوط به BRS سكتور 1 كه دو بايت هست اگر با BRS پارتيشن Active برابر باشه، سيستم اطلاعات بوت رو از اون پارتيشن دريافت ميكنه.

حافظه هاي فلش از صفحه بندي استفاده ميكنند، اما هنگام دسترسي، سيستم ديدي همانند يك ديسك داراي head, cylinder, track با اونها برخورد ميكنه.

موفق باشيد.

----------


## m-taheri

ممنون و متشکر
حالا من اگر بخوام یک sd-card را با fat16 و یا fat32 فرمت کنم. باید اول اون رو پارتیشن بندی کنم و اطلاعات مربوط به پارتیشن ها رو توی سکتور 1 بنویسم و سپس اطلاعات مربوط به fat16 را در سکتور یک از اولین پارتیشن بنویسم؟

و اینکه برای fat16 باید دقیقا چه چیزی بنویسیم؟

----------


## ssbostan

بله، بايد اطلاعات پارتيشن ها رو در سكتور يك ذخيره كنيد و در سكتور شروع هر پارتيشن براي fat16 اين اطلاعات رو ذخيره كنيد.



00h         Jump Code + NOP                     3 Bytes
03h         OEM Name                         8 Bytes
0Bh         Bytes Per Sector                     1 Word
0Dh         Sectors Per Cluster                     1 Byte
0Eh         Reserved Sectors                     1 Word
10h         Number of Copies of FAT                 1 Byte
11h         Maximum Root Directory Entries                 1 Word
13h         Number of Sectors in Partition Smaller than 32MB     1 Word
15h         Media Descriptor (F8h for Hard Disks)             1 Byte
16h         Sectors Per FAT                     1 Word
18h         Sectors Per Track                     1 Word
1Ah         Number of Heads                     1 Word
1Ch         Number of Hidden Sectors in Partition             1 Double Word
20h         Number of Sectors in Partition                 1 Double Word
24h         Logical Drive Number of Partition             1 Word
26h         Extended Signature (29h)                 1 Byte
27h         Serial Number of Partition                 1 Double Word
2Bh         Volume Name of Partition                 11 Bytes
36h         FAT Name (FAT16)                     8 Bytes
3Eh         Executable Code                     448 Bytes
1FEh         Executable Marker (55h AAh)                 2 Bytes



موفق باشيد.

----------

