PDA

View Full Version : سوال: کی میتونه مشکل کرنلم رو حل کنه ؟



behzad24be
جمعه 14 تیر 1387, 03:16 صبح
سلام.
من یه بوت لودر نوشتم که کرنل رو از سکتور دوم فلاپی بارگذاری میکنه توی خونه ی 0x1000 از حافظه . کرنلم هم به زبان c هستش و با gcc کامپایل کردم به صورت باینری . این کرنل خیلی ساده 2تا تابع داره یکی تابع اصلی که اولین بار اجرا میشه یکی هم که یه تابست که یه متن چاپ میکنه . مشکل کرنلم اینه که وقتی بارگذاری میشه ، اولین قسمت که تابع اصلی هستش بدون مشکل اجرا میشه و برای تست کاراکتر A رو چاپ میکنه ولی نمیتونه تابع دوم رو که یه متن یا یه کاراکتر رو چاپ میکنه ، صدا بزنه و اجرا کنه . وقتی چندین بار debug کردمش آخر متوجه شدم که وقتی برنامم لینک شده توسط LD ، وقتی میخواد اون تابع رو call کنه در واقع یه آدرس حافظه رو صدا میزنه که یه آدرس اشتباهه . من خیلی سعی کردم این مشکل رو حل کنم . مثلا یکی از کارایی که کردم اینه که وقتی خواستم لینکش کنم ، طوری لینک کردم که تابع اصلی از خونه ی 0x1000 شروع بشه تا آخر کد به همین ترتیب هر کد آدرس دهی بشه ، ولی بازم مشکلم حل نشد . در کل فقط اینو میدونم که مشکل آدرس دهیه نادرسته و نمیدونم چطوری حلش کنم .لطفا اگه کسی راه حل خاصی توی نحوه ی لینک کردن برنامه بلده بگه . یه نمونه از خط فرمانی که من واسه لینک کردن استفاده میکنم اینه :

ld -i -e _kstart -Ttext 0x1000 kernel.o -o kernel.bin

behzad24be
جمعه 14 تیر 1387, 23:47 عصر
شما که به سوالم جواب ندادید . بزارید سوال رو اینطوری مطرح کنم که ، شما چطوری کرنل خودتون رو کامپایل و لینک میکنین و بدون عیب اجرا میشه و کار میکنه ؟ لطفا تمام مراحلش رو بگید و توضیح بدید.
لطفا مطالب تکراری که توی سایتای ایرانی و خارجی در مورد نوشتن سیستم عامل هستش کپی - پیست نکنین اینجا چون من همشونو مطالعه کردم . اگر واقعا کار عملی و کرنلی هستش که خودتون نوشتین و نتیجه گرفتین راهنماییم کنید.در ضمن در مورد کرنلی راهنماییم کنید که با c نوشته شده نه با asm .
امیدوارم اینجا کسی پیدا بشه که بتونه کمکم کنه .

kameltareen
شنبه 15 تیر 1387, 17:09 عصر
دوست عزیز , شاید مشکل از کامپایلر باشه ...
شاید بهتر باشه کامپایلر تو عوض کنی (فکر کنم TC خوب باشه ....)....

اگه خواسی از TC استفاده کنی , اول برنامه رو کامپایل کن بعد فایل آبجکتش رو با ld86 لینک کن....

امیدوارم مشکلت حل شه...!!!!!

Delphi Skyline
شنبه 15 تیر 1387, 19:44 عصر
دوست عزیز kameltareen (http://barnamenevis.org/forum/member.php?u=68933) کامپایلر هیچ مشکلی نداره .
نمونه کد رو بزار . شاید بتونم حلش کنم .

behzad24be
شنبه 15 تیر 1387, 19:59 عصر
من فکر نمیکم مشکل از کامپایلر باشه ، چون انواع کامپایلارو انجام دادم ، من اینطور متوجه شدم که نمیتونم درست برنامه رو لینک کنم و راه درستشو هم پیدا نکردم ، چون اختصاص دادن آدرسها به هر خط از دستورای برنامه که به اسمبلی تبدیل میشن به عهده ی لینکر هستش . لطفا اگه کسی راه درست لینک کردن برنامه رو میدونه بگه .(باز هم میگم لطفا راهای تکراری که توی اکثر سایتای آموزش ساخت سیستم عامل هستن اینجا نذارین ، چون تقریبا همشونو دیدم . اگه واقعا شما توی ساخت کرنل موفق شدین و تونستین به خوبی اجرا بگیرین ، لطفا منو هم راهنمایی کنین)

behzad24be
شنبه 15 تیر 1387, 20:10 عصر
#define WHITE_TXT 0x07
unsigned int printh(char *message, unsigned int line);
void k_main();
void start()
{
__asm(".intel_syntax noprefix\n"
"mov ah,0x0e\n"
"mov al,65\n"
"int 0x10\n"
".att_syntax\n");
k_main();
}
void k_main()
{
__asm(".intel_syntax noprefix\n"
"mov ah,0x0e\n"
"mov al,66\n"
"int 0x10\n"
".att_syntax\n");
printh("Hello world",8);

for(;;);
}
unsigned int printh(char *message, unsigned int line)
{
char *vidmem = (char *) 0xb8000;
unsigned int i=0;
i=(line*80*2);
while(*message!=0)
{
if(*message=='\n') // check for a new line
{
line++;
i=(line*80*2);
*message++;
} else {
vidmem[i]=*message;
*message++;
i++;
vidmem[i]=WHITE_TXT;
i++;
};
};
return(1);
}

مطابق این کد ، تابع start اول از همه اجرا میشه و کاراکتر A رو چاپ میکنه و بعدش تابع k_main صدا زده میشه که باید تابع k_main هم کاراکتر B رو چاپ میکنه و بعدش دستور printh رو واسه ی چاپ یه رشته صدا میزنه . مشکلی که هست اینه که تابع اول یعنی start با موفقیت اجرا میشه و A رو چاپ میکنه ولی وقتی k_main رو صدا میزنه هیچ اتفاقی نمیفته و کرنل یا متوقف میشه یا شبیه ساز boch ریست شده و دوباره کرنل رو اجرا میکنه . چیزی که من متوجه شدم اینه که وقتی تابع k_main صدا زده میشه در واقع کنتر اجرای برنامه به یه حافظه نامعتبر منتقل میشه (همونطور که میدونید لینکر به جای اسم تابع یه دستور call قرار میده که جلوی اون یه آدرس از حافظست ، که این آدرس به جای درستی اشاره نمیکنه)

behzad24be
دوشنبه 17 تیر 1387, 15:27 عصر
واقعاً که ، یه نفر هم پیدا نشد بتونه مشکل ساده و پیش و پا افتاده ی منو حل کنه ، این همه آدم توی این تاپیکا همش حرفای گنده گنده میزنن و ادعاشون میشه که میخوان سیستم عامل ایرانی بنویسن ، هیچکدوم نتونستن بگن مشکل من چیه . اینا همش نشون میده که یه نفر هم به خودش زحمت ندهده حتی به خاطر یاد گرفتن هم که شده باشه یه کار عملی خودش انجام بده و یه سیستم عامل ساده که بتونه پیغام Hello نشون بده بنویسه . بعدش میان حرف ساخت سیستم عامل ملی و ایرانی میزنن . شما مشکل منو حل کنین سیستم عامل ایرانی پیشکش . ("< ایرانیا فقط بلدن حرف بزنن ، همش ادعای علم و دانش و تکنولژی دارن ولی ... >")

fazlnet
سه شنبه 18 تیر 1387, 04:34 صبح
اولا شما این کد رو از خودتون ننوشتین و مربوط به وحید هاشمی است(ذکر منبع)
در ضمن شما باید در این خط unsigned int printh(char *message, unsigned int line)
char *message به char *message[] تغییر بدید چون هر داده ی char فقط یک بایته پس اگر میخواهید رشته را مستغیم به تابع بدهید باید از آرایه استفاده کنید

behzad24be
سه شنبه 18 تیر 1387, 12:01 عصر
اولا شما این کد رو از خودتون ننوشتین و مربوط به وحید هاشمی است(ذکر منبع)
در ضمن شما باید در این خط unsigned int printh(char *message, unsigned int line)
char *message به char *message[] تغییر بدید چون هر داده ی char فقط یک بایته پس اگر میخواهید رشته را مستغیم به تابع بدهید باید از آرایه استفاده کنید


اولا این کرنل ساده رو خودم نوشتم یعنی چیزی نداره که مثلا بخوام از کد یه نفر دیگه دزدیده باشم و توی کد خودم نوشته باشم ، دوما تنها قطعه کد چاپ رشته هستش که نوشته Joachim Nock and K.J. هستش نه آقای هاشمی و از سایت osdever.net برداشتمش . شما هم برید منابع رو خوب یاد بگیرید . سوماً هم که نیازی نسیت از آرایه استفاده کنم چون char *message به صورت اشاره گر هستش که به صورت آدرس حافضه هستش و با اضافه کردن به مقدارش به خونه ی بعدی دسترسی خواهم داشت ، بهتره برید اشاره گرها رو یاد بگیرید ، چهارماً اگه واقعاً سیستم عامل نویس باشید باید بدونید که در این زمینه باید با اشاره گرها کار کنیم که دسترسی مستقیم به حافظه داشته باشیم ، چون سیستم عاملی وجود نداره که بخواد یه آرایه از حافظه رو واسه ی ما رزرو کنه و اختصاص بده ، پنجماً اگه تمام مثال های مربوط به نوشتن minios که توی اینترنت هست رو مطالعه کنید متوجه میشید که همشون به ناچار از اشاره گرها استفاده میکنن .
توصیه میکنم برید زبان C رو از اول با دقت مطالعه کنید .