به نام خداوند بخشنده مهربان

سلام خدمت دوستان عزیز و هموطنان گرامی!

گفتم تا گرم هستم پست بعدی رو هم بزارم sealed یه وقتی سرد بشم باید رفت دو ماه دیگه این پست رو گذاشت!

 

خوب ما همه نرم افزار های مورد نیاز رو نصب کردیم و الان آماده استفاده هست! بنابراین یه موضوعات کوچکی رو توضیح میدم بعد میریم سراغ برنامه نویسی انشالله!

خوب آقای عباس مقدم دوست خوبمون 5 سال پیش توی وبلاگشون یه سری چیزا راجع به سیستم عامل نوشتن که من در اینجا میارم!

 

تا حالا به اين فكر كرديد كه وقتي كامپيوتر رو روشن مي كنيد چه اتفاقاتي ميفته. كامپيوتر چطور متوجه مي شه كه سيستم عامل شما رو از كجا بايد لود كنه. مثلاً از هارد يا فلاپي ياUSB. خوب شايد اينو خيلي ها بدونن. بله از طريق تنظيمات BIOS تو بخش SETUP كامپيوتر.

 

ولي مسلماً خيلي ها نميدونن كه مثلاً اگه قراره سيستم عامل از هارد خونده بشه اين خوندن بايد از كجاي هارد انجام بشه چونكه فايلهاي سيستم عاملي مثل ويندوز كه مثلاً تو درايوC نصب شده. ممكنه تو هر قسمتي از هارد ذخيره شده باشه و مثلاً فايل Kernel32.dll ويندوز رو چطور ميتونه لود كنه. شايد فكر كنيد خب از طريق مسير فايل ميتونه اونو لود كنه. اما اين طور نيست چونكه وقتي سيستم عاملي وجود نداره پس سيستم فايل و مسير فايل هم بي معنيه و اطلاعات هارد فقط از طريق مكان فيزيكيشون روي ديسك قابل دسترسي هستند. در واقع مفهوم مسير در سيستم فايل توسط سيستم عامل پياده ميشه و در نبود سيستم عامل مسير معني نداره.

براي فهم بهتر قضيه يه كم در مورد اين مراحل توضيح ميدم.

وقتي كه شما كامپيوتر رو روشن ميكنيد اولين چيزي كه اتفاق ميفته عمليات POST ( Power On Self Test ) هستش. در اين مرحله همونطور كه از اسمش معلومه بايد سخت افزاز نصب شده روي كامپيوتر مثل رم ، كيبورد ، حافظه گرافيكي و ... آزمايش بشه. اگه هيچ مشكلي توي اين سخت افزارها وجود نداشته باشه. كامپيوتر وارد مرحله بوت ميشه. در اين مرحله بايد همون كاري كه اول مطلب بهش اشاره كردم انجام بشه و سيستم عامل شناسايي و لود بشه. طبق قرارداد اين مرحله در تمام كامپيوترهاي شخصي يكسان بوده و به اين صورته :

  1. پيدا كردن اولين وسيله Bootable در كامپيوتر. اگه اولين وسيله اي كه توي تنظيمات SETUP تعيين شده پيدا نشد به سراغ وسيله بعدي ميره و اين روند تا پيدا كردن وسيله اي كه وجود داشته باشه مثل هاردديسك يا فلاپي ادامه پيدا مي كنه. اگه هيچ وسيله Bootable ي پيدا نشه يه پيغام ارور نشون داده ميشه و كامپيوتر متوقف ميشه. 
  2. اگه وسيله Bootable پيدا بشه بايد سكتور راه انداز  اون وسيله به عنوان نقطه شروع سيستم عامل خوانده و اجرا بشه.

 

همين دو مرحله والسلام.

 

حالا بريم سراغ اين كه اصلا اين سكتور راه انداز يا Boot Sector چيه. در واقع كامپيوتر براي راه اندازي سيستم فقط و فقط همين سكتور راه انداز رو ميشناسه. پس ما هم بايد اون رو خوب بشناسيم.

 سكتور راه انداز در هر وسيله اي به اولين سكتور اون وسيله گفته ميشه. و از اونجايي كه هم در فلاپي و هم در هارد ديسك اندازه هر سكتور 512 بايت هستش پس ميشه گفت به اولين 512 بايت هر ديسكي سكتور راه انداز اون ديسك گفته ميشه. BIOS بعد از اجراي مرحله POST همين 512 بايت رو مي خونه و اجرا ميكنه نه يك بايت بيشتر و نه يك بايت كمتر. كل فرآيند راه اندازي كامپيوتر به صورت سخت افزاري همينه كه تو تمام PC ها مشابه هستش. از اين جا به بعد اون برنامه 512 بايتي كه مانوشتيم و بهش ميگن بوت لودر بقيه كارها رو انجام ميده.

حتماً ميپرسيد كه آخه كدوم سيستم عاملي توي 512 بايت جا ميشه كه ما بتونيم اين كار رو بكنيم cool مسئله اصلي همينجاست كه تو اين 512 بايت ما بايد محل فايل اصلي سيستم عامل رو مشخص كنيم تا بقيه مراحل لود شدن سيستم عامل انجام بشه در واقع وظيفه اصلي برنامه 512 بايتي بوت لودر مشخص كردن محل قرار گيري فايل هسته سيستم عامله. البته كسايي كه مي خوان فقط نحوه لود شدن بوت لودر رو مشاهده كنن يا ميخوان يه سيستم عامل ساده بنويسن كه تو 512 بايت جا بشه!!!!!! مي تونن از لود كردن فايل هسته صرف نظر كنن و فقط يك بوت لودر ساده بنويسن كه از نظر خودشون يك سيستم عامل كامل باشه.

اگه دقت کرده باشید به این نکته هم پی بردید که چطوری میتونیم یه برنامه 512 بایتی درست کنیم که خوب همونطور که پیداست باید اسمبلی رو بلد باشید تا اینکار رو با اسمبلی انجام بدیم! پس حتما یه سرچی توی الفبا بزنید و مطالب مفیدی رو درباره اسمبلی نوشتم!

خوب میریم سراغ برنامه نویسی سیستم عامل! باز هم با آقای عباس مقدم همراه میشیم! ( یعنی مطالب ایشون رو کپی کردم kiss)

 

» کمی بیشتر در مورد وقفه ها

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

وقفه ها در واقع يه سري از توابع نوشته شده از قبل و آماده هستند كه توي حافظه ROM در BIOS قرار دارند. و برنامه نويس ميتونه براي انجام خيلي از كارها از اونا استفاده كنه. در واقع بعد از روشن شدن كامپيوتر اين توابع از ROM خونده شده و به RAM منتقل ميشه. وقفه ها رو با استفاده از اعداد هگزادسيمال نامگذاري مي كنند. كه ميتونه عددي بين 0H تا 100H باشه. همچنين به محلي از حافظه كه اطلاعت وقفه ها در اون ذخيره ميشه "جدول بردار وقفه" يا IVT گفته ميشه. يكي از اين وقفه ها وقفه شماره 19H هستش كه بعد از لود شدن وقفه ها به حافظه به عنوان اولين كار اجرا ميشه. وظيفه اين وقفه همون چيزيه كه بالا گفتيم يعني پيدا كردن و لود و اجراي بوت لودر از سكتور راه انداز ديسك. در ضمن به صورت قراردادي هميشه برنامه بوت لودر بعد از لود شدن در آدرس 7C00H قرار ميگيره كه بعداً دونستن اين نكته به دردمون مي خوره. به عنوان توضيح پاياني در مورد وقفه ها بايد بگم كه وقفه ها معمولاً در برنامه نويسي سطح پايين مورد استفاده قرار مي گيرند و يكي از وظيفه هاي سيستم عامل فراهم كردن توابعي هست كه برنامه نوساني كه تو اون سيستم عامل به يه زبون سطح بالا برنامه مي نويسند رو از استفاده كردن از وقفه ها بي نياز كنه. اگه با وي‍وال بيسيك برنامه نويسي كرده باشيد حتماً ميدونيد كه اونجا اسمي از وقفه ها به ميون نيومده ولي وقتي با اسمبلي كار مي كنيد به وفور بايد از وقفه ها استفاده كنيد. پس حتما یه اطلاعات مفیدی درباره وقفه ها به دست بیارید (خودمم اگه وقت بشه تو الفبا یه چیزایی خواهم گذاشت sealed)

 

