PDA

View Full Version : زبان C و بوت



alamate_aoal
یک شنبه 27 اردیبهشت 1388, 03:42 صبح
با عرض سلام:بوس:

آیا با زبان c میشه برنامه ای نوشت که خارج از محیط سیستم عامل اجرا بشه؟
اگر میشود لطف کنید بگویید آیا باید از کامپایلر یا ترفند خاصی استفاده کرد؟
هدف من این است که یه سیدی یا فلاپی درست کنم که با برنامه من بوت شود در حقیقت من با برنامه easy boot سیدی بوت را میسازم ولی زمانی که میخواهم فایل اجرایی ای که با c نوشتمش را run کنم عمل نمیکند.
البته با اسمبلی موفق به این کار شدم(هوراااا:تشویق:) ولی میخوام با c انجامش بدم.

ممنون میشم اگر راهنمایی ام بکنید
با تشکرات ویژه

alamate_aoal
دوشنبه 11 خرداد 1388, 01:32 صبح
دوستان عزیز کسی نمیتونه جواب سوال منو بده؟

alamate_aoal
دوشنبه 11 خرداد 1388, 01:34 صبح
هم اکنون نیازمند یاری سبزتان هستیم !!!!

pswin.pooya
دوشنبه 11 خرداد 1388, 12:24 عصر
سلام
چرا نمیشه ساختش. خود ما کرنل سیستم عاملمون رو داریم با سی ++ می نویسیم. اما در مورد برنامه بوت یه همچین گژینه ای سخته و تنها علتش هم حجم بالای برنامه هستش. چون برنامه بوت فقط میتونه 510 بایت باشه. باید با اسمبلی نوشته شه. اما شما می تونید این برنامه رو جوری بنویسید که سیستم جدول فایلی (FAT،EXT و یا CDFS) رو خونه و برنامه دوم رو که با سی نوشتین رو باز و اجراش کنه.

تنظیمات کامپایلر خیلی سخته و در حقیقت شما باید یکسری تنظیمات مربوط به لینکر رو هم انجام بدید که یه حالت اسکریپ نویسی برای اون رو داره. راحترین حالت اینه که شما کامپایلر VC++ رو برای اینکار تنظیم کنین و ازش بخوایین که exeهای داس رو بدون CRL بسازه و اون رو توسط برنامه اسمبلی لودش کنین. یکسری از موارد دیگه رو که مربوط به C runtime library هستن رو هم باید خودتون طراحی کنید. (مثل دستورهای printf، scanf و ... ) خوب. تمام اینها کارهای سختی هستن و انجام دادن اونها ساعتها زمان میبره. و فکر نکم بشه تو یه تاپیک توضیحشون داد.

tdkhakpur
دوشنبه 11 خرداد 1388, 14:33 عصر
سلام
هر پارتیشنی در ابتدا یک رکورد یا راحتتر بگیم یک فضای 512 بایتی داره که مخصوص boot هست شما میتونید یک برنامه رو بصورت com کامپایل کرده و محتوای این فایل رو داخل قسمت 512 بایتی boot قرار دهید.
ولی برنامه ای که مینویسید در حالی که نباید طولش بیشتر از این مقدار باشه بلکه داخلش پروسه ای رو طراحی کنید که به هنگام اجرا بتونه یه برنامه بسیار سودمندتری رو براتون اجرا کرده و به این ترتیب شما بتونید اختیار سیستم رو در دست بگیرید.
موفق باشید.

pswin.pooya
دوشنبه 11 خرداد 1388, 17:18 عصر
کامپایل کردن با فرمت com هم فایده نداره. تا حالا خودت امتحان کردی؟!!

یه مساله ای هستش که به نام CRL ( C runtime library پون بسیاری از توابع سی از API سیستم عامل استفاده میکنن. نمونش استفاده از وقفه های داس و یا dll های ویندوز هستش. زمانی که سیستم بوت میشه. هیچ چی به جزء وقفه های بایوس وجود نداره.

tdkhakpur
دوشنبه 11 خرداد 1388, 19:47 عصر
کامپایل کردن با فرمت com هم فایده نداره. تا حالا خودت امتحان کردی؟!!

آره عزیزم من از اونایی نیستم که فقط میخواهند حرفی زده باشند.

pswin.pooya
دوشنبه 11 خرداد 1388, 21:54 عصر
آره عزیزم من از اونایی نیستم که فقط میخواهند حرفی زده باشند.

امیدوارم همینطور باشه.
می دونم چی بگم ولی تا نبینم، نمی باورم. اگه یه همچین کاری رو کرده باشی. بعنی کامپایل یک برنامه سی با تمام هدراشو در قالب com و گذاشتن اون داخل boot sector باید بگم موفق شدی یه کار بزرگ رو انجام بدی. چطور بگم. ساعتها کار و تلاش من رو توی چند دقیقه انجام دادی. چون حتی یه برنامه ساده مثل برنامه زیر هم نباید بتونه روی بوت سکتور اجرا شه:


#include <iostream>

void main()
{
cout << "Hello boot"<< end;
getchar();
{

تنها راهی هم که وجود داره اینه که سی ++ رو مجبور کنی که از وقفه های بایوس استفاده کنه که بازم تو این حالت مشکلات خاص خودش پیش میاد.

alamate_aoal
سه شنبه 12 خرداد 1388, 02:38 صبح
با عرض سلام و تشکر خدمت شما دوستان عزیز



چون برنامه بوت فقط میتونه 510 بایت باشه. باید با اسمبلی نوشته شه. اما شما می تونید این برنامه رو جوری بنویسید که سیستم جدول فایلی (FAT،EXT و یا CDFS) رو خونه و برنامه دوم رو که با سی نوشتین رو باز و اجراش کنه

من نمیخوام برنامه بوت بنویسم چون با برنامه easy boot سیدی قابل بوت شدن میسازم.
هدف من این است که برنامه کوچیکی که با زبان سی نوشته شده (یه پیغام چاپ کنه) رو در محیط خارج از سیستم عامل با برنامه easy boot اجرا کنم.
البته فایل اجرایی که با اسمبلی نوشتم و حجم اون هم از 510 بایت هم بیشتر است اجرا میشود و مشکل من اینه که چرا فایل اجرایی که با سی نوشتم (com,exe) اجرا نمیشود.



راحترین حالت اینه که شما کامپایلر VC++ رو برای اینکار تنظیم کنین و ازش بخوایین که exeهای داس رو بدون CRL بسازه

مگه کامپایلر ++vc برنامه ها رو فقط برای محیط ویندوز کامپایل نمیکنه؟
مگه موقع بوت شدن خبری از داس هست که بخوایم فایل اجرایی داس بسازیم(چه با CRL یا بدون CRL)
اگر هست پس آیا میشود از وقفه های داس هم استفاده کرد؟




و اون رو توسط برنامه اسمبلی لودش کنین

من با برنامه easy boot لودش میکنم ولی اجرا نمیشه

با تشکر ویژه از شما دو استاد عزیز

shs_night
سه شنبه 12 خرداد 1388, 03:05 صبح
در قسمت اسمبلی مقداری در مورد آنچه که شما می خواهید مطالب مفیدی موجود است
موفق باشید

shs_night
سه شنبه 12 خرداد 1388, 04:45 صبح
ببین اینها به کارت میاد

shs_night
سه شنبه 12 خرداد 1388, 04:48 صبح
اینو جا گذاشتم !!!:لبخند::لبخندساده:

shs_night
سه شنبه 12 خرداد 1388, 06:04 صبح
(C)در ضمن تمامی این مطالب را از همین سایت گرفتم.

Hessams
سه شنبه 12 خرداد 1388, 10:57 صبح
احتمالا از header/library استفاده کردی .

tdkhakpur
سه شنبه 12 خرداد 1388, 14:46 عصر
سلام
دوست گرامي از اينكه بهتونم يك پيشنهادي كنم كه سخت باشه خوشم نميآد
ولي اينكه شما منظورتون اين هست كه ميخواييد شما برنامه exeيا com رو خودون بالا بياريد در صورتي كه pspبرنامه exe يا com براتون مبهمه.
ببينيد تمامي سيستم عامل هايي كه تا اينجا ساخته شده اند از پايين ترين سطح به بالاترين سطح اوج ميگيرند.
شما براي كامپايل برنامه از c++ ميخواهيد استفاده كنيد ولي اگر ميتونيد اين برنامه exe يا Com توليد شده رو بدون استفاده از وقفه هاي bios لود كرده و آدرسها رو درست جابجا كنيد اصلا شما هيچ مشكلي نخواهيد داشت.
فقط بعد از سكتور boot ميتوني كد برنامه رو قرار بديد. و با الگوريتم خودتون در قسمت boot اون رو لود كنيد.
موفق باشيد. باز ارسال كنيد.

pswin.pooya
سه شنبه 12 خرداد 1388, 17:16 عصر
مگه کامپایلر ++vc برنامه ها رو فقط برای محیط ویندوز کامپایل نمیکنه؟
مگه موقع بوت شدن خبری از داس هست که بخوایم فایل اجرایی داس بسازیم(چه با CRL یا بدون CRL)
اگر هست پس آیا میشود از وقفه های داس هم استفاده کرد؟

درسته برای ویندوز ساخته شده اما بالاخره یک کامپایلر سی ++ هستش و اگر ازش بخوای که یکسری از تنظیمان پیش فرض رو اجرا نکنه میشه برای نوشتن OS هم ازش استفاده کرد.

alamate_aoal
چهارشنبه 13 خرداد 1388, 01:01 صبح
درسته برای ویندوز ساخته شده اما بالاخره یک کامپایلر سی ++ هستش و اگر ازش بخوای که یکسری از تنظیمان پیش فرض رو اجرا نکنه میشه برای نوشتن OS هم ازش استفاده کرد.

با عرض سلام و تشکر

آیا امکانش هست که درباره این تنظیمات کمی توضیح بدی؟

shs_night
دوشنبه 01 تیر 1388, 23:42 عصر
آیا امکانش هست که درباره این تنظیمات کمی توضیح بدی؟
http://www.brokenthorn.com/Resources/OSDevMSVC.html

qalavand57
یک شنبه 04 مرداد 1388, 13:59 عصر
سلام
برای نوشتن همچین برنامه ای حتما باید از کمپایلر TC استفاده کنید. و از توابع استاندارد مثل printf و ... استفاده نکنید بلکه بصورت مستقیم در آدرس 0xb800 برای نوشتن به صفحه نمایش و برای خواندن صفحه کلید پورت 0x61 رو بخونید یا از وقفه های بایوس استفاده کنید.
اگه سوال داشتی به من ای میل بزن.
qalavand57@yahoo.com

shs_night
دوشنبه 05 مرداد 1388, 01:15 صبح
برای نوشتن همچین برنامه ای حتما باید از کمپایلر TC استفاده کنید.

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





و از توابع استاندارد مثل printf و ... استفاده نکنید بلکه بصورت مستقیم در آدرس 0xb800 برای نوشتن به صفحه نمایش

شما خودتون باید شروع به نوشتن اینچنین توابعی بکنید
آدرس فیزیکی صفحه صفر رنگی 0xB8000 میباشد




و برای خواندن صفحه کلید پورت 0x61 رو بخونید

شماره پورت صحیح 0x60 هست.