PDA

View Full Version : سوال: نوشتن برنامه ی ای که هنگام بالا اومدن سیستم اجرا بشه



mostafa_shaeri_tj
دوشنبه 19 مرداد 1388, 21:18 عصر
سلام. خسته نباشید.

چطور میشه با c++ برنامه ای نوشت که وقتی سیستم رو روشن کردیم اجرا بشه.
مثل ویندوز که وقتی سیستم بالا میاد اونو اجرا میکنه .
حالا من نمی خوام ویندوز بنویسم. فقط همین کار رو انجام بده.
اصلا این کار شدنیه؟:متفکر:

m1975b
دوشنبه 19 مرداد 1388, 21:31 عصر
به نام او

شما میتوانید به جای اینکه برنامه خاصی بنویسید فایل معمولی اجرایی خودتونو در Autoexec.bat سیستم در Dos قرار دهید.
یا در Startup ویندوز قرار دهیید تا در موقع لود شدن سیستم فعال گردد.

mostafa_shaeri_tj
دوشنبه 19 مرداد 1388, 21:47 عصر
سلام.
مثل اینکه به سوال من دقت نکردید.
من میخوام برنامه ام قبل از اجرای سیستم عامل اجرا شه.

Nima_NF
دوشنبه 19 مرداد 1388, 22:53 عصر
برنامه ام قبل از اجرای سیستم عامل اجرا شه. شما این برنامه را مخصوص یک سیستم عامل می نویسید و از کتابخانه های همان سیستم عامل هم استفاده می کنید.

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


در هر حال، برای شروع کار و اهداف کوچک مورد نظر می توانید بر روی GNU GRUB boot loader تحقیق کنید.

pswin.pooya
سه شنبه 20 مرداد 1388, 00:55 صبح
سلام. خسته نباشید.

چطور میشه با c++ برنامه ای نوشت که وقتی سیستم رو روشن کردیم اجرا بشه.
مثل ویندوز که وقتی سیستم بالا میاد اونو اجرا میکنه .
حالا من نمی خوام ویندوز بنویسم. فقط همین کار رو انجام بده.
اصلا این کار شدنیه؟:متفکر:

بله دوست من شدنی هستش. من خودم دارم این کار رو انجام میدم:
osdever.blogfa.com

برای اینکار در ابتدا باید یک بوت لودر بنویسی ( این یکی رو باید با زبون اسمبلی بنویسی) که میتونی از حاضری های اون استفاده کنی. بعد از میتونی از هر کامپایلری خواستی استفاده کنی. ( من از ویژوال استادیو 2008 استفاده می کنم) فقط باید تمام کتابخونه های run time رو از جمله CRT ( c run time) رو غیر فعال کنی و خودت یه crt رو طراحی کنی و توی پروژت استفاده کنی که بازهم crtهای از پیش طراحی شده رو میتونی از سایتهای توسعه سیستم عامل پیدا کنی. داکیومنتهای زیادی هم برای تنظیم کامپایلرهای ویژوال استادیو و gcc وجود داره.
اما در مورد boot loader: این برنامه باید کرنل شما ( یا همون برنامتون) رو از دیسک برداره و اجرا کنه. شما میتونین بعد اجرای برنامه بوت لودر ویندوز رو اجرا کنین. فکر کنم فقط برداشتن محتویات اجرایی سکتور صفر دیسک و اجرای اونها کافی باشه.

mostafa_shaeri_tj
سه شنبه 20 مرداد 1388, 11:07 صبح
متشکر از جواب شما دوستان.
یعنی مهم نیست که برنامه باچه زبانی نوشته بشه . فقط باید به بوت لودر بگم این برنامه ی قابل اجرای من رو اجرا کنه؟
وقتی ما برنامه رو کامپایل میکنیم یه فایل exe درست میشه که فقط ویندوز اونو میشناسه و میتونه اجرا کنه.
آیا خود کامپیوتر بدون هیچ سیستم عاملی میتونه این فایل exe رو اجرا کنه؟

pswin.pooya
سه شنبه 20 مرداد 1388, 20:37 عصر
سلام
اگر برنامه شما از توابع مربوط به سیستم عامل و یا وقفه های داس استفاده نکنه. و فرمت exe اون برای داس باشه. بله چرا که نه!

ولی تا اونجا که من میدنم هیچ زبونی به جزء سی و اسمبلی همچیت ساپورتی نمیده

mostafa_shaeri_tj
سه شنبه 20 مرداد 1388, 20:54 عصر
واقعا ممنون.

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

pswin.pooya
سه شنبه 20 مرداد 1388, 22:59 عصر
تقریبا تمام دستورات از سیستم عامل استفاده می کنن. شما حتی نمی تونید از new و یا malloc استفاده کنین و باید اینها و دستوراتی مثل printf رو از اول بنویسید. البته زمانی که شما از مودهای 32 بیتی ( pmode) و مود 64 بیتی ( lmode) و یا مودهای دیگه بخوایین استفاده بکنید باید تمامی موارد حتی وقفه های بایوس رو هم از اول بنویسید. خلاصه بگم هر چیزی رو که لازم داری رو باید خودت بنویسی به جزء سینتکس خود سی ( for, while, if) . البته اگر بخوای برنامت 16 بیتی باشه میتونی از توابع BIOS که لیست کاملشون داخل کتاب مرجع برنامه نویسان PC پیترنورتون هستش استفاده کنی. و توابع مورد نیازت رو بنویسی.

برنامه نویسی سیستمی کار سختی به شمار میره. البته اگر از منابع آماده مثل پروژهای OpenSource استفاده کنید کار به مراتب راحتر میشه. من به شما پیشنهاد می کنم که تو مرحله اول از اسمبلی و در مرحله بعد به سراغ ربانهای دیگه برید.

mostafa_shaeri_tj
سه شنبه 20 مرداد 1388, 23:37 عصر
البته اگر بخوای برنامت 16 بیتی باشه میتونی از توابع BIOS که لیست کاملشون داخل کتاب مرجع برنامه نویسان PC پیترنورتون هستش استفاده کنی. و توابع مورد نیازت رو بنویسی.

.

این کتاب به صورت pdf هست یا باید از کتاب فروشی ها تهیه کنم.

pswin.pooya
چهارشنبه 21 مرداد 1388, 10:36 صبح
اگر فقط لبست وقفه های بایوس رو بخوای میتونی اونها رو از روس وب پیدا کنی ولی این کتاب رو باید از بازار تهیه کنی که داخلش اکثر وقفه ها و حتی نقشه rom bios رو بطور کلی توضیح داده. ین کتاب قذیمی هستش و چندان بکار برنامه های جدید نمیاد مگر اینکه بخوایید در سطح سیستمی کار کنید.

mostafa_shaeri_tj
چهارشنبه 21 مرداد 1388, 12:15 عصر
شما خودتون هم تو پروژه تون از وقفه های بایوس استفاده کردید؟
شما هم دارید تو مد 16 کار میکنید؟
واسه شروع باید چه کار کنم؟

pswin.pooya
چهارشنبه 21 مرداد 1388, 16:40 عصر
سلام
نه من تمامی مواردی رو که نیاز دارم خودم می نویسم و از وقفه های بایوس هم استفاده نکردم. من با مد 32 بیتی ( pmode) دارم کار می کنم.

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

mostafa_shaeri_tj
چهارشنبه 21 مرداد 1388, 19:00 عصر
سلام.
در مورد بوت لودر که چند تا کد اسمبلی گیر آوردم. حالا یا خودشو به کار میگیرم یا یه دستکاری هایی هم توش میکنم.
منظورم همون کار با سی هست.
در ضمن شما که از وقفه های بایوس استفاده نمی کنید . پس چه کار میکنید؟ یعنی مثلا برای چاپ hello توی صفحه باید از وقفه استفاده بشه . اگر شما از اون استفاده نمی کنید پس با چه کدی این کار انجام میشه؟
سوال بعدی هم اینه که : همینکه بوت لودر رو توی فلاپی کپی کنم . بعد با فلاپی بوت کنم سیستم بوت لودر رو میشناسه و تمومه . یا باید کار دیگه ای هم بکنم. پسوند فایل بوت لودر چی باید باشه : exe , com , ?

pswin.pooya
چهارشنبه 21 مرداد 1388, 21:58 عصر
بوت لودر:
این فایل باید در سکتور صفر، هد یک، سیلندر یک دیسک ( هر دیسکی که قرار از اون بوت انجام بگیره) قرار بگیره. و اینکار با برنامه های مخصوص مثل debug و partcopy انجام میگریه. این برنامه باید حاوی بلوک OEM و کلمه 55AA باشه به همین دلیل حجم این برنامه باید کمتر 512 منهای حجم بلوک و 2 بایت ( اندازه 55AA) باشه.

C:
برای کار با سی باید crt رو بنویسی و گزینه crt رو از کامپایلر false کنی تا برنامت بدون وابستگی به هیچ محیطی اجرا بشه.همینطور باید کاری کنی که لینکر برنامه ویندوز و یا سیستم عاملهای دیگه رو تولید نکنه بجزء exe داس که به راحتی میشه از اون استفاده کرد. توی crt مواردی رو مثل تابع شروع کننده ( همون main) و مواردی دیگه رو معرفی می کنی.

من مستقیما با خود درایورها و پورتها برای اینکار کار می کنم و حتی تابع printf رو هم خودم نوشتم که یه باگ کوچولو هم داره. برای چاپ توی pmode و یا بدون استفاده از وقفه های بایوس یا باید با درایور vesa کار کنی و یا اینکه باید با حافظه کار کنی:

سایت vesa:
http://www.vesa.org/

شیوه کار یا ویدو نگاشت شده در حافظه:
http://wiki.osdev.org/Drawing_In_Protected_Mode
http://wiki.osdev.org/Text_UI

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

mostafa_shaeri_tj
چهارشنبه 21 مرداد 1388, 23:50 عصر
من با c++ تحت داس برنامه می نویسم . تو تنظیمات کامپایلر رفتم و چیزی به اسم crt ندیدم که بخوام false کنم.
شما منظورتون c++ تحت داس هست؟

pswin.pooya
پنج شنبه 22 مرداد 1388, 00:05 صبح
منظور من اینه که فرمتی که تولید میشه exe داس باشه نه ویندوز (PE ویندوز). من اینکار رو با ویژوال استادیو انجام میدم که اونجا توی تنظیمات پروژه این گزینه هستش.

راهنمای زیر نحوه ساخت crt رو شرح میده (البته نه بطور کامل):
http://wiki.osdev.org/C%2B%2B

اگر یه مدت صبر کنی من داکیومنت مربوط ب هبوت لودر و بعد از اون داکیمونت مربوط به crt و تنظیم کامپایلر رو روی سایت قرار میدم. ( تقریبا کمتر از دو هفته دیگه داکیومنت اول آماده میشه.)