» نوشتن يك بوت لودر ساده با اسمبلي

بالاخره به مرحله كدنويسي كه ميدونم منتظرش بودبد رسيديم. هچند كه اين تازه اول راهه و اين كد در برابر كدهايي كه در آينده قراره بنويسيم تقريباً هيچه ولي باز از هيچي بهتره. اين كد كاري كه انجام ميده در واقع اينه كه هيچ كاري انجام نميده!!!!!!!!!!! (فقط برای آشنایی شما با برنامه هایی که تو پست قبل معرفی کردیم مفیده.! پس حتما انجام بدید)

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

org       0x7c00
bits       16
cli
hlt
times    510 - ($-$$) db 0
dw        0xAA55

حالا بايد كمي در باره اين خطوط توضيح بدم. خط اول از راهنماي org استفاده كرده و به اسمبلر مي گويد كه اين كد بعد از لود شدن در آدرس 0x7c00 قرار خواهد گرفت. به ياد داريد كه در مورد اين موضوع قبلاً توضيح داديم كه هميشه برنامه بوت لودر بعد از لود شدن تو همين آدرس قرار ميگيره پس لازمه كه اين كد رو حتماً اول تمام بوت لودر هايي كه مينويسيم بزاريم.

خط دوم به اسمبلر ميگه كه اين برنامه رو به صورت 16 بيتي ترجمه كنه. يعني اينكه بوت لودر ما يك بوت لودر 16 بيتي هستش. شايد بپرسيد مگه قرار نيست كه ما يك سيستم عامل 32 بيتي بسازم پس چرا تو حالت 16 بيتي داريم كد مينويسيم. در جواب شما بايد بگم كه تمام بوت لودر هايي كه در تمام دنيا نوشته ميشوند اول بايد تو مود 16 بيتي باشند و بعد ميتونند با اجراي دستوراتي وارد مود 32 بيتي بشوند. يعني CPU به صورت قراردادي هميشه فرض ميكنه كه برنامه بوت لودر يك برنامه 16 بيتيه و با حالت 16 بيتي كه اصطلاحاً بهش حالت واقعي هم ميگن شروع به كار ميكنه.

فرمان هاي cli و hlt هم همون طور كه برنامه نويساي اسمبلي ميدونن به ترتيب وقفه ها رو غير فعال و Cpu رو متوقف ميكنند. كه در واقع ميشه گفت طبق توضيحات بالا هيچ كار مفيدي نمي كنند.

حتماً يادتون هست كه برنامه بوت لودر حتماً بايد 512 بايت باشه نه بيشتر نه كمتر ولي اين چند خط كد ما 10- 15 بايت بيشتر نميشه ( البته بعد از ترجمه ). در اسمبلر NASM علامت $ شماره آدرس دستور جاري و $$ شماره آدرس اولين دستور را مشخص ميكنند ( باز هم بعد از ترجمه ). از آنجايي كه اندازه فايل ترجمه شده بايد 512 بايت باشد بايد مقداري اطلاعات بي معني به پايین فايل ترجمه شده اضافه كنيم تا اين مشكل رفع بشه. دستور times كه در بالا نوشته شده از بعد از دستور hlt تا بايت 510 رو با مقدار 0 پرميكنه.

به ياد داشته باشيد براي اينكه برنامه شما به عنوان نقطه شروع سيستم يا همون بوت لودر توسط  BIOS شناسايي و لود بشه يك شرط ديگه هم وجود داره كه تا اينجا بهش اشاره نكرده بوديم. فايل بوت لودر بايد داراي امضاي مخصوصي باشه تا BIOS بتونه اون زو شناسايي كنه.  اون شرط اينه كه بايت 511 برابر با 0xAA و بايت 512 برابر با 0x55 باشه. به همين دليل با دستور times فقط تا بايت 510 رو پر كرديم و دو بايت آخر رو براي امضاي بوت لود نگه داشتيم. حالا ديگه توضيحات كامل شده و نوبت مرحله بعدي ميرسه. که باید برنامه مون رو اسمبل کنیم تا برای کامپیوتر قابل فهم بشه! پس بریم...

 

» ساخت فلاپی مجازی

نرم افزار Imdisk Virtual Disk Driver رو اجرا کنید! (باید سرچ کنید)

گزینه Mount new رو بزنید و image file رو از اینجا دانلود کنید و انتخاب کنید و وارد برنامه کنید! و در قسمت Device Type گزینه Floppy انتخاب کنید! و Drive letter رو روی A تنظیم کنید و گزینه OK رو بزنید. فلاپی مجازی شما ساخته شد (اگه قبلا ساختید نیازی به انجام این کارها نیست)

 

» اسمبل كردن بوت لودر با NASM 

برنامه اي كه تو بخش قبلي نوشتيد رو توي فايلي به اسم boot.asm ذخيره كنيد و توي همون مسيري كه برنامه NASM قرار داره قرار بدید که همونطور که قبلا گفتم اونو توی c:\nasm نصب کردیم پس به این مسیر برید (C:\nasm) و فایل اسمبلی (boot.asm) رو این جا قرار بدید بعد از روی صفحه کلید گزینه استارت و R رو همزمان فشار بدید تا RUN باز بشه بع توی کادر RUN عبارت cmd رو بنویسید و اینتر کنید! حالا کد زیر رو وارد کنید تا به مسیر C:\nasm برید

cd C:\nasm

حالا نوبت اون رسیده تا فایل ایمج رو از روی فایل boot.asm بسازیم! بنابراین کد زیر رو در cmd وراد کنید

nasm -f bin boot.asm -o boot.bin

اين فرمان داراي دو سوييچ است و به ترتيت سويچ –f bin به اسمبلر ميگه كه فرمت خروجي بايد يك فايل باينري باشه و –o هم براي مشخص كردن نام فايل خروجي استفاده ميشه. بعد از اجراي اين دستور شما بايد يك فايل با نام boot.bin دقيقاً با سايز 512 بايت داشته باشيد.

 

خوب این مطلب همونجور که گفتم از دوست خوبمون جالب آقای عباس مقدم بود که توضیحات مختصر مفیدی راجع به بوت لودر و سکتور داده بودن انشالله جلسه بعد اگه بشه بازم چیز های مفید میزارم!

حالا بقیه اش چون نرم افزار هامون با هم جور نبود خودم آموزش میدم!

 

» بوت ایبل کردن فلاپی

خوب نرم افزار BOOTICE رو نصب کنید در قسمت Destination Disk فلاپی مجازی درایو A رو انتخاب کنید و Sector Edit رو بزنید و آیکون ششم از سمت چپ که عکس فلش روی درایو کشیده رو بزنید (Restore from file). فایل bin خود را انتخاب کنید و گزینه Restore رو بزنید! توجه کنید که Start Sector روی صفر 0 باشه و Sectors روی یک 1 قرار بدید.

خوب اگه ببینید دیگه فلاپی باز نمیشه چون دیگه کامپیوتر نمیتونه توی فلاپی رو بخونه، دلایلش هم بعدا میگیم!اگه فلاپی رو فرمت کنید مثل قبل میشه! البته یه وقت فلاپی رو فرمت نکنید چون در مرحله بعد کارش داریم!

 

» شبیه سازی سیستم عامل

نرم افزار Qemu manager رو اجرا کنید!

گزینه قرمز اولی (+) رو بزنید و بعد یه اسم انتخاب کنید و Operating System رو روی ویندوز 95 قرار بدید  و بعد از ساخته شدن در تب درایو قسمت روی Floppy Drive 0 دو تا کلیک کنید و Use Physhcal Drive رو بزنید و در نهایت درایو A رو انتخاب کنید

در همون تب قسمت Boot Drive رو هم روی Floppy Disk قرار بدید.

( اگه این کار ها رو توی آموزش قبل انجام دادید لازم نیست دیگه انجام بدید فقط کافیه روی گزینه سبز که مثل پلی هست کلیک کنید تا سیستم عامل رو اجرا کنه)

خوب کار تموم شد! انشالله بعدا توسعه میدیم تا به یه جایی برسیم (انشالله)..

فعلا .... مخلص همه تون

یا علی مدد....!

 

  قسمت قبل : جلسه سوم                                                         قسمت بعد : جلسه پنجم