۱۳۸۹ دی ۶, دوشنبه

چگونه سیستم عامل اجرا می شود؟

تا کنون به این مسئله فکر کرده اید که پس از روشن کردن کامپیوتر چه اتفاقی می افتد؟ بلافاصله پس از فشردن کلید روشن کردن سیستم، سیگنالی به مادربورد فرستاده می شود که مادربورد آن را به واحد تغذیه (PSU) ارسال می کند. این سیگنال در واقع یک بیت است که مقدار 1 آن نشان دهنده این است که کامپیوتر روشن شده است. زمانی که PSU این سیگنال را دریافت می کند، به سایر تجهیزات و سخت افزارهای سیستم برق مورد نیازشان را ارسال می کند. اگر PSU بتواند به همه سخت افزارها برق لازم را ارسال کند، سیگنالی به نام "power_good" به مادربورد ارسال می کند تا BIOS (Basic Input Output System) فعال شود.
وقتی BIOS این سیگنال را دریافت کرد، پروسه ای به نام POST (Power On Self Test) را اجرا می کند که طی آن صحت میزان برق تامین شده، متصل بودن تجهیزات جانبی اصلی (ماوس، کیبورد، ...) و سلامت حافظه (RAM) تست می شود. 
اتفاقی که پس از این می افتد نیاز به درک کافی از ساختار داخلی CPU، معماری سیستم و کمی اسمبلی  دارد. بعد از POST کنترل کارها به BIOS بر می گردد، به این ترتیب که  POST، نرم افزار BIOS را در انتهای حافظه (برای مثال آدرس 0xFFFFF0)  بار گذاری می کند و در اولین بایت حافظه یک دستور jump به این آدرس قرار می دهد. مقدار 0 را در رجیستر های اشاره گر به دستور که در پروسسور های x86 مجموعه CS:IP هستند، قرار می دهد و کنترل را به CPU منتقل می کند.
با این کار CPU بایت 0 که اولین بایت حافظه است را اجرا می کند، در آنجا یک دستور jump به قسمتی از حافظه را می یابد که BIOS در آن بارگذاری شده، است. پس به آن بایت از حافظه می پرد و نرم افزار BIOS را اجرا می کند. BIOS کارهای زیادی انجام می دهد از جمله، ساخت جدول بردار وقفه ها (Interrupt Vector Table – IVT که در واقع آدرس کنترل ها (Handler ها)ی پیش فرض برای برخی وقفه ها ی پایه ای و همینطور برخی وقفه های دیگر برای دسترسی به سخت افزارهای اصلی مثل هارد دیسک  را در خود دارد)، انجام یک سری تست های سخت افزاری پیش رفته تر و در دسترس قرار دادن یک نرم افزار Setup (همان نرم افزاری که اغلب مواقع با فشردن دکمه Delete  هنگام بوت شدهن سیستم، قابل دسترسی است).
کار بعدی BIOS این است که سیستم عامل را اجرا کند و این کار را بر اساس تنظیمات داخلی خود که ترتیب چک کردن حافظه های جانبی برای اجرای سیستم عامل را مشخص می کنند، انجام می دهد. در واقع این کار معمولا با اجرای وقفه 0x19 انجام می شود. اگر سخت افزار Bootable پیدا نشده، این وقفه بر می گردد و BIOS سخت افزار بعد را چک می کند. اگر در نهایت هیچ سیستم عاملی یافت نشود، پیغامی مشابه "No Operating System Found" چاپ شده و سیستم متوقف می شود.
اما اگر سخت افزار Bootable پیدا شود چه؟
ابتدا باید متوجه شویم که چگونه سخت افزار Bootable  تشخیص داده می شود. می دانید که هر دیسک به سکتورهای 512 بایتی تقسیم شده است. کامپیوتر در ابتدای کار چیزی به اسم فایل را نمی تواند تشخیص دهد، تنها چیزی که در رابطه با هارد دیسک و یا فلاپی متوجه می شود، شماره هد، سیلندر و سکتور است و می تواند تعداد سکتورهای مشخصی که هر یک 512 بایت دارند را بخواند و در نقطه ای از حافظه (RAM) بارگذاری کند. در ابتدا و برای یافتن دیسک Bootable، وقفه 0x19 که پیشتر به آن اشاره شد، سکتور اول از سطح اول دیسک اول که در واقع همان اولین سکتور، سکتور 0 و یا بوت سکتور است را لود می کند. در واقع 512 بایت اول دیسک را به حافظه لود می کند و نگاه می کند که آیا در 2 بایت آخر آن (511 و 512) امضای بوت سکتور وجود دارد  یا نه. اگر وجود داشت متوجه می شود که این دیسک، Bootable است و بوت سکتور آن را به آدرس 0x7C00 حافظه لود می کند و رجیستر های آدرس دستور CPU را به این آدرس ست می کند و ادامه می دهد.
از آنجا که 512 بایت آنقدر کم است که شاید نتوان حتی 1% از کرنل سیستم عامل را در آن جای داد، در این 512 بایت تنها مقدمات اجرای سیستم عامل قرار می گیرد، مقدماتی مثل معرفی سیستم فایلی (FAT، CDFS و ...) در آن قرار می گیرد تا کامپیوتر بتواند فایل را تشخیص دهد و به دنبال فایل اجرایی کرنل بگردد و از آن به بعد کرنل کنترل کامپیوتر را در دست بگیرد. اگر سیستم عامل 32 بیت باشد، حتی مقدمات دیگری نیز پیش از اجرای کرنل 32 بیتی لازم است کا آنها هم در این 512 بایت جا نمی شوند. لذا نیاز به راه اندازی فایل دیگری پیش از کرنل است که آن فایل در نهایت کرنل را اجرا می کند. به 512 بایت اول که در بوت سکتور قرار دارد، بوت لودر (Boot loader) گفته شده و برنامه دیگری که پیش از اجرای کرنل اجرا می شود، معمولا بوت لودر مرحله 2 (Stage 2 boot loader) گفته می شود. اینکه چرا برای اجرای کرنل سیستم عامل های 32 بیت مقدمات بیشتری لازم است بحث بزرگی است که در پستهای بعدی به آن خواهم پرداهت اما همین اندازه بگویم که CPU در هنگام شروع کار همیشه در حالت 16 بیت کار می کند که به آن Real mode گفته می شود. این کار برای سازگاری با نر افزارهای سیستم های 8086 و 8088  قدیمی انجام می شود. پس از آن و برای تغییر حالت CPU به 32 بیت یا Protected Mode نیاز به مقدمات زیادی وجود دارد. زیرا کلا نوع آدرس دهی در این حالت متفاوت است (مبتنی بر Segment ها)، وقفه های BIOS نیز در این حالت وجود ندارند و برنامه نویس باید از ابتدار آنها را برنامه ریزی کند، همپنین عملیاتی مثل فعال کردن بیت آدرس A20 در باس سیستم برای برقراری امکان آدرس دهی حافظه بیشتر از 1MB و تا حد اکثر 4GB نیز باید انجام شوند که همه اینها به همراه چند عمل دیگر نیازمند مقدمه چینی هایی پبش از اجرای سیستم عامل است.
در نهایت سیستم عامل اجرا شده، درایور های سخت افزارهای مختلف را اجرا کرده و احتمالا GUI آن نیز اجرا شده و شما در نهایت ظاهر گرافیکی آن را می بینید.
در نظر دارم در آینده پستهایی در رابطه با چگونگی برنامه نویسی boot loader و سیستم عامل بنویسم. علاقه مندان می توانند در آن پست ها با جزعیات بیشتری از برنامه نویسی سیستمی و سیستم عامل آشنا شوند. البته نوشتن سیستم عامل نیازمند آشنایی کافی با تئوری های آن به علاوه چندین مبحث دیگر می باشد که در پست سیستم عامل چیست آورده شده است.
با تشکر


هیچ نظری موجود نیست:

ارسال یک نظر