نوشتن یک سیستم عامل ساده – قسمت اول

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

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

خیلی خوب، بذارید اول ببینیم چه چیزهایی باید نصب کنیم؟

  1. یک ادیتور متنی، که معمولا همراه سیستم عاملتون نصب میشه. من خودم از nano و gedit و atom استفاده میکنم، و توصیه میکنم شما هم یکی از این ادیتورهای ساده رو انتخاب کنید تا درگیر پیچیدگی های vim و … نشید.
  2. یک اسمبلر که من اینجا از nasm استفاده میکنم، و nasm توی مخازن اوبونتو و دبیان و … موجوده. اگر هم نبود هم باینری و هم سورسش موجوده.
  3. یک مجازی فوق العاده ساده هم نیاز داریم. در واقع مجازی سازی که برای راه انداختن و بوت کردن یه باینری ساده، اذیتمون نکنه. من از qemu استفاده میکنم. حالا شما میتونید از bochs یا VirtualBox یا هرچیز دیگری استفاده کنید  و انتخاب خودتونه.

خب طبیعتا ترمینال هم نیاز داریم که این وسط بتونیم کارامونو باهاش انجام بدیم 🙂

الان کافیه که با اراده قوی، یک فایل به اسم my16bitos.asm باز کنید و شروع کنید کد زدن. خب باید چی بنویسیم؟ یکی از نکات مهمی که اینجا هست اینه که ما نمیتونیم از روتین ها یا وقفه های سیستم عامل استفاده کنیم و نیاز داریم از بایوس استفاده کنیم! دقیقا چون بایوس MBR رو میخونه و از این داستانا که موقع بوت شدن داریم. پس کد ما چنین چیزی میشه :

کد   
MOV AH, 0x0e
MOV AL, 'A'
INT 0x10
JMP $
times 510-($-$$) db 0
DW 0xaa55

خب این شد کد ما. در واقع ما یک سیستم عامل (یا بهتر بگم بوت سکتور) ۱۶ بیتی نوشتیم. که البته این خیلی سادست و در قسمت بعدی پیچیده ترش خواهیم کرد. این سیستم عامل ۶ خطی (شاید به خاطر پیشرفت علوم کامپیوتر و اسمبلر ها و پردازنده ها، الان این کد شش خطه، و ممکن بوده زمانی یه مهندس کامپیوتر یا صرفا یک علاقمند به علوم رایانه رویاش نوشتن چنین چیزی بوده!)، وقتی بوت شه حرف A رو به ما نمایش میده. حالا با چه اتفاقاتی؟

خط اول که میگه عدد شانزده شانزدهی 0x0e رو در هشت بیت بالایی رجیستر AX قرار بده، یکی از روتین های بایوسه. در واقع بایوس میفهمه که بوت سکتور، این برنامه ست. خط دوم میگه کرکتر A رو در هشت بیت پایینی همون رجیستر قرار بده. در خط سوم ما یک وقفه (توجه کنید INT توی اسمبلی مخفف Interrupt یا «وقفه» است نه Integer .) ایجاد کردیم. وقفه 0x10 در بایوس برای نمایش کرکتر ها به کار میره (البته توی روتین 0x0e). در خط چهارم با استفاده از دستور پرش، برنامه رو تا ابد باز نگه داشتیم، که وقتی سیستم عامل بوت میشه همچنان روشن بمونه. یکی از سخت ترین خط ها از نظر درک، خط پنجمه. خط پنجم چی کار میکنه؟ ۵۱۰ بایت اول دیسک (این سیستم عامل میتونه از روی یک فلاپی یا هارد دیسک یا هر دیوایس دیگری بوت شه) رو با صفر پر میکنه و حالا چرا؟ چون ما میخوایم در دوبایت نهایی، عدد جادویی 0xaa55 رو قرار بدیم که بوت سیستم عامل بهش وابسته است.

بسیار خوب، تا اینجای کار فهمیدیم که این کد چی کار میکنه. حالا با nasm کد رو اسمبل میکنیم تا به یه فایل قابل بوت شدن برسیم :

کد   
nasm -f bin -o my16bitos.bin my16bitos.asm

اکنون در دایرکتوری جاریتون، باید فایل my16bitos.bin رو ببینید. کافیه تا با qemu اجراش کنید به این شکل :

کد   
qemu-system-i386 my16bitos.bin

پس از اجرای دستور و باز شدن پنجره مربوط به QEMU ، و نمایش اطلاعات مربوط به QEMU ، شاهد نمایش حرف A خواهید بود. تبریک میگم! این اولین تلاش شما برای ساخت یک سیستم عامله! در قسمت بعدی این سیستم عامل رو کامل تر میکنیم تا بتونه یه سری اطلاعات رو از کاربر بخونه و جواب بده.

پس تا مطلب بعدی خداحافظ!

Share

34 دیدگاه در “نوشتن یک سیستم عامل ساده – قسمت اول”

  1. میشه قسمت ابزار ها یه کم بیشتر توضیح بدید.

    یک ادیتور متنی، که معمولا همراه سیستم عاملتون نصب میشه. من خودم از nano و gedit و atom استفاده میکنم، و توصیه میکنم شما هم یکی از این ادیتورهای ساده رو انتخاب کنید تا درگیر پیچیدگی های vim و … نشید.
    یک اسمبلر که من اینجا از nasm استفاده میکنم، و nasm توی مخازن اوبونتو و دبیان و … موجوده. اگر هم نبود هم باینری و هم سورسش موجوده.
    یک مجازی فوق العاده ساده هم نیاز داریم. در واقع مجازی سازی که برای راه انداختن و بوت کردن یه باینری ساده، اذیتمون نکنه. من از qemu استفاده میکنم. حالا شما میتونید از bochs یا VirtualBox یا هرچیز دیگری استفاده کنید و انتخاب خودتونه.

    1. البته که میشه!
      ادیتور ها یا ویرایشگرهای متنی که همراه سیستم عامل نصب میشن، مثال واضح و درست و حسابیش میتونم بگم Notepad که با ویندوز نصب میشه، و خب توی اوبونتو (یا توزیع های دیگر لینوکس که با GNOME و هم‌خانواده هاش نصب میشن) gedit هست. حالا شما میتونید اینا رو خودتون جدا هم نصب کنید مثلا من Atom رو دارم.
      در مورد اسمبلر هم، وقتی کد اسمبلی میزنیم، نیاز داریم تا تبدیلش کنیم به کد قابل فهم برای کامپیوتر، برنامه ای که این کار رو برامون انجام میده رو بهش میگن اسمبلر. مثلا مایکروسافت MASM رو ارائه کرده ، یا NASM هم هست که توسط جامعه کاربریش توسعه داده میشه.
      مجازی ساز هم برامون یک کامپیوتر رو شبیه سازی میکنه، و ما میتونیم کد نهایی رو روی اون تست کنیم.
      اگر باز هم سوالی هست، من در خدمتم 🙂

  2. سلام و خسته نباشید
    من اگه یه برنامه اندروید بنویسم ، بعدا می توانم یه سیستم عامل بنویسم و فایل اندروید رو داخلش اجرا کنم؟فقط در حد ممکنه یا ممکن نیست

    1. بله ممکنه.
      شما در این حد پاسخ خواستید ولی من کمی بیشتر توضیح میدم. در سیستم عامل خودتان، نیاز خواهید داشت که کتابخانه ها و وقفه های آندروید و لینوکس هم اضافه کنید.

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

        1. سوال جالبیه. کتابخانه ها رو میشه از سورس اون سیستم عامل پیدا کرد (که خب آندروید اوپن سورسه!) و یا این که با توجه به استانداردهای ارائه شده، میشه بازنویسیشون کرد. در مورد وقفه ها هم همینطور.
          توصیه میکنم کتاب Operating Systems, Design and Implementation رو مطالعه کنید.

  3. سلام،خسته نباشید
    اگه یه سیستم عامل مثل سیستم عامل شما با زبان اسمبلی بنویسم میشه روی برد های آردوینو اجراش کرد؟چطوری؟

    1. منابع بردهای آردوینو محدوده ولی نشد نداره؛ در همان وبسایت OSDev و … هم راهنمایی برای اجراش وجود داره. منتها اگر میخواهید کد اسمبلی بزنید باید اسمبلی پردازنده آردوینو (AVR و یا ARM ) رو فرابگیرید.

  4. سلام خسته نباشید….
    لطفا در مورد حفره های امنیتی اینتل هم یک مطلب ارائه دهید.
    در مورد ( meltdown – spectre – mnegment engine )
    با تشکر….

      1. منابع فوق العاده برای طراحی و پیاده‌سازی سیستم عامل:

        OS GUI: http://www.trackze.ro/wsbe-complicated-rectangles/.

        OS Development: http://osdev.org

        OS Development (B): http://osdever.net

        OS Book: https://littleosbook.github.io/

        OS Github: https://github.com/showcases/open-source-operating-systems

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

        دومی ویکی هست فوق العاده هست برای یاد گیری جامع.

        سومی هم خوبه و جامع هست.

        چهارمی هم یه کتاب هست، کتاب خوبیه در واقع وبسایته.

        پنجمی پیج گیت هاب سیستم عامل های اپن سورس هست.

  5. سلام
    خیلی کارتون جالبه
    من برای انجام یک پروژه صنعتی نیاز دارم تا بتونم یک برنامه به زبان C بنویسم و اون رو بدون سیستم عامل روی یک کامپیوتر 32 بیتی اجرا کنم هدفم از اینکه میخوام بدون سیستم عامل اجراش کنم اینکه که سرعت اجرای دستورات زیاد باشه و به حداکثر مقدار خودش برسه چون توی این کار و کارهای مشابه سرعت پردازش زیادی نیاز دارم.
    آیا این کار شدنی هست؟ اگه هست میتونید منو راهنمایی کنید؟

    1. برای این کار شما احتمالا یک سیستم میکروکنترلری نیاز خواهید داشت، میکروکنترلرهای ۳۲ بیتی هم در بازار موجود هستند.

  6. سلام. من یه او اس دولوپر هستم که LiBOS رو بعنوان fun OS نوشتم. تخصصم نوشتن accelerated graphics برای او اس هست.
    موضوعاتی مثل xHCI USB، و دکودر jpeg و نوشتن و بوتسترپ کردن اسمبلر از بیخ رو هم نوشتم و کاور کردم.
    اگه علاقمند به یاد گرفتن و بحث کردن هستید به من خبر بدید.

    https://github.com/ImAbdollahzadeh/LiBOS

  7. سلام.
    من در مورد ساخت سیستم عامل چند سوال داشتم:
    ۱.الان بعد از اینکه این کد اجرا شد ویندوز میپره؟ اگه بله چطور میشه به ویندوز برگردوند؟
    ۲‌.الان این کدی که شما نوشتید روی کنسول اجرا میشه دیگه؟ الان چطور میشه این رو از حالت کنسول در آورد؟
    ۳.چطور میشه برای سیستم عامل برنامه درست کرد؟ یعنی چطور فایل های اجراییش رو تعیین کنم؟
    ۴.شما ساخت کد اصلی رو توضیح دادید ولی ساخت بوت لودر رو توضیح ندادید.
    ۵. اگه میشه مقاله ای در مورد ساخت توزیع لینوکس بزارید.
    ۶. اتصال به اینترنت و وای فای رو چگونه انجام بدیم؟
    ۷. ساخت پوشه و فایل چگونه انجام میشه؟؟؟؟
    ….
    للللللططططططططففففففااااااا جواب بدید.

    1. ۵. آخرین مطلب همین وبسایت رو بخونید. باقی سوالاتتون رو در قالب یک پست جدا توضیح میدم.

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

        1. ۱. خیر. این سیستم عامل قرار نیست روی هارددیسک نصب بشه. فقط از روی یک ایمیج اجرا میشه.
          ۲. برای رفتن به حالت گرافیکی نیاز به دونستن مفاهیم پیچیده‌تری داریم.
          ۳. این مورد نیاز داره که شما با مدیریت حافظه و مدیریت دیسک آشنا باشید.
          ۴. سیستم‌عامل ۱۶ بیتی خودش بوت‌لودر هم هست.
          ۶. ر.ک. ۳
          ۷. ر.ک. ۳

  8. سلام اسمبلر رو از کجا دان کنم وین ۱۰؟
    ممنون و اینکه من میخوام اتوم روش نصب کنم میشه راهنمایی کنید؟
    و اگر جایی رو اشتباه گفتم و منظورتان این نبود لطفا راهنمایی کنین من چیز زیادی بلد نیستم و حوزه ی تخصصم سی شارپ هست

    1. من از اتم استفاده نمی‌کنم و اطلاعی از نصبش ندارم. اما برای نصب اسمبلر می‌تونید از nasm و راهنمای رسمیش استفاده کنید.

  9. سلام اقای حقیری اگر باتلاش خیییییییلی زیاد با سرمایه لازم می توان در اینده سیستم عامل بهتر از Windows and Mac os ساخت

پاسخ دادن به محمدرضا حقیری لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *