• 0
szerf

نحو بناء نظام تشغيل عربي

سؤال

بسم الله الرحمن الرحيم

أعتقد أن الكثير من المبرمجين العرب يتمنون ظهور نظام تشغيل عربي 100% وقد قرأت في هذا المنتدى عدة مقالات عن ذلك ووجدت أن:

-بعض الناس يعتقدون أن الأمر صعب بحيث يكاد يكون مستحيلا

-و بعضهم يعتقدون أنهم يمكن أن يصمموا نظام تشغيل قادر على أن يتفوق على وندوز ولينكس

-وبعضهم لا يرون فائدة من تصميم نظام تشغيل عربي

أنا شخصيا أرى أن الأمر ليس مستحيلا وأيضا لا يمكن لهذا النظام أن يتفوق بسهولة على الأنظمة الأخرى

ولكن...

يمكننا أن نحاول...

قد يقول البعض ان الأمر صعب جدا ومن غير المنطقي ان يقوم شخص ببرمجة نظام تشغيل يفي بحاجيات المستخدم اليوم

هذا صحيح

ولكن لينوس تورفالدز لم يصمم الأوبنتو 8.04 لكنه صمم نواة اللينكس التي تعمل من سطر الأوامر !!!

أي أن نظام التشغيل العربي يجب أن يبدأ من سطر الأوامر

ربما سطر الأوامر غير محبذ للكثيرين ولكن رحلة الألف ميل تبدأ بخطوة

والخطوة الأولى هي التعلم:-تعلم لغة الأسمبلي

-تعلم المقاطعات(interruption) الخاصة بالمعالج والبيوس

-الإطلاع على نظام تشغيل سابق

و أرجو من كل متخصص في هذا الأمر الإفادة ببعض الروابط أو كتب من تأليفه أو ترجمة بعض كتب أجنبية وتبسيطها أو حتى تقديم دروس عبر هذا المنتدى(الحسنة بعشر أمثالها)

{الكتب التي تتحدث حاليا عن لغة الأسمبلي باللغة العربية قديمة ومعظمها موجه لتعليم السطو على البرامج أما الخاصة بتعليم المقاطعات فهي منعدمة}

ويجب أن يدخل الموضوع في حيز الجدية..

ولذلك أبدأ بهذا الملف الذي يحتوي على كيفية تصميم نظام تشغيل بسيط

والسلام عليكم

boot.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

156 إجابة على هذا السؤال .

  • 0

شكرا جزيلا أخي halwa أنا الآن أشعر بسعادة غامرة :happy:

برنامج المحادثة المفضل عندي هو skype

ابحث عن aymen.hakim

الشرح عن النمط المحمي رائع

للأسف سأضطر للتغيب بعض الايام

وعند عودتي سأبعث لك برسالة على بريدك بالمنتدى إن شاء الله

مشكور جدا على المجهود

إلى اللقاء

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ورحمه الله وبركاته

:wub: الحمد لله ان السعاده تغمرك الأن وان الشرح افضل من السابق

ولكن الخطا :S خطأي منذ البدايه ظننت ان معظم من سيشتركون ممن يحبوون الحفظ وليس الفهم

ونرجو الا تتطيل في الغياب

تم تعديل بواسطه halwa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

أسف علي تأخري لان شركه الانترنت tedata قامت بقطع الانترنت عنا وقد قمت بوضع هذا الدرس من احد مقاهي الانترنت بسبب عدم دفعنا الاشتراك

**********************************************

ملحوظه مهمه يج ان تكون قد قرأت معنا الدرس السابق الخاص ب linker وملف makefile وgrub

*********************************************

وعندي حل افضل من ربما يكون افضل من الاخرين وهو فتح موضوع اخر يحتوي علي كافه الأسئله وهذا الموضوع يخصص للشرح

ونرجو دعم احد خبراء السي/سي++ لنا في شرح الاشياء الغامضه طبعاً في لغه السي /سي++ وليس انظمه التشغيل

**********************************************

درسنا اليوم عن الشاشه النصيه حيث سنقوم بدعم الشاشه النصيه.

درس اليوم يحتوي علي الملفات الاتيه

boot.asm

main.cpp

video.cpp

system.cpp

inc/video.h

inc/system.h

*********************************************

اولاَ ملف boot.am

هنا شرح الملف Grub mlutiboot

********************************************

ملف main.cpp لا يحتوي الكثير

#include "inc/system.h"
#include "inc/video.h"

extern "C" void Hmain() //تصدير إسم النواه وفي حالتنا Hmain
{
puts('W'); // طباعه حرف علي الشاشه
// الكثير من يقول انه لا يمكن استخدام تلك الدوال في كتابه انظمه التشغيل ولكن ...... انظر الباقي
while(1); // دوره لا نهائيه الهدف منها هو توقف النواه عن العمل
}

*******************************************

ملف system.h سوف اطلق عليه ملف التعريفات

#ifndef _H_system_					 // أمر توجيه للمترجم معناه إذا لم يتم تعريف _H_system_
#define _H_system_ // قم بتعريفها
// الهدف من ذاك هو منع تعريف هذا الملف في النواه مره اخره
typedef unsigned char uchar; // تعريف نوع جديد من المتغيرات وسيكون اسمه uchar
typedef unsigned short ushort; // كما في السطر بلأعلي
typedef unsigned int uint; // كما في السطر بلأعلي

void memset(uchar *dest,uchar val,int count);
/* الهدف من هذه الداله وجعل احد عناوين الذاكره يساوي قيمه معينه
في البدايه قمت بتعريف المتغير dest
والذي يحمل عنوان الذاكره الذي نريد نسخ قيمه إليه
val القيمه التي سيتم نسخها
عدد تكرارات النسخ ملحوظه كلما ذاد عدد
مرات النسخ سيزيد العنوان
example:
العنوان المقصود 00001 وعدد التكرارات 5 فستم النشخ في العناوين التاليه
كما يلي بالقيمه a
00001 = A
00002 = A
...
00005 = A
*/
void memcpy(uchar *dest,uchar *src,int count); // نفس شرح السابق تقريباً

*********************

ملف system.cpp الكود الحقيقي للدول التي عرفت بلأعلي

void  memset(uchar *dest,uchar val,int count)
{
int i;
for(i=0;i<= count;i++)
{
dest[i]=val;
}
}
void memcpy(uchar *dest,uchar *src,int count)
{
int i;
for(i=0;i<= count;i++)
{
dest[i]=src[i];
}
}

******************

كل هذا :angry: ولم تبدأ في شرح الشاشه النصيه لما؟

حسنناً نرجو الهدوء قليلاً (حقيقة لا اعرف من اي ابدا)

الشاشه النصيه تلك اشاشه السوداء التي لا نري الألوان فيها إلا صدفه تتكون تلك الشاشه من طول 80 وعرض 25

ماذا تعني ب 80 و 25؟ اي انها تستطيع ان تحتوي علي احرف بطول 25*80 اي 2000 حرف

طلب بسيط ممكن صوره ؟ انظر المرفقات

سؤال كيف اقو بإظهار حرف علي الشاشه حسننأ عن طريق جعل العنوان 0xb8000 برقم الحرف في جدول أسكي كود متبوعا بلون الحرف طبعا اول سؤال يأتي إليك كيف احمل احرف اخري ؟

لكي تقوم بتحميل أي حرف ليظهر علي الشاشه استخدم هذا المعادله لتحصل علي موقعه

(السطر * 80 ) + الموقع

وتقم بإضافته للعنوان السابق

مثال نريد طباعه احد الحروف في السطر 5 بعد 10 مسافات

(5*80) + 10 = 410 نقوم بإضافته للعنوان السابق فيكون

0xb8410 نقوم بتحميله برقم الحرف والعنوان 0xb8411 بلون الحرف

للخلاصه

العناوين الزوجيه للحروف والعناوين الفرديه بلون الحرف

نهايه الموضوع :

ارجوا ان اكون قد وفيت بهاذا الشرح وأي اسئله يجب ان تكون علي الخاص او في موضوع اخر

وطلبي كتابه كود يستغل الشرح السابق في طباعه احرف علي الشاشه قبل وضع الكود

******************************************************

Halawa oprating system سوف اقوم بوضعه عن قريب إن شاء الله

//////////////////////////////////////////////////////

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

نصيحة ، بدل من شرح نظام التشغيل هنا ، ليقرأ كل واحد جزء تتفقون عليه ، وأي واحد عنده استفسار يسأل.

هكذا أفضل ، حتى يكون الموضوع عملي.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اعرف قصدك أخ برق

فكل واحد يقرأ عن جزء معين واحد يقرء عن الشاشه النصيه وواحد يقرا عن جدول Gdt

وواحد يقرأ عن Gui وغير

لأا اظن هذا بينفع تقول لماذا لان كل جزء مرتبط بما قبله إرتباط وثيق

فلا يمكن لاحد البرمجه وينسي المرجم او المفسر كيف سيعمل برنامجه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لا ، ليس هذا قصدي ، قصدي أنكم كلكم تقرؤون نفس الجزء ، وتتناقشوا فيه ، وإذا لم يفهم أخد يقوم الآخر بإفهامه.

على العموم ، دعواتي معاكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

وأخيرا عدت ياأخ halwa :happy:

فكرة جيدة فعلا

أخ برق بما أنك مشرف قسم اللينكس قد تستطيع مساعدتنا في هذا الأمر :wub:

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
أخ برق بما أنك مشرف قسم اللينكس قد تستطيع مساعدتنا في هذا الأمر

لدينا في القسم موضوع اسمه الطريق إلى linux kernel .

يمكنك متابعته، وسأبدأ قريبا مع شخص واحد فقط ، لكنه مؤهل تماما ومحترف.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اين الكود الذي قمتم بكتابته انا في الانتظار حتي اقوم بوضع الكود الذي استخدمه في دعم الشاشه النصيه

اخ برق اتمني ان اكون احد المشاركين في مشروعك هذا ولكن سبب عدمن اشتراكي هو انه ليس لي خبره بلينكس نهائياً :cry:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

يبدو انه لا احد يريد المشاركه معي

بالنبسبه لملف الفيديو والذي كنت اريد منكم ان تقوقموا بكتابته ولم يضعه احد سوف اقوم بوضعه

وها هو الكود

unsigned char *vmem = (unsigned char*)0xb8000;
int x=0,y=0;
void puts(char c)
{
if (c == '\n')
{
x=0;y++;
}else if( c== '\b')
{
if(x != 0)x--;
}else if( c== '\t')
{
x += 4;
}else if (c >= ' ')
{
int address = ((y*80)+x)*2;
vmem[address] = c;
vmem[address+1] = 0x1F;
x++;
}
if(x > 80)
{
x=0;y++;
}
if(y > 25)
{
x=0; y= 0;
}
}

في البدايه تعريف للداله putc ومهمتها كتابه حرف علي الشاشه وتأخذ عامل وهو الحرف

وقد تم تعريف قبلها متغيرين وهما الاذان المكان الحالي الذي سيتم الكتابه فيه وقد تم جعل قيمتهما = صفر اي ان المكان الحالي = اعلي يسار الشاشه

ويوجد قبلهما مؤشر يشير إلي العنوان الخطي للشاشه النصيه في الذاكره

***********************************

شرح الداله putc

في البدايه يوجد عده شروط علي محتوي المتغير c

اول شرط إذاكان = n\ فإنه يقوم بالنزل سطر جديد عن طريق الأمر ++y والرجوع إلي اول السطر عن طريق ++x اي ان العمل يتم وكأن الشاشه شبكه تربيعيه

والأن حاول ان تفهم بقيه الشروط

نأتي إلي اخر شرط عن المتغير cإذا كانت القيمه المحمله ابر من او تساوي رقم المسافه في جدول اسكي اي اكبر من 0x20 يقوم بطباعهتها علي الشاشه

في البدابه يقوم بحساب الموقع الحالي عن طريق المعادله السابقه (في الدرس السابق) (السطر * 80) + الموقع * 2 لماذا *2 لان عنوان الشاشه النصيه لا يحتوي فقط علي عناوين للحرف فقط بل للألون ايضاً فتكون المعادله في النهايه (y *80) + x )) *2 ثم نقوم بألامر ++x حتي لا نكب الحروف كلها في مكان واحد

الشرطين في النهايه حتي لا يتعد الموقع الحالي حدود الشاشه النصيه

***********************************

الان حاول بنفسك كتابه الدله printf وفكرتها كالأتي حساب طول النص(مثال الداله strlen) يقوم بتكرار الطباعه إلي ان يصل إلي الحرف 0\

حاول كتابتهمل حتي اقوم بإرفاق الكود المصدري للنظام الحالي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
السلام عليكم

اخي halwa كل احترام الك

استمر في التفسير والشرح

انا لا افهم الكثير مما تشرح لكن اود ان اشكرك على الشرح الجيد !!

ارجو من الاعضاء المعنين المتابعة في العمل

شكرا الى الجميع

بسم الله الرحمن الرحيم

من الواضح انه لا يوجد إلي حل واحد وهو وضع الدرس في ملف pdf لسببين

1-سوف يكون الشرح وافي اكثر.

2-صاحب مركز الانترنت لن يزعجني بكلمه(انتهي الوقت)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يبدو اني قد تاخرت في الرد ولكن لا تقلقوا اني موجود والحمد لله

قديقول البعض اني قد تركت الموضوع ولكن لا تقلقوا فلو اني قد تركته فعلاً لما كنت وضعت هذا الرد :D :huh:

لقد ارفقت الدرس وهو بهئه بي دي اف

ملحوظه لقد قمت بوضع اشياء مبهمه حاول ان تفعلها بنفسك ثم قم بإرسالها لي

tsrc.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله ما شاء الله عليك اخى والله بارك الله فيك وفى تعبك الكتاب اكثر من رائع وباذن الله حقراءه وساحاول الى الانضمام اليكم قريبا جدا

اشكرك جدا اخى

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا جزيلا لك أخي halwa على هذا الجهد المبذول.

وآسف إذا كان الرد متأخرا فقد أصبحت زيارتي قليلة للمنتدى هذه الأيام.

أنتظر الدرس الموالي

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

العفو شباب لا شكر علي واجب وسوف يتحقق حلمكم الذي طلبتموه في البدابه وهو صناعه محرك الاوامر

**********

عندي طلب بسيط لمن كلن لهم محاولات سابقه في مجال برمجه انظمه التشغيل

وهو ال paging اريد مساعده فيه من فضلكم لان معظم محاولتي فشلت فيه

وارجو وضعه في المنتدي حالياً اقوم بالرسم علي الشاشه وقد قمت برسم الحرف H اول حرف من حروف كلمه Halawa

وهو بهذا الشكل

|| ||

|| ||

||-----||

||-----||

|| ||

|| || :D

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0
عندي طلب بسيط لمن كلن لهم محاولات سابقه في مجال برمجه انظمه التشغيل

وهو ال paging اريد مساعده فيه من فضلكم لان معظم محاولتي فشلت فيه

صراحتا اخى كنت اتمنى ان اكمل معك شئ ولكن انا حاليا فى الدراسة النظرية وليس بوسعى مساعدتك فى الوقت الحالى ربما اسبوع او اسبوعين ان شاء الله واكن مؤهل للبدء فى ال paging impliemtation

اطيب المنى :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

halwa استمر ، أتمنى لك التوفيق :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

اخي ان كنت تقصد الـMemory Paging فقد قرأت عن هذا الموضوع من قبل وفهمت اكثره نظرياً لكن لم اطبق عملي ,, سأضع ما توصلت اليه اذا سعفني الوقت (رمضان بقى وكل سنة وانت طيب :D ) .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

حسننا انا موافق وارجو وضع المعلومات في اقرب وقت ممكن قبل دخول الدراسه

وها هو الدرس الرابع

اسف لن استطيع ارفق السورس كود الان

2.pdf

تم تعديل بواسطه halwa
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يا اخي العزيز هذا ليس أمر صعب وهو كان صعب عند الأجانب ولكن هم انشئو مؤسسات ويعمل في هذه المؤسسات مبرمجين كثيراً ولو يوجد مؤسسة عربية لو لم يكن بالأمر الصعب ولكنه يحتاج اشخاص كثر انا افكر اني افتح مؤسسة للمبرمجين العرب

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بالفعل نرى دوما مواضيع لنفس الاتجاه

ولكن نأمل أن يعبر أحدهم جسر المناقشات .. نحو التنفيذ ..

والله المستعان

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

كل ما يحتاجه الأعضاء للتقدم أكثر في هذا المجال هو القيام بالبحث

إستعملوا جوجل يا ناس

كل شيئ موجود على النت

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم

ممكن كيفية تحويل كود سي إلى ملف بيناري لأنني لم أستطع تجريب النواة وهي بنمط elf.

أو كيفية تنصيب grub على virtual machine وتحميل النواة بداخله.

وشكرا

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

في البدابه اسف علي التأخير (الدراسه هي السبب)

ثنانياً ولنقم بالرد علي الاسئله

1-لكي تقوم بالتحويل من elf إلي بيناري ابحث في ملف الربط او ملف ال Makefile عن elf-i386 واستبدلها ب binary وهتناك انولع اخري مثل

pe-i386

pei-i386

بالنسبه لتنصيب grub حاليأ شرحها كبير ويمكنك الاستعانه بشخص يفهم جيداًًَ في هذا البرنامج + لينكس

ملحوظه من الان فصاعداً سوف اعرض الفكره وان تقوم بتطبيقها بنفسك وسوف اعرض ايضاً فكره التأكد من عمل الكود الذي قمت بكتابته

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هلنبدأ الدرس التالي ام لا؟ :huh:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .