‏نمایش پست‌ها با برچسب سیستم عامل. نمایش همه پست‌ها
‏نمایش پست‌ها با برچسب سیستم عامل. نمایش همه پست‌ها

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

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

تا کنون به این مسئله فکر کرده اید که پس از روشن کردن کامپیوتر چه اتفاقی می افتد؟ بلافاصله پس از فشردن کلید روشن کردن سیستم، سیگنالی به مادربورد فرستاده می شود که مادربورد آن را به واحد تغذیه (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 و سیستم عامل بنویسم. علاقه مندان می توانند در آن پست ها با جزعیات بیشتری از برنامه نویسی سیستمی و سیستم عامل آشنا شوند. البته نوشتن سیستم عامل نیازمند آشنایی کافی با تئوری های آن به علاوه چندین مبحث دیگر می باشد که در پست سیستم عامل چیست آورده شده است.
با تشکر


۱۳۸۹ آذر ۱۶, سه‌شنبه

سیستم عامل چیست؟

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

سیستم عامل در واقع نرم افزاری است که همین فعالیت را به صورت خودکار انجام می دهد. با گذشت زمان و افزایش سرعت و توانایی کامپیوتر ها، وجود یک انسان برای تغییر برنامه ها و اختصاص زمان و منابع کامپیوتر به آنها باعث اتلاف بسیار زیاد وقت می شد و شاید در بسیاری مواقع مسئول نمی توانست بهترین و بهینه ترین ترتیب را برای اجرا به برنامه ها اختصاص دهد و این باعث بوجود  آمدن سیستم عامل (Operating System) شد. 

سیستم عامل ها به مرور زمان رشد کرده و به توانایی های آنها افزوده شد ولی همه آنها کم و بیش همان وظیفه ای را به عهده دارند که اجداد آنها به عهده داشتند یعنی اختصاص منابع محدود سیستم به بهینه ترین شکل به برنامه ها.

احتمالا تصور شما از سیستم عامل یک نرم افزار بزرگ است که از چند صد مگابایت تا حتی چند گیگابایت فضا اشغال می کند و انواع امکانات مختلف و نرم افزارهای پخش موزیک و نمایش عکس و صدها ابزار دیگر را در خود دارد. مثل نسخه های مختلف ویندوز شرکت مایکروسافت که پس از نصب صدها پنجره و برنامه و ابزار را برای انجام کارهای مختلف در اختیار کاربر قرار می دهند.

اما در واقع هسته اصلی این سیستم عامل نرم افزار نه چندان بزرگی است که ثانیه هایی پس از روشن شدن کامپیوتر روی حافظه اصلی (RAM) آن قرار می گیرد و امکان اجرای سایر برنامه ها را به کامپیوتر می دهد. این هسته که کرنل (Kernel) نام دارد  پایه ای ترین وظایف سیستم عامل را انجام می دهد و از نظر بسیاری از متخصصین اصلا کرنل خود سیستم عامل است و سایر قسمتها برنامه هایی هستند که توسط کرنل اجرا می شوند. از وظایف اصلی کرنل می توان به مدیریت اجرای برنامه ها و اختصاص زمان به همه آنها برای اجرا، مدیریت رویدادهای (event) حاصل از سخت افزار (یا Interupt ها) و مدیریت رویدادهای حاصل از برنامه ها (یا فراخوانی های سیستمی - System calls) اشاره کرد.

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

مفهوم دیگری به نام GUI یا رابط گرافیکی کاربر نیز وجود دارد که درواقع نرم افزاری است که به شکلی وظیفه ترسیم اشیاء مثل پنجره ها، منو ها و ... را بروی صفحه نمایش دارد و جزء اصلی سیستم عاملهای مدرن امروزی نیز هست.

به عنوان یک برنامه نویس اگر می خواهید وارد مبحث طراحی سیستم عامل شوید، باید اطلاعات خوبی از بسیاری از مفاهیم پایه ای علم کامپیوتر داشته باشید. سیستم عامل شاید پیچیده ترین نرم افزاری است که یک برنامه نویس در تمام طول مدت زندگی حرفه ای خود ممکن است در طراحی آن دخیل باشد. پیچیده ترین قسمت طراحی سیستم عامل طراحی کرنل آن است که معمولا توسط یک تیم کوچک از برنامه نویسان بسیار ماهر طراحی می شود (گاهی 1 یا 2 نفر).

اگر فکر می کنید در زمینه برنامه نویسی، عملیات سخت افزاری و چگونگی ارتباط سخت افزارها و منابع سیستم هنوز اطلاعاتتان زیاد نیست، فعلا ورود به این شاخه را فراموش کنید. برای ورود به این شاخه پایه ای ترین اطلاعات لازم به شرح زیر است:

-آشنایی با زبان C (یا ++C) - گرچه برخی سیستم عامل های کوچک تحقیقاتی با Pascal  و همینطور FreeBasic نیز نوشته می شوند.

-آشنایی با برنامه نویسی Assembly - معمولا C توانایی انجام بخش اعظم کارها را دارد اما همیشه نیاز به اسمبلی هم هست.

-مفاهیم پایه ای علم کامپیوتر - آشنایی کامل با مبنای دو و هشت. منطق بولی و همینطور آشنایی کامل با ساختمانهای داده و الگوریتمهای مرتب سازی و جستجو. رجوع کنید به پست چگونه یک برنامه نویس خوب شوم 

-تجربه خوب برنامه نویسی

-تجربه کار با Unix/Linux - اکثر ابزارهای لازم برای طراحی سیستم عامل برای این محیطها طراحی شده اند گرچه نمونه ویندوزی برخی از آنها هم وجود دارد.

-آشنایی با انواع فایلهای اجرایی و ساختار داخلی آنها - این از جمله مهمترین بخشهای طراحی سیستم عامل است، اما یک برنامه نویس نرم افزارهای کاربردی هرگز با آن مواجه نخواهد شد.

-آشنایی کامل با پلت فرم هدف - در وافع نوع CPU هدف، ساختار داخلی و مجموعه دستورات اسمبلی آن باید به طور کامل برای برنامه نویس شناخته شده باشد.

موفق و پیروز باشید