نمایش نتایج 1 تا 1 از 1

نام تاپیک: شروع طراحی سیستم عامل

  1. #1

    شروع طراحی سیستم عامل

    این تاپیک برای آموزش طراحی سیستم عامل نیست بلکه به شما را در مورد نحوه نوشتن یک سیستم عامل از پایه راهنمایی میکنه.


    داشتن انگیزه
    در ابتدا باید توجه داشته باشید که توسعه یک سیستم عامل می تواند یکی مشکلترین کارهایی باشد که شما می توانید در کامپیوتر انجام دهید و برای نوشتن آن شما نیازمند آشنایی با چندین زمینه پیچیده مختلف در علوم کامپیوتر هستید. شما باید با زبان ماشین (اسمبلی)، و یک زبان سطح بالا (نظیر C/C++‎‎ ، پاسکال و یا ...) آشنا باشید همچنین باید بدانید که سخت افزار (پلتفرمی که برای آن سیستم عامل را ایجاد می کند) چگونه کار می کند. و باید با ده ها تئوری مطرح شده در این زمینه آشنا باشید و افکار و الگوریتم های مختلف مطرح شده رو به طور کامل بشناسید تا در صورت نیاز بهترین آنها را به کار ببرید. باید بگم نگران نباشین همین چیزها هستش که برنامه نویسی رو شیرین میکنه !!!

    هیچگونه راهکار و یا شیوه دقیقا مشخصی برای طراحی یک سیستم عامل وجود نداره و در حقیقت شما هستنید باید مشخص کنید که چگونه سیستم عاملتان شروع به کار کند و چگونه به کار خود ادامه دهد.

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

    مسئولیت پذیری
    توی این قسمت می خوام در مورد نحوه کدینگ و در حقیقت مواردی که باید قبل از شروع کدینگ رعایت کنید و چند مورد دیگه درباره سیستم عامل رو بیان کنم.

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

    قبل از شروع به طراحی باید حتما یک ایده قبلی نسبت به دیزاین سیستم عامل داشته باشین به همین علت به شدت پیشنهاد میشه که قبل از شروع کار سورس یک سیستم عامل دیگه مثل لینوکس و یا یونیکس رو مطالعه کنید. تا بتونید از اونها برای طراحی سیستم عامل خودتون ایده بگیرید.

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

    دانستنيهاي مورد نیاز
    باید توجه داشته باشید که نوشتن یک سیستم عامل کار یک مبتدی و یا حتی یک برنامه نویس متوسط به بالا نیست. توسعه سیستم عامل نیازمند یک برنامه نویس واقعا حرفه ای است که علاوه بر تجربه خوب توی زمینه طراحی نرم افزار (الگوریتم و دیزاین) به طور کامل به زبان انتخابی و کامپایلر مورد استفاده تسلط داشته باشه. حداقل مواردی که برای توسعه سیستم عامل لازم هست عبارتند از :


    • علوم کامپیوتری پایه: به صورت مختصر میشه گفت شما باید با نحوه تبدیل مبنا ها (حداقل هگزادسیمال و باینری) آشنا باشید. و با ساختمانهای داده نظیر لیستهای پیوندی و صف ها و ... آشنا باشید (و حداقل یکبار آنها را پیاده سازی کرده باشید) و به همین شکل با الگوریتم های مرتب سازی و جستجو نیز در این ساختمان داده ها آشنا باشید. و با مفاهیم تجردی (abstract) برنامه نویسی نیز آشنا باشید.
    • زبان ماشین: بدون شک و هیچ گونه تردیدی، شما نیاز به آشنایی با زبان ماشین (اسمبلی) پلتفرمی که می خواهید برای آن سیستم عامل تولید کنید هستید. خواندن یک کتاب و یا گذراندن یک دوره آموزشی کافیه. به نظر من همون درس اسمبلی که داخل دانشگاه تدریس میشه کافیه. فقط باید توجه کنید که با دستورهای کنترلی سخت افزار باید آشنا باشید.
    • C /C++‎‎: بیشتر سیستم عاملهای موجود در دنیا دنیا و کدهای موجود بر روی سایتهای اینترنتی با C (یا C++‎‎) نوشته شده اند حتی اگر شما بخواهید از یک زبان دیگر برای توسعه سیستم عامل خودتان همانند پاسکال استفاده بکنید بدون شک نیازمند این زبان برای مطالعه منابع آموزشی و داکیونتها خواهید بود.
    • تجربه برنامه نویسی: بدترین ایده ممکن فراگرفتن یک زبان برنامه نوسی همراه با توسعه یک سیستم عامل است. شما باید به زبانی که می خواهید از آن استفاده کنید تسلط کامل داشته باشید و در کنار آن به کامپایلر و لینکر استفاده شده نیز تسط داشته باشید (به عنوان مثال باید با اکثر کلمات کلیدی اضافه بر زبان و ماکروهایی که کامپایلر در اختیار شما می گذارد آشنا باشید.)
    • تجربه کار با لینوکس و یا یونیکس: بعد از مدت کمی از شروع طراحی متوجه خواهید شد که اکثر ابزارهای موجود برای توسعه سیستم عامل برای لینوکس نوشته شده اند و تنها تعدادی از آنها بعدا به سیستم عاملهای دیگر نظیر ویندوز پورت شدند در نیجه بهتره برای اینکه از دوباره کاری و خیلی از موارد دیگه جلوگیری بشه شما با این سیستم عامل ها و حداقل خط فرمان آنها آشنا باشید.
    • قالبهای اجرایی: برنامه نویسی هسته نیازمند دانش زیادی در زمینه برنامه نویسی است پیشنهاد میشه قالب یکی از فرمتهای فایلهای اجرایی مانند elf و یا exe و همچنین نحوه نوشتن اسکریپتهای لینکر را فرا بگیرید
    • پلتفرم: حتما و اما حتما باید با پلتفرمی که برای آن قرار است سیستم عامل تولید کنید آشنایی داشته باشید بهتر هست که مستندات پردازنده انتخاب شده را مطالعه کنید.

    انتخاب محیط توسعه:

    در ابتدا شما باید پلتفرمی را که می خواهید در آن سیستم عامل را توسعه دهید (کدینگ کنید) را انتخاب کنید. دو گزینه محبوب ویندوز و لینوکس هستند. کاربران لینوکس دارای مزایایی نسبت به کاربران ویندوز از لحاظ ابزار کار هستند که اکثر آنها را می توان به کمک Cygwin برطرف کرد. ابزارهای GNU ( کامپایلر، لینکر و ...) مورد پذیرشترین گزینه برای کار هستند با این حال کاربران ویندوز می تونن از MSVC نیز برای توسعه سیستم عاملشون استفاده بکنن.

    محیط توسعه پیشنهادی لینوکس و زبان C می باشد و همچنین کامپلر GNU C (gcc) و اسمبلر nasm پیشنهاد میشه.

    بعلاوه شما نیازمند یکسری ابزار (شبیه ساز) برای تست هستید که می توانید از شبیه سازهایی مثل VMware و یا Virtual PC استفاده کنید اما ابزار پیشنهادی Qemu است. بعدا تو مقاله جداگانه در مورد ابزارهای تست توضیح میدم.

    از کجا شروع کنم؟
    من فرض میکنم که شما زبان C و پلتفرم x86 رو انتخاب کردید. حالا میشه به صورت کلی گفت که باید ترتیب زیر را برای نوشتن سیستم عاملتون رعایت کنید:


    1. پیاده سازی بوت لودر (بهتره که از grub استفاده کنید)
    2. پیاده سازی entry point (نقطه ورودی کد C) به زبان اسمبلی
    3. پیاده سازی یکسری از توابع ساده مانند printf برای دیباگینگ ساده (توجه کنید که نمی تونین از هیچ کدوم از هدرهای C استفاده بکنید.)
    4. مقدار دهی اولیه پردازنده (ساخت جدول GDT، برنامه ریزی PIC و PIT و ...)
    5. پیاده سازی یک مدیر حافظه فیزیکی
    6. پیاده سازی حافظه مجازی (فعلا فقط صفحه بندی)
    7. پیاده سازی یک زمانبند پردازنده ساده.
    8. پیاده سازی مابقی موارد مربوطه مثل spinlockها و ...
    9. پیاده سازی یک فایل سیستم
    10. پیاده سازی API
    11. پیاده سازی shell (یا رابط )
    12. و بالاخره برنامه های سودمند جانبی
    آخرین ویرایش به وسیله pswin.pooya : جمعه 20 آبان 1390 در 00:36 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •