# برنامه نویسی سطح پایین > توسعه‌ی هسته‌ی سیستم عامل >  نوشتن سیستم عامل کوچک

## Mah-ra

اگه بخوایم یک سیستم عامل کوچک بنویسیم .چطور باید برنامه مون رو با زبان c کامپایل کنیم که به حالت باینری در بیاد؟

----------


## ASHKANLAEI

https://github.com/cfenollosa/os-tutorial این بهتون کمکی میکنه؟

----------


## the king

> اگه بخوایم یک سیستم عامل کوچک بنویسیم .چطور باید برنامه مون رو با زبان c کامپایل کنیم که به حالت باینری در بیاد؟


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

در درجه اول بهتره یک سیستم عامل مستقل و واقعی نسازید. یعنی یک سیستم عامل مجازی بسازید، سیستم عامل تون وابسته به امکانات سیستم عامل واقعی ویندوز یا داس یا ... باشه و فقط تحت اونها اجرا شدنی باشه. 
اینطوری بخش عمده ای از حجم کار تون کم میشه و میتوانید روی کلیات سیستم عامل دلخواه تون تمرکز کنید، نه جزئیات فنی.
اما اگر واقعا بخواهید یک سیستم عامل مستقل بسازید، برخی کامپایلر های قدیمی ++C / C تحت DOS مخصوصا قدیمی تر ها از مدل حافظه Tiny پشتیبانی می کنند که خروجی فایل شون com است، نه exe
فایل com ساختار خیلی خیلی ساده ای داره و تقریبا هر بایتی که ازش بردارید رو میشه حتی در بخش بوت سیستم درج کرد.

اصولا برای برنامه نویسی که میخواد دستورات زبان ماشین رو از داخل فایل اجرایی استخراج کنه فایل com مناسب ئه، نه exe. و در نظر بگیرید کامپایلر C بصورت عادی انتظار نداره که شما باهاش سیستم عامل طراحی کنید و کدی که هیچگونه وابستگی به سیستم عامل نداشته باشه تولید نمی کنه، برخی روتین هایی که در اینجور فایل ها می بینید، دارند از سرویس های سیستم عامل (مثلا DOS) استفاده می کنند و اگر بخواهید به عنوان کد یک سیستم عامل مستقل ازشون استفاده کنید اجرا شدنی نیستند.
بهتره فقط زمانی سراغ نوشتن یک سیستم عامل مستقل و واقعی برید که برای طراحی دونه دونه اجزاء سیستم عامل زمان کافی و ایده و تخصص داشته باشید.

----------


## Mah-ra

ممنون از پاسخ.
یعنی نمیشه کامپایلر ها مثلا gcc یا openwatcom رو جوری تنظیم کرد که کد مستقل از سیستم عامل تولید کنه البته بدون استفاده از کتابخانه های c

----------


## Mah-ra

> کتابخانه های زبان C بر اساس سرویس ها و امکاناتی که سیستم عامل در اختیارشون میذاره طراحی شدن و بدون اونها اجرا شدنی نیستن، به همین جهت خروجی کامپایلر هم عموما نمیتونه مناسب اینکار باشه.
> در برخی جاها مجبور می شوید با Inline Assembly که برخی کامپایلر ها پشتیبانی اش می کنند روتین های متعارف C مثلا برای نمایش متن یا دریافت کلید رو با سرویس های BIOS جایگزین کنید تا در یک سیستم عامل مستقل قابل اجرا باشن.
> مخصوصا فایل اجرایی exe بحاطر ساختارش مناسب استفاده در یک سیسنم عامل مستقل نیست. چون فایل exe برای اجرا شدن به سیستم فایل، سیستم مدیریت حافظه و ... احتیاج داره که اونها رو شما نساختید.
> 
> در درجه اول بهتره یک سیستم عامل مستقل و واقعی نسازید. یعنی یک سیستم عامل مجازی بسازید، سیستم عامل تون وابسته به امکانات سیستم عامل واقعی ویندوز یا داس یا ... باشه و فقط تحت اونها اجرا شدنی باشه. 
> اینطوری بخش عمده ای از حجم کار تون کم میشه و میتوانید روی کلیات سیستم عامل دلخواه تون تمرکز کنید، نه جزئیات فنی.
> اما اگر واقعا بخواهید یک سیستم عامل مستقل بسازید، برخی کامپایلر های قدیمی ++C / C تحت DOS مخصوصا قدیمی تر ها از مدل حافظه Tiny پشتیبانی می کنند که خروجی فایل شون com است، نه exe
> فایل com ساختار خیلی خیلی ساده ای داره و تقریبا هر بایتی که ازش بردارید رو میشه حتی در بخش بوت سیستم درج کرد.
> 
> ...


البته من یک سوال دیگم داشتم اینکه چگونه از سخت افزار مثلا کارت گرافیک در اسمبلی در حالت protected mode استفاده کرد . 
مثلا به جای استفاده از صفحه نمایش در حالت 80*25 از حالت hd استفاده کرد در سیستم عاملی که می خوایم بنویسیم

----------


## the king

> ممنون از پاسخ.
> یعنی نمیشه کامپایلر ها مثلا gcc یا openwatcom رو جوری تنظیم کرد که کد  مستقل از سیستم عامل تولید کنه البته بدون استفاده از کتابخانه های  c


چیزی در این مورد جایی ندیدم که خروجی کامپایلر C کد های زبان  ماشین پردازنده های خانواده خاصی مثل x86 باشه ولی مستقل از سیستم عامل  باشه.

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




> البته من یک سوال دیگم داشتم اینکه چگونه از سخت  افزار مثلا کارت گرافیک در اسمبلی در حالت protected mode استفاده کرد . 
> مثلا به جای استفاده از صفحه نمایش در حالت 80*25 از حالت hd استفاده کرد در سیستم عاملی که می خوایم بنویسیم


از VESA BIOS Extension استفاده خواهید کرد، از protected mode بخوبی پشتیبانی می کنه. اینم مستنداتش :
*VESA BIOS Extension 3.0*

----------

