• 0
szerf

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

سؤال

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

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

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

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

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

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

ولكن...

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

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

هذا صحيح

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

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

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

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

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

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

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

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

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

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

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

boot.zip

0

شارك هذا الرد


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

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

  • 0

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

****

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

واريد ن اعرفل انتم اثين فقط ام لا ول هناك غيركما من المشاركين ام لا وهناك فرصه إن شاء الله لمحترفي الفيجوال بيز 6 او دو نت في العمل معا

********

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

اولا ارقام المداخل بدأ من 0x8 ومبا ان قمت بوضع مدخل الكود رقم واحد فسوف يكون رقمه 0x8 السؤال اذي يراودك هو لماذ لا نضع قسم البياناتب 0x9 بدلاً من 0x10 اجابه هنا الان؟

يجب تحويل طول ال 4جيجا من 32بت إلي 8بت( :S أظن ان هذا شعورك) معني الكلام ان تقوم بأخذ الطول مثلاُ 4 جيجاوتقوم بقسمه علي 2 ثم مره اخري علي 2

سوف يكون الناتج 1 جيجا كم جيجا في الاربعه جيجا إذن رقم المدخل الذي بعده = 0x10(ذالك لأننا بدأنا من 0x8)

مثال سوف يبسط الامر قليلاً انظ المداخل الاتيه

مدخل1 طوله 4جيجا(قسم كود) + مدخل2 طوله 4جيجا(قسم بيانات) مدخل طول 4جيجا(مخصص للمسخدم)

كيف اعرف رقم بدايه قسم المستخدم ؟ حسنناً

اولا انظر لدينا مدخلين قبل المدخل الذي نريد معرف رقمه طول كل واحد 4 جيجا لنحول كل واده إلي طول 8بت

4096 / 4 = 1024 إذا المدخل الاول يحتوي علي 4 اقسام بطول 8بت

كذالك المدخل الثاني

إذا رقم المدخل المطلوب = رقم المدخل الاول + طول المدخلين لاخرين بالنسبه طول 8بت

0x16 = 0x8 + 4 + 4

هل من اخطاء او من شخص يشرحها افضل وللعلم ان اكثر مبرمجي المنتدي يعملون في مجال برمجه الانظه لكن الكل يحاول إخفاء نفسه حتي لا يحبطه اد :P

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

0

شارك هذا الرد


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

ماذا هناك لم اجد رد :S واحد من مده هل هناك اخطاء ام انكم تنتظرون ان اضع الدرس القادم واما من محيرف فيجوال بيزك سيدخل

اخبوني إن كان هناك شئ

0

شارك هذا الرد


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

السلام عليكم

في الحقيقة يوجد مشكلة صغيرة وهي التعقيد :D

بعض الأمور تبدو غير منطقية

مثلا لم افهم لماذا 0x8 بالتحديد هل هي قاعدة من قواعد انتل ام هي استنتاج لم أنتبه له :wacko:

أو تعليمة القفز إلى السطر الموالي فهل من الممكن أن يقفز إلى غير السطر الموالي ؟؟؟

أمر غريب!!!

لدي طلب صغير في الحقيقة لم أفهم طريقة العنونة الجديدة

وشكرا

0

شارك هذا الرد


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

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

وهذه نسخه من كتاب انتل صحيح انها انجليزيه لكن حاول ان تقرأه

الجزء 1

الجزء 2

الجزء2-1

الجزء الثالث

الجزء 3-1

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

ونرجو إخبار مبرمجي الفيجوال بيزك سواء 6 او دوت نت لأنهم سوف يستخدم لغه وسط بين السي والفيجول ولكن الأكثريه للفيجوال

1

شارك هذا الرد


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

أخي halwa لقد حاولت قراءة الكتب من أيام فوجدتها معقدة :wacko: :wacko:

طبعا طريقة الكتابة سردية وليست في شكل درس .

على كل حال راودتني فكرة أرجو أن تعجب الجميع:

بما ان الأمور تتوجه نحو التعقيد لماذا لا نبسطها؟

-كيف؟

نقوم بصناعة ملفات ربط ديناميكية (dll.) تختصر التعقيدات(أو ملفات هيدر للسي أو bas للفيجوال بيسك.....)بحيث يستطيع المبرمجون المتخصصون في لغة معينة المساعدة بلغتهم المفضلة

إذا كان هذا الأمر مستحيلا مع بعض اللغات مثل جافا أو التي لا تدعم الأسمبلي يمكن صناعة نصف كومبايلر يعتمد على الnasm في تكوين الملف المطلوب

مثلا نستطيع انشاء ملف نصي يحتوي على لغة الأسمبلي امتداده asm ونقوم بتشغيل الملف nasm.exe وتمرير البارامترات اللازمة إذا وجد خطأ فإنه يتوقف ويخبرك به وإن لم يحدث خطأ فإنه يظهر رسالة تثبت نجاح العملية

أظن أن الأمر ليس مستحيلا وسهل أيضا

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

أرجو من أي شخص أن يقوم الفكرة (جيدة:لماذا/سيئة:لماذا)

وشكرا

0

شارك هذا الرد


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

يعني طليك ان اكمل وعند استخدام هذا الجدول ان اعطيك ما تريده فيه

0

شارك هذا الرد


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

اعتقد ان الفكرة غير سليمة "على حسب علمي فقط"

يا جماعة انتو فاهمين الموضوع سهل

هوا مش صعب و لا سهل

بس لازم نكون متفهمين عددة تفاط تتلخص في

-معرفة قدراتنا و امكانياتنا

-معرفة ما يواجهنا

نظام التشعيل ببساطة يتلخص في عدة سطور

هو برنامج "ضخم" يتعامل مع قدرات و امكانيات "المعالج" المجردة

يعني لا وجود للدوال او لمكتبات الوندز

بالاضافة الى الرام و باقي العتاد بواسطة الاسمبلي

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

و طبعا كل ما زادت الدوال و المكتبات زادت البرامج لسهولة البرمجة

و في ما يلي خطوات نظام التشغيل إلى ان يشغل برنامج معين:

ضغطنا على زر التشغيل بعد انا وصلنا الكهربا

يفتح الكمبيوتر و يقرأ البيوس و من ثمة يحمل القطاع الاول إلى الذاكرة ثم يسلمه دفة القيادة

يبدأ المعالج بتنفيذ تعليمات البووت و الذي يقوم بمهمة بسيطة جدا و هي رفع النواة الى الذاكرة

اما اذا كان يقوم ببعض الاختبارات فهي اضافات لا اكثر

تدخل النواة حيز التنفيذ و طبعا كل هذا الكلام في النمط الحقيقي يعني المقاطعات شغالة و شاشة سودة 25*80 للعرض

تبدأ النواة و تقوم اولا بتحميل باقي النظام اذا كان لم يحمل في الذاكرة

و تقوم في البداية بعمل GDT بالاضافة إلى جدول المقاطعات الخاصة بالنظام

بعد ذلك تقوم النواة بتشغيل الوضع المحمي

و طبعا هذا معناه لا مقاطعات لا شاشة عرض 25*80 و بداية العمل بIn & OUT

و التحكم المباشر في العتاد

طبعا يجب أن يكون نظام ادارة الذاكرة مجهز

وهذا اول نظام للادارة

بعد ذلك يكون معرف الاجهزة

و طبعا و ادارتها

و دا تاني نظام للادارة

و نظام ادارة الاجهزة يجب ان ينتبه لنقطة الديدلوك

بعد ذلك تجهز عمليات تعدد المهام

و كالعادة كل مهمة لها وقت و اسم و اولوية و و و الاشياء اللازمة

و طبعا اسمعها ادارة المهام و هذه ثالث ادارة

ادارة المهام تأخذ اكبر حيز لأنها تستخدم تقريبا كل انظمة الادارة السابقة

يأتي بعدها ادارة التطبيقات

و الذي يقوم بتحديد خصائص البرامج التي تحت التنفيذ

طبعا هذا كله إلى جانب ادارة الملفات الذي يعمل مع القرص الصلب

هذه فقط النواه .... تخيلو!!

طبعا و اللغة الرسمية هي تعليمات الاسمبلي او ما حول إليها

إلى جانب الواجهة و باقي الكمايات

بالاضافة إلى التقنيات الجدية التي ظهرت في المعالجات

كالوضع الافتراضي و تعدد النواة و و و

هذا هو نظام التشغيل ببساطة

هذا نظام متواضع بالتأكيد

يعني بجد الف ميل

و بالتوفيق :D

0

شارك هذا الرد


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

MAE :

أحسنت ، يبدو أنك مذاكر دروسك جيدًا ، والآن من فضلك دع الإخوة يعملوا في هدوء

0

شارك هذا الرد


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

أخي halwa أنا لم أفهم ملاحظتك

ياجماعة أنا لاأقصد إستخدام مكتبات الdll في النظام الجديد بل كأدوات مثل مانستعمل nasm أو virtuel pc أو قارئ القرص المرن الوهمي.

يمكن في لغة الباسكال مثلا كتابة سطور أسمبلي بكتابة asm ثم كود الأسمبلي ثم end; ولكل لغة طريقتها الخاصة وإن لم توجد فيكون الأمر بكتابة نصف كومبايلر كما شرح سابقا

كل هذا للإختصار فقط يعني عوض أن نكتب

	xor ax, ax
int 0x13

mov ax, 0x100 ; memory location to move data
mov es, ax
mov bx, 0
mov dl, 0
mov dh, 0 ; head
mov ch, 0; track
mov cl, 2 ; sector
mov al, 1 ; number of sectors to read
mov ah, 2
int 0x13

يمكن أن نكتب load_floppy(2,1(

ثم يعيدها البرنامج أو نصف الكومبايلر إلى وضعيتها الأصلية

وشكرا

0

شارك هذا الرد


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

لماذا تسبق الأحداث ****** كنت سأضعها بعد إعددادك للمترجمات اخ szerf(ما اسمك؟)

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

اولأ قم بتحميل البرنامج التالي اضغط هنا

قم بفتح البرنامج

خطوات التنصيب

***********

1- قم بالضغط علي زر next

2-سوف تظهر لك 3 أختيارات

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

الثاني سوف تستخدمه عندما تريد ان تقوم بتنزيله مع عدم التنصيب

الثالث إذا كنت تملك ملفاته وتريد التنصيب

سوف نختار الأول

3-اولأ قم بتحديد مكان التنصيب(من الأفضل ان تضعه في هذا الشكل X:\folder ولا تقوم بوضعه داخل مجلد program file داخل

الويندوز) ثم قم بأختيار النوع dos/text لأنه افضل ثم next

4-حدد مكان حفظ الملفات التي سوف يقوم بتحميلها ثم next

5-اختر نوع الأتصال الذي تريده ثم next سوف يقوم البرنامج بتحميل قائمه بالروابط التي يمكن التحميل منها

6-اختر احد الروابط واحفظ اسمها حتي يتسني لك امكانيه التحميل مع مراعاه انه لابد من وضع مكان حفظ الملفات الخاصه بالبرنامج ومكان

التنصيب كما كتبتهما اول مره ثم next سوف يقوم البرنامج بتحميل قائمه بالبرامج المتوفره

7-اولاً قم بالضغط علي كلمه devel سوف تظهر قائمه اضغط البرامج التاليه مره واحده

binutils:the gnu assembler

gcc-code:c compiler

gcc-g++:c++ compiler

اصغط اي اسم برنامج يبدأ ب gcc ويحتوي علي احدي الكلمتين c / c++

Make:the gnu version of the "make" utilliy

mingw-runtime

nasm:the netwide assembler

(ملحوظه لم اضع اسم البرنامج كاملاً)ولكي تتأكد من انه قد تم اختيار البرنامج سوف تري النص الذي علي يسار البرنامج يتغير إلي رقم كما في الصوره

ثم next ثم دعه يحمل ملفاته ثم انهي التنصيب كأي برنامج عادي

وسوف نحتاج نسخه من قرص وهمي لبرنامج الإقلاع GRUB

وها هي في المرفقات يوم واحد ابداً برمجه النواه ب يلغه السي /سي++ /free basic(توأم visual basic 6.0/don net هذا إذا ارد احد الأشتراك من المحترفين اي الذين يعملون بها من مده كبيره)

0

شارك هذا الرد


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

أخي أحمد اسمي هو أيمن الحكيم

أين المرفقات؟

0

شارك هذا الرد


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

:wacko: انا متأكد اني قد وضعت المرفقات

حسنناً محاوله اخري

post-58631-1216048923_thumb.jpg

Grub.rar

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

شارك هذا الرد


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

السلام عليكم

أخي halwa لماذا السي بالذات؟

وهل يمكن أن نبدأالدرس القادم لقد قمت بتنصيب الcygwin

وشكرا

0

شارك هذا الرد


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

يبدوا اننا قد بدأنا في الجد

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

اولاً قبل كل شئ سف نتعرف علي البرمجه المتفرقه بين لغه السي /سي++ والأسمبلي

سؤال بسيط جداً هناك امر مثلأ انا لا استطيع ان افعله بلغه السي /سي++ ويمكن تنفيذه عن طريق لغه الأسمبلي ماذا سأفعل وإن اكان العكس حيث ستكون كتابته ابسط بلغه السي/سي++ ؟

الجواب:-عليك بالبرمجه المترفقه وما هي البرمجه المتفرقه؟

الجواب:- هي طريق تسمح لنا بدمج كود للغه الأسمبلي داخل لغه السي

وكيف الطريق اليها؟

الجواب:- حسنناً سوف اخبرك ببعض الاشياء الخاصع بامترجم الذي تستعمله وهو gcc هذا المترجم إذا كتبت إسم لfunction مثل Hmain فإنه عند ترجمته يعدل الأسم إلي Hmain_ اما بالنسبه للمترجم nasm فإنها يبقيها كما هي

لماذا كل هذا ابدا في الشرح؟

حسناً لا نستعجل الأمور لكي يتم مناده داله او استخدام متغير او اي شئ لبد منت تحديد شيئين هما 1-نوع الشئ المتسخدم(متغير داله إلخ)

2-أسمه لاحظ الطريقه السابقه سوف تري انه يجب علينا التعديل في اسماء المتغيرات او الدوال حتي يتعرف البرنامج الرابط(هو البرنامج الذي يقوم بربط البرنامج مع بعضه)علي تلك الأسماء وكل التعديل سوف يحدث في ملف الأسمبلي وهذان الامران(2 للغه السي/سي++ و 2 للغه الاسمبلي)

الأسمبلي
[Global _name]
[Global name1]
[extern _name2]
[extern name2]

_name : اسم الداله او المتغير الذي سوف يتم تصديره إلي لغه السي
name1 : اسم الداله او المتغير الذي سوف يتم تصديره إلي لغه الاسمبلي
_name2 : إسم الملف الذي سوف يتم استيراده من لغه السي
name2 : إسم الملف الذي سوف يتم استيراده من لغه السى

السي /سي++
extern "C" type name;
extern type1 name1;

type name : اسم ونوع الدله او المتغير الذي سيتو تصديره إلي لغه السي او الاسمبلي
type1 name1: اسم ونوع الملف الذي سيتم استراده

نبداً الأن في الأمثله:

extern "C" int add(int num1,int num2);
int add(int num1,int num2)
{
return num1 + num2;
}
//////////////////////////////////assembly//////////////////////////////////////
[extern _add]
start:
mov ax,20
mov bx,10
push ax
push bx
call _add
add esp,8
jmp $

نلاحظ هنا اننا قمنا بدفع قيمه المسجل ax ثم bx اي المتغيرين num1 او num2 سيحول قيمه ax والاخر bx

حسنناً قيمه num2= قيمه المسجل ax قيمه num1=bx لان العمليه تسير بالعكس

//****************************************************************\\

اظنها بدايه بسيطه للبداء :D اي اسئله

0

شارك هذا الرد


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

ثانياً معرفه ملف الربط link.ld

ملف خاص يتم وضع فيه خصائص ربط الملفات ببعضها(الملفات المنتجه) حتي يتم إزاله الأسماء المصدره او المستورده من ملفات اخري انظر الجز الأول ويتم وضع بدل منها عنوان ذالك الاسم سواء إلسم داله او متغير او ثابت يتم استعمال ذاللك اللف من قبل البرنامج ld والذي يكون احد برامج الربط المرفقه مع gcc-code:c compiler

gcc-g++:c++ compiler وفائده هذا البرنامج تم شرحها من قبل حيث يزيل الاسماء المصدره والمستورده ويضع العناوين بدلاً من الاسماء ويتم إستخدام امر الربط في الشكل الاتي

ld -T x:/..../link.ld objcts

link.ld : مكان ملف الربط(ملحوظه عناوين الملفات بالنسبه لبرنام cygwin تكون ملقوبه كيف؟ مثلاً مسا الويندوز

إذا كتبته في مستكشف الويندوز يكون كالتالي c:\windows اما في برنامج cygwin يكون كالتالي

c:/windows اي ان الشرطه المائله يعكس اتجاهها)

objcts : اسماء الملفات المراد ربطها

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

شرح ملف link.ld من الداخل

[/size][size="3"]ENTRY(entry)[/size]

[size="3"]SECTIONS
{
. = 0x00100000;
code = .;

.text . : {
*(.text*)
}

.rdata . :
{ *(.rdata*) }
. = ALIGN(4096);


. = ALIGN(4096);
data = .;
.data . : {
*(.*data*)

}

bss = .;
.bss : {
*(COMMON)
*(.bss*)
. = ALIGN(4096);
*(.stack)
}
end = .; _end = .; __end = .;[/size]

[size="3"]/DISCARD/ :{
*(.note*)
*(.indent)
*(.comment)
*(.stab)
*(.stabstr)
}
}

ENTRY(entry) سيتخدم هذا الأمر لتحديد مكان بدايه البرنامج ولا يستطيع البرنامج الذي يربط معرفه عنوان

مكان بدايه البرنامج إلا إذا تم تصدير اسمه

. = 0x00100000; النقطه هنا هي متغير خاص حيث يتم تحديد عنوان البدء وقد تم تحديد عنوان البدء

ب0x100000

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

code = .; كلمه code هي اسم لمتغير او داله تم تصديرها وهذا المتغير او الداله المصدره عنوانه يبدء

من النقطه اي العنوان 0x100000

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

.text . : {

*(.text*)

} يتم تحديد مكان بدايه الكود والذي يسم بأسم text

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

. = ALIGN(4096); حيث يتم اضافه 4 جيجا إلي العنوان الحالي لبدء الفقره الجديده سواء بيانات اوغيرها

end = .; _end = .; __end = .; متغير خاص سوف يتم استيراده من احد الملفات (عندما نصل إلي

إداره الذاكره يشير إلي نهايه النواه

/DISCARD/ فقره تحتوي علي جميه الفقرات التي لا تحتاج إليها النواه

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

ارجوا ان اكون قد وفيت :wub:

0

شارك هذا الرد


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

بسم الله الرحمن الرحيم نبدأ في الجزء الثالث

اولاً لترجمه الملفات نستعمل الأمر التالي

Make -C x:/your sys folder -f makefile

حيث x:/your sys folder مسار كود النظام الخاص بك ولكن اظن ان عندك سؤال ما هو ال make file

حسنناً ال make file هول ملف يتم حفظ إعدادات الترجمه فيه حتي لا تتطر إلي ترجمه الملفات ملف ملف

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

post-58631-1216280397_thumb.jpeg

وهناك ملحوظه اخري قم بتحديد مكان نسخ النواه إلي القرص الوهمي بالبحث عن الأمر التالي واستبدال حرف a بإسم محرك الاقراص الوهمي لديك

post-58631-1216281181_thumb.jpg

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

قم بعمل ملف جديد بإسم boot.asm وقم بكتابه الكود التالي

%define MULTIBOOT_HEADER_MAGIC 0x1BADB002	  ; magic header
%define MULTIBOOT_HEADER_FLAGS 0x00010003
;; flags:
;; align to 4 kb
;; give us memory info
;; header contains address fields
%define MULTIBOOT_CHECKSUM -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
;; remember: sum of this field and the tow first fields must be zero


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; code section

SECTION .text
[BITS 32]

GLOBAL entry
entry:
jmp start
EXTERN code, bss, end, _kernelEnd
ALIGN 4
multiboot_header:
dd MULTIBOOT_HEADER_MAGIC
dd MULTIBOOT_HEADER_FLAGS
dd MULTIBOOT_CHECKSUM
dd multiboot_header
dd code
dd bss
dd end
dd entry

[EXTERN _Hmain]

start:
mov esp, stack
push ebx
push MULTIBOOT_HEADER_MAGIC
jmp _Hmain
jmp $

SECTION .stack
resb 0x10000
stack:

قم بحفظه بجانب ملف ال make file ولف الربط link.ld

قم بعمل لف جديد وسميه main.cpp

extern "C" void Hmain()
{
while(1);
}

الترجمه كما قلنا سابقاً بالنسبه للملف قم بالبحث عن كلمه link.ld واستبدلها بإسم ملف الربط وامتداده قم بالبحث في كامل الملف

الشرح قريب جداً إن شاء الله

make_file.rar

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

شارك هذا الرد


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

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

في البدايه يجب انا اشير إلي بعض الأمور اولاً لكي يتم التحميل من Grub والذي هو المحمل الاساسي لأنظمه اللينكس اولا لابد من توافر عده معلومات في اول حوالي 8كيلوبايت من النواه وتلك الملعوامت تحدد لبرنامج ل Gurb ما تحتاجه نواتنا من معلومات مثال نحن الأن نريد ان تعمل نواتنا في النمط السومي هناك بت سوف نقوم بجعله واحد وسوف يقوم بالتحويل لهاذا النمط قبل المرور إلي النمط المحمي

ويجب ان تحتوي تلك المعلومات علي كلمه سر خاصه بجروب في حاله لم يتم العثور عليها لن يتم التحميل من برنامج جروب

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

شرح ملف boot.asm

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

في البدايه تم تعريف MULTIBOOT_HEADER_MAGIC 0x1BADB002 وهذا التعريف يضم كلمه السر الخاصه بالمحمل Grub في حاله عدم وجوده لن يتم فتح نواتنا

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

%define MULTIBOOT_HEADER_FLAGS 0x00010003

;; flags:

;; align to 4 kb

;; give us memory info

;; header contains address fields

هذه هي المعلومات التي نوفرها لبرنامج Grub

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

%define MULTIBOOT_CHECKSUM -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)

البنيه التم سيتم تحميلها في جدول برنامج Grub

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

SECTION .text قسم الكود والذي يحدد مكان الكود في البرنامج ونرجو العوده إلي ملف الربط

[bITS 32] جعل البرنامج يعمل بنظام 32 بت

GLOBAL entry تصدير بدايه النواه حيث سيبدأ ستبدأ نواتنا التنفيذ من عندها

***********

EXTERN code, bss, end, _kernelEnd إستيراد بعض المعلومات التي سيحتاجها برنامج Grub

multiboot_header: جدول معلومات Grub

dd MULTIBOOT_HEADER_MAGIC كلمه السر الخاصه بGrub

dd MULTIBOOT_HEADER_FLAGS معلومات جروب

dd MULTIBOOT_CHECKSUM معلومات جروب + كلمه السر

dd multiboot_header بدايه هذا الجدول

dd code بدايه الكود حيث سيتم تحميل النواه إليها

dd bss بدايه المكدس

dd end نهايه النواه

dd entry عنوان مدخل النواه

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

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

[EXTERN _Hmain] إستيراد عنوان بدايه النواه ب سي ++/سي

mov esp, stack تحديد مكان المكدس

jmp _Hmain بدايه النواه الفعلي

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

SECTION .stack قسم المكدس

resb 0x10000 جعل مساحه من البيانات خاصه بالمكدس

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

extern "C" void Hmain() تصدير عنوان بدايه النواه ب سي++/سي

while(1); دوره غير نهائيه تهدف إل توقيف النواه

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

نأتي الأن إلي دور اختبار البرنامج

اولاً قم بفتح برنامج cygwin

قم بكتابه الأمر التالي

Make -C x:/your sys file -f makefile

x:/your sys file :مكان ملفات نظامك + الدريف الموجوده فيه

makfile : إسم ملف ال Makefile الذي ارفقناه سابقاً والموجود فيه تعليمات الترجمه والربط

ملحوظه يجب ان تقوم بفتح برنامج grub عن طريق برنامج القرص الوهمي

قم بالتجربه علي اي محاكي للأنظه

وللتأكد من نواتنا بدأت العمل يجب ملاحظه عده امور

1-ان جروب لا يعطي اي رساله بخطأ(وفي حاله وجود اي خطأ قم بوضعه في رد)

2-ان يتم مسح الشاشه(ربما يحدث لان نسخ برنامج جروب متعدده فمنها من يمسح الشاشه ومنها لا)

3-كتابه برنامج جروب معلومات النواه مثل عنوان التحميل والذي يكون موجود في ملف الربط

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

0

شارك هذا الرد


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

السلام عليكم

أخي halwa لقد انقطعت عن مشاهدة الموضوع بعض الأيام لظروف خاصة وفي الحقيقة أظن أن حالتي تشبه هذا-> :wacko: :wacko: :wacko:

أو بالأحرى :cry: للأسف أظن أن الأمور أصبحت أعقد من الأسمبلي :lol:

سؤال ينم عن الجهل:

ماذا يعني

extern "C" int add(int num1,int num2);

أنا أعرف انها متعلقة بدالة اسمها add ولكن "extern "C غير مفهومة ماذا يفعل حرف السي؟

وما معنى type1 name1 لم أر في أي لغة برمجة شيئا يدعى type1

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

أرجو أن تعطيني روابط لكتب سي /سي ++ مناسبة فأنا لست محترفا في هاتين اللغتين

وشكرا

0

شارك هذا الرد


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

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

type1 : نوع من انواع المتغيرات او الدوال

name1: اي اسم بحيث يكون اسم الداله او المتغير

وبالنسبه لعدم خبرتك : قلت في البدايه انه لا يجب ان تكون محترفاً في لغه السي/سي++ بل متقن الأساسيات اتقان شديد

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

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

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

ملحوظه الدرس الثالث لم ينتهي بعد فكل ما تم شرحه يعتبر الجزء الأول من الدرس الثالث

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

وهذا كتاب خاص للغه السي وانا افضله لانه افضل من الكتب العربيه الأخري

اضغط هنا لفتح صفحه التحميل

0

شارك هذا الرد


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

حرف السي خاص بمترجمات الـCpp حيث يدل على تصدير الإسم بصيغة مترجمات السي بدون عمل Mangling أو غيره للاسماء المصدّرة .

0

شارك هذا الرد


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

اما من نتائج لم يرد احد علي الموضوع من كبيره وانا انتظر هل اكمل الدروس ام لا

بالنسبه لدرس ال gdt فلقد قمت بإعداده مره اخري وسوف نستدمه هذه المره بلغه السي/سي++

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

ملحوظه:مهما بحث عن مصادر فلن تجد خير من هذا المصدر + الخوارزمي

اولاً لان لغتهم عربيه ثانياً لان معظم المصادر الاخري تتطلب محترفين للغه السي/سي++ ويعملون بها لمده لا تقل عن سنه

0

شارك هذا الرد


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

بالنسبه لدرس ال gdt فلقد قمت بإعداده مره اخري وسوف نستدمه هذه المره بلغه السي/سي++

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

ملحوظه:مهما بحث عن مصادر فلن تجد خير من هذا المصدر + الخوارزمي

اولاً لان لغتهم عربيه ثانياً لان معظم المصادر الاخري تتطلب محترفين للغه السي/سي++ ويعملون بها لمده لا تقل عن سنه

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

و الله انا لست محترف في لغة سي و اسمبلي لكن اود ان انوه انه مشروع العمر بالنسبة للعرب

ارجوا من ادارة المنتدى تزويد و تعيين عدد من المبرمجين الهامين في تسير هذا المشروع و تحديد جدول زمني و معنوي للانجاز هذا النظام الخاص بالعرب لانه راح يرفع من معنويات العرب و لو كان بسيط .

مع شكري لكل من ادى مشاركته في هذا الموضوع

ارجوا الاكمال فيه لانه بادرة جميلة و مشكورين عليها

0

شارك هذا الرد


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

السلام عليكم

أخي halwa في الحقيقة يرجع انخفاض الحماس الى عدم الفهم خاصة درس الgdt لما فيه من تعقيد والسبب في بطئ التواصل يعني انني اليوم اطرح سؤالا فأجد الإجابة في الغد أي أن الاجابة عن سؤال واحد يتطلب يوما كاملا يعني قد يستغرق صنع هذه النواة سنين :blink:

-ماهو الحل؟

يوجد حلان:

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

الإيجابيات: دعم من أعضاء المنتدى ومشاركتهم في الحلول

السلبيات:تضخم الموضوع وامتلاؤه بالتفاصيل الدقيقة غير المهمة مما يصعب قراءته لغير المتابعين له(مسلسل :D )

وإما أن نستعمل برامج chat مثل skype ثم نقوم بوضع الخلاصة في المنتدى ليستفيد منها بقية أعضاء المنتدى.

الإيجابيات:السرعة - احتواء الموضوع على ماقل و دل

السلبيات:صعوبة مشاركة بقية أعضاء المنتدى - وجود اسئلة عند بقية الأعضاء أو ملاحظات رغم وجود الخلاصة

اخ halwa انت اختر احد الحلين اذا لم تكن لديك فكرة افضل و إذا اخترت الحل الأول فعين الوقت كما تريد (غرينيتش)

المهم اننا يجب ان نعود إلى gdt لفهمه لأنه أصعب درس حتى الآن

وشكرا

0

شارك هذا الرد


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

حتى لو لم يرد أحد فهناك من إستفاد و لو الشيء القليل مثلي لأني مازلت مبتدأ .

ارجوا من ادارة المنتدى تزويد و تعيين عدد من المبرمجين الهامين في تسير هذا المشروع و تحديد جدول زمني و معنوي للانجاز هذا النظام الخاص بالعرب لانه راح يرفع من معنويات العرب و لو كان بسيط .

لاتنتظر من الإدارة شيء فهي ليست مؤسسة خاصة و كل الإخوة هنا هم مجرد متطوعين يفيدون و يستفيدون من يرد الإشتراك سيكون بمحض إرادته أيضا هناك من يظن بناء نظام تشغيل عربي سيكون مستحيل أو أنه سيأخذ على الأقل 3 - 5 سنوات فلا تأخذوا بأقولهم و إستعينوا بالله على إكمال مشروعكم ففي مرحلة ستجيدون الإقبال كبير إن شاء الله .

1

شارك هذا الرد


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

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

حسنناً بالنسبه لطريقه التي اريدها هي المشاكل تعرض عن طريق برنامج المحادثه والدرس يوضع في المنتدي ويكون توقيت برنامج المحادثه 9:00 بتوقيت جرينتش تقريباً

*****************بالنسبه لطلب إعاده شرح جدول ال Gdt حسننأ انظر اسفل*********************

في البدايه ماهو النمط المحمي:

النمط المحمي نمط تعدد في اقسمام الذاكره كما حددها مبرمج النظام كل قسم يمتلك درجه حمايه مختلفه عن الأخر فقسم النظام له اعلي درجه حمايه حيث لا يستطيع اي برنامج يعمل التعدي في بيانات النظام من هنا اتت كلمه النمط المحمي حيث يتم حمايه نظام التشغيل الموجود في الذاكره ويتم حمايته بعد تحديد النظام للمعالج اي قسم هوه موجود فيه ويتم الولوج(اي جلب البيانات او تنفيذ شفره) عن طريق النظام الأتي محدد القسم:مكان البيانات او الشفره هذا خلاف النمط الحقيقي الذي يجلب البيانات عن طريق الشكل الأتي القسم:البيانات او الشفره .

ما متطلبت المرور إلي هذا النمط:

لكي يتم المرور إلي هذا النمط لابد من توافر شرطين 1-جدول التقسم او جدول المداخل او جدول المواصفات العام 2- البت pe في مسجل التحكم CR0 يساوي واحد معناه تفعيل النمط المحمي

قلت انه لابد من توافر جدول المداخل او جدول الاقسام ولكن ما هو:

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

لم أفهم بعد:

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

post-58631-1216902239_thumb.jpeg

ماذا بعد عن هذا الجدول

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

pop eax

معناه اخرج 32 بت من المكدس *** حيث سيتم تحديد طريقةالبرنامج في جلب البيانات هل هي بطول 32 بت كما رأينا ام بطول 16 بت إذا قمت بجعلها 16 بت في قسم النظام وانت تستخدم نواه مصنوعه ب سي/سي++ فهاذا معناه خطأ لأان السي /سي++ تجلب البيانات بطول 32بت

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

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

اظن انه قد حان الوقت للبدأ في كتابه جدولنا الخاص

اولاً كيف اخبر المعالج بمكان تواجد الجدول:

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

فمكان الجدول تحدد للمعالج مكان بدء البحث عن بيانات القسم الذي يحاول البرنامج الولوج

إليه + معلومات القسم الذي يعمل في البرنامج

سؤال بسيط هل سيستمر المعالج في البحث ربما يبحث في بيانات غير بيانات الجدول

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

سؤال اخر كيف سأخبر المعالج بهذه البيانات

عن طريق التعليمه Lgdt [gdt] حيث lgdt عنوان المعلومتين السابقتين

سؤال اخر ما هو تكوين بيانات القسم(اي المعلومات التي تحدد درجه حمايته ....إلخ)؟

حسننأ تتكون تلك المعلومات من الاتب

البتات 
من إلي : الوصف
0 15 : يتم تحديد فيها طول القسم كاملاً وطريق الحساب ذكرها الأخ حكيم
16 31 : يتم فيها تحديد وضع قيمها يحتاجه المعالج عن التحويل من العنوان الخطي إلي
محدد القسم:مكان البيانات وذالك لان نواه السي بلس بلس او السي تكتب العنوان الخطي
نضعها بالقيمه صفر حتي لا شير إلي بيانات اخري
32 39 :نفس السابق
40 44 :نوع القسم طولها اربع بيتات كل بت يمتلك صلاحيه معينه مدرجه بلأسفل
اولاً صلاحيات اقسام البيانات
0000 تعني انه للقرأه فقط
0001 للقرأه ويمكن الوصول إلي معلوماته
0010 للقرأه والكتابه
0011 للقرأه والكتابه ويمكن الوصول إليه
0100 للقرأه فقط
0101للقرأه ويمكن الوصول
0110 قرأه وكتابه
0111 للقرأه والكتابه ويمكن الوصول
اقسام الشيفره
1000 للتنفيذ فقط
1001 للتنفيذ فقط ويمكن الوصول
1010 للتنفيذ والقرأه
1011 للتنفيذ والقرأه وإمكانيه الوصول
44 44 : قسم نظام 1=نعم 0 =لا وفي حالتنا سنضع نعم
45 46 :درجه الحمايه 0 تعني انها درجه حمايه للنظام
1 تعني درجه حمايه لخدمات النظام
2 " " " " "
3 درجه حمايه البرامج
47 47 :هل القسم موجود في الذاكره ام انه في ذاكره وهميه ربما تكون علي القرص الصلب 1 =نعم
48 51:اخر رقم في الطول (اي طول القسم)
52 52 :محجوز لمعالج 64 بت
53 53 : " " " "
54 54: طريقه جلب البيانات 1 تعني بطريقه 32بت و 0 تعني 16
55 55 : البت الذي يحدد طريقه حساب الحجم
56 63 :نفس البيتات من 16 إلي 31

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

سؤال كيف اكتب الجدول الان

هنا الان مثال لطريقه كتابه الجدول وحاول مقارنته مع السابق

dw  0,0,0,0
db 0xFF,0xFF,0,0,0,10011011b,11011111b;limit(0:15),limit(0:15),base(16:31),base(32:39),base(56:63),47 46 45 44 43 42 41 40,55,54,53,52,51,50,49,48,base(65:63)
قمت بوضع ترتيب البيتات حتي تكون مثله

قمت بإعداد جدولي وتحميل كيف امر إلي النمط المحمي

كما قلنا من قبل عن طريق جعل البت pe = 1 اي تفيعل النمط المحمي

مثال
mov eax,CR0
or al,1
mov CR0,eax

كيف اشغل النواه(كيف احسب محدد القسم)

اولاً احضر رقم ترتيب المدخل (مثلا انت في جدولك كتبت 10 مداخل ونواتك في المدخل رقم 10 فالرقم 10 هو المقصود) ثم حول للبيناري = 1010 اضف من جه اليمين 0 إضافيه ثم احضر درجه افضليه القسم وحولها للبيناري = 00 اضفها لليمين في النهايه البيتات = 1010000 هكذا هي بيتات

محدد القسم بالتحويل إلي الهكس = 0x50

نرجوا ان نكون قد وفينا هذه المره في الشرح اي استفسار :lol:

-1

شارك هذا الرد


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

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

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



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

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

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