ویرگول
ورودثبت نام
Mohammadasdi
Mohammadasdi
Mohammadasdi
Mohammadasdi
خواندن ۴ دقیقه·۴ ساعت پیش

نوشتن یک سیستم عامل ساده با اسمبلی - پارت 01

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

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


پیش نیازمون ایناس:
یک کامپیوتر (زغالی در حد سیاه سوخته)
یکدونه صندلی!
یکدونه هم اسمبلر که من قراره از سینتکس اینتل و fasm استفاده کنم.
اسمبلی هم باید بلد باشین.


بریم سراغ کارمون (اصلا عاشق مقدمه طولانی نیستم!):
کامپیوتر چند بخش داره:

  • مادربرد

  • سی پی یو

  • کیبورد

  • ماوس

  • مانیتور

  • اسپیکر

غیر از مادربرد و سی پی یو 4 دستگاه کامل بیسیک داریم، هر کدوم از اینا از طریق مادربرد به پورت های سی پی یو وصل شدن، هر کدوم فقط میتونن با input یا output کار کنن، از بین اینا کیبورد و ماوس و یک سری دستگاه های خاص هر دو کار رو میتونن انجام بدن. بجای استفاده از input/output میایم از مخففش استفاده میکنیم که هستش I/O

مادربرد وقتی روشن بشه بایوس اجرا میشه (در سیستم های قدیمی یک ROM خوشگل داشتیم برای بایوس که فریم ور بایوس در اون نوشته شده بود و قابل ویرایش نبود، که در سیستم های جدید دیگه از ROM استفاده نمیکنه)، میاد هر چی دستگاه input که برای بخش ذخیره سازی هست رو میگرده (مثل: اکسترنال، اینترنال، یو اس بی، دی وی دی، فلاپی و ...) اگه قابل بوت باشه توی رم کپی میشه و جامپ میکنه روش.

انصافا تاریک و ترسناکه!
انصافا تاریک و ترسناکه!

حالا چجوری چک میکنه قابل بوت باشه؟
اگه توی حالت real mode باشه که میاد 1 سکتور از هارد یا فلاپی رو میگیره و دو بایت اخر (510 و 511) رو بصورت little-end دریافت میکنه و اگه برابر با 0xaa55 باشه، یعنی قابل بوت هست.

حالا سوال اینه چرا 0xaa55؟ چرا مثلا 0x784a نباید باشه؟ دلیلش برای این بوده که اون قدیم قدیما میخواستن بد سکتور و اینارو تشخیص بدن، اومدن دو بیت متناوب رو بقل هم گذاشتن.

0xaa = 0b10101010 0x55 = 0b01010101

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

حالا کجای رم لود میکنه؟
دقت کنین فقط سکتور اول رو توی رم لود میکنه، و بقیه سکتور هارو باید توی خود کد بوت لود کنین، از اونجایی که یک سکتور 512 بایته، یعنی 512 بایت جا داریم تا کدمونو توش جا بدیم! (کار خیلی راحتیه)
بایوس بوت رو توی بخش 0000:7c00 یا 07c0:0000 لود میکنه.

حالا بعضیا شاید بگن ":" دیگه چه سمیه!
توی 16 بیت حافظه ها flat و صاف نبودن مثل 32 بیتی و 64 بیتی. چونکه ادرس باس 20 بیت بود و توی 16 بیت جا نمیشد اومدن این کارو کردن، که انصافا حداقل بعدش فهمیدن چه گندی زدن و در 32 بیتی به بعد درستش کردن (خداروشکر).
این سمت چپیه که بهش میگن سگمنت (Segment) و سمت راستیه رو میگن بهش (Offset). دیگه بیشتر از بهتون اطلاعات نمیدم، برید خودتون سرچ کنین!😂😎
چون واقعا زیاده و حداقل 10 تا مقاله میخواد یا بیشتر! و نمیشه همرو توضیح داد.


بریم بخش بوت لودر سیستم عامل رو بزنیم: (اسم سیستم عاملی که من انتخاب کردم اینوس هست - Inous)

روند کار اینجوریه که بوت میاد کرنل رو از یک حافظه مشخصی یا مسیر خاصی (اگه بیاین سیستم فایل رو بسازین، مثل fat16 و ...) لود میکنه، و قبل لودش هم اگه بخوایم پیشرفته بازی در بیاریم، میایم کرنل رو با یک الگوریتم صحت سنجی مثل crc-32 یا ... تست کنیم تا اگه مشکلی توی کرنل بود یک صفحه ارور بیاد که بگه kernel فایل خرابه! و نمیتونه لودش کنه!

عصبیه!
عصبیه!

اول میایم یک پوشه میسازیم و توش چند فایل میسازیم که مهمن:

  • build.asm

  • boot.asm

  • kernel.asm

چیزای دیگه هم در حین اموزش میسازیم مثل:

  • vars.asm

  • tui.asm

  • gui.asm

  • macros.asm

  • utilities.asm

  • syscalls.asm

و اینا.
توی build.asm میایم کار build رو انجام میدیم، این فایل قراره تمام فایل های سیستم عاملو تبدیل به یک فلاپی کنه برامون!

اول از همه یک کد کوچیک batch میزنیم به اسم buildx.bat

و توش این کدو میزنیم:

@echo off fasm build.asm inous.img pause

بعد میریم فایل build.asm:

format binary as 'img' use16 org 0x0000 FLOPPY_SIZE equ 2 * 80 * 18 * 512 include 'boot.asm' include 'kernel.asm' rb FLOPPY_SIZE - ($-$$) - 1 db 0

بعد میریم فایل boot.asm:

use16 org 0x7c00 mov al, '!' mov ah, 0x0e int 0x10 cli hlt

بوت لودر رو ساده نوشتم، چون هم خستم هم نمیخوام مقاله بزرگ بشه و حوصله خوندش رو نداشته باشین. بعد این مستقیم میریم پارت 2.

سیستم عاملاسمبلیبرنامه نویسی
۱
۰
Mohammadasdi
Mohammadasdi
شاید از این پست‌ها خوشتان بیاید