• 0
szerf

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

سؤال

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

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

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

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

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

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

ولكن...

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

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

هذا صحيح

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

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

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

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

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

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

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

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

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

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

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

boot.zip

0

شارك هذا الرد


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

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

  • 0

بالنسبه للمقاطعات اخي sife يوجد موقع صحيح اجنبي لكن يحتوي علي كافه المقاطعات

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

رابط الموقع

http://www.ctyme.com/intr/int.htm

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

شارك هذا الرد


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

أخي 852147 مرحبا بك :lol:

طبعا تستطيع المشاركة

أود ان انوه أن تعلم لغة الassembly ليس صعبا ولكنها لاتشبه لغات البرمجة المعتادة

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

0

شارك هذا الرد


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

اعرف انه قد طال انتظاركم ولكنه كن بسبب عدم إخباري عن نتائجكم بسم الله فلنبدأ

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

النمط الحقيقي

:ظهر لأول مره مع معالجات 8086

عيوبه:

- لا يستطيع الولوج(جلب المعلومات من)إلي اكثر من 1 ميجا بايت فماذا إذا كان حجم البرنامج اكبر بكثير

- لا يستطيع تشغيل اكثر من برنامج في نفس الوقت

-لا يحتوي علي مميزات إضافيه(مثل الذتكره الوهميه)

مميزاته:

- سهولته الكبيره بسبب استخدام المقاطعات الخاصه بالبيوس

-يمكن التحويل منه إلي اي نمط أخر

طرق العنوانه(اي طرق جلب المعلوت)

مكان المعلومات(العنوان): القسم

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

لأن اكثر من (عنوان:قسم) يشيرون إلي مكان واحد مثل

0000:07c0 07c0:0000 02c0:3000 وهذا قد يسبب الكتابه علي برامجك إذا حملتها إلي الذاكره

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

النمط المحمي:

ظهر لأول مره مع معالجات 80286 واستمر في الظهور مع معالجات 32 بت

عيوبه

السهوله التي كانت في النمط الحقيقي ازيلت هنا(البيوس)

مميزاته لا تحصي

طرق العنوانه

العنوان:محدد القسم

تلاحظ اننا قلنا محدد القسم وليس القسم ذالك لانه لا يمكن الولوج إلي المعلومات مباشره بل يقوم المعالج بالولج إلي البيانات عن طريق جدول يسمي(تذكر هذا الاسم جيداً) جدول المواصفات العام GDT كل مدخل في هذا الجدول يشير إلي مكان في الذاكره وكل مدخل يحتوي علي معلومات هذا المكان مثل طوله(اقصي طول 4 جيجابايت إنظر إلي الحجم الكبير من 1ميجا إلي 4جيجا)

1.bmp

جدول المواصفات العام

2.bmp

limit : يحدد طول القسم كاملاً علي 20 بت وقد تم تقسيمه علي قسمين الجزء الاول من صفر : 15 والثاني من 48 : 51 طبعاً الطول سوف يكون محسوب ب الكيلوبايت وليس بلجيجا ولكن بوضع البت G ب 1 سوف يحسب الطول ب الجيجابايت

base: يحدد عنوان القسم علي 32 بت وقد تم تفرقته ايضاً انظر الصوره للتعرف علي اماكنها

type: يحدد نوع القسم سواء بيانات(المكدس + الجمل + إلخ) او كود وللتسهيل قم بوضع 1011 بالنسبه لأقسام الشفره و 0011 لأقسام البيانات

S-system: إذا وضع هذا البت ب 0 فمعناه ان هذا القسم خاص بالنظام وإذا وضع 1 معناه ان هذا القسم عادي

dpl:يحدد درجه افضليته 0 تعني اعلي درجه 3 تعني أقل درجه وما بينهما يترتب في الأفضيله

لايمكن لبرنامج يعمل في درجه افضليه اقل الولوج إلي درجه افضليه اعلي

p: إذا وضع هذا القسم ب 1 فمعناه ان القسم موجود في الذاكره 0 تعني العكس هذا البت مهم عند العمل مع الذاكره الوهميه

avl:ضع فيه ماتشاء

d/b : إذا كان قسم خاص بـبـيانات 32بت فيتم وضع هذا البت ب1 وإذا كان خاص ب16بت فيتم وضعه ب0

G:إذا تم وضعه ب1 فمعناه ان الطول محسوب بجيجا بايت و0 تعني بالكيلو(اقص طول للكيول 64كيلو)

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

تمرين اصنع مدخل لقسم بيانت من سعه 32 بت طول 4جيجا يتوفر علي اعلي درجه حمايه

3.bmp

اولأ نضع طول القسم نضع اولاً البيتات من 0:15 ثم بعدهما البيايت من 16:19

2- البيتات الخاص بbase

3- ثم p

4-ثم dpl

5-s

6-type

7-g

8-d/b

9-L

10-طول القسم من 16 إلي 19 عن طريق نظام bainry وليس السداسي

11-نهايه القسم بوضع صفر

فيصبح في النهايه

0xff,0xff,0,0,0,0011011b,11011111b,0

ولحديث بقيه

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

الواجب :D صنع 5 مداخل مختلفه

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

0

شارك هذا الرد


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

الصراحة عمرى ما توقعت ان ارى مثل هذه النتائج

اول مرة احس انه فى شغل :):)

بالتوفيق وان شاء الله تصلوا لما تريدون

0

شارك هذا الرد


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

أخي halwa شكرا لمجهودك.

ولكن في الحقيقة لم أفهم الدرس جيدا.

عندي بعض الأسئلة:

-بالنسبة للlimit والbase كيف يمكن حساب القطع المتفرقة أهو بالضرب أم بتقنية low/high مثل مسجلات المعالج أو بطريقة أخرى؟

-أين يوضع البتان 22:23 التابعان للbase؟

-ما المفترض أن يكون في القسم L؟

-بالنسبة للقسم p: هل يمكن أن يكون هناك قسم خارج الذاكرة؟ :huh:

-هل من المفروض استعمال هذا النظام(GDT) أم أنه محبذ فقط؟

وشكرا

0

شارك هذا الرد


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

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

0

شارك هذا الرد


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

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

المهم فقط هو فهم تكوينك للمداخل علي غرار المثال السابق

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

الاخ szerf

السؤال الاول لم أفهمه

بالنسبه للسؤال الثاني الخاص بب base

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

cs,es,ds,fs,gs,ss

المسجل cs يحدد مكان الكون(انت من يحدد وليس المسجل عن طريق عمليات القفز) ام المسجلات الأخري فتحدد مكان البيانات

القسم L يساوي صفر

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

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

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

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

سيضطر إلي إعاده التشغيل كل مره هذا مجرد مثال

بالنبسه للنمط المحمي لم نكمله بعد

المهم ان تفهم كيفيه تكوين المداخل

0

شارك هذا الرد


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

السلام عليكم

أخي أحمد لقد تمت العملة بنجاح ولي سؤال كيفة يمكن عرض الرسالة في الشاشة بالعربية بدلا من الإنجليزية؟

أخي 852147 كما قال لك الأخ حكيم الهدف من المشروع هو هدف تعليمي وليس تجاري ونريد معرفة كيف يتم بناء نظام التشغيل وإن كنت قادرا على مد يد العون في تقديم ما ينتفع به غيرك في هذا المجال فنحن ننتظر منك المشاركة.

الإجابة وبشئ من التفصيل تجدها في صفحة دعم العربية علي موقع الرباط هنا :

http://alrebat.tadwen.com/index.php?title=...%A8%D9%8A%D8%A9

أتمني أيها الإخوة أن تحرصوا علي تدوين ما تصلون إليه سواء من شروحات بسيطة أو دروس مطولة في موقع الرباط http://alrebat.tadwen.com حتي يكون مرجعًا للمستقبل.

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

شارك هذا الرد


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

أخي halwa معك حق السؤال الأول لم يكن واضحا :S

في الحقيقة أنا أردت أن أعرف كيف يتم حساب الbase والlimit يعني في النمط الحقيقي عندما نقول العنوان 0022:0587 يعني 22*10+587=807

ربما تساعدني إذا أعطيتني حل هذا التمرين:

اصنع مدخل لقسم بيانت من سعه 32 بت طول 220 ميجا يبعد عن بداية الذاكرة الحقيقية ب 250 كيلوبايت(يعني 3E80:0000 بالنمط الحقيقي) يتوفر علي اعلي درجه حمايه

وأنا متأكد أن الدرس الموالي سيوضح الغموض

وشكرا

1

شارك هذا الرد


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

الإجابة وبشئ من التفصيل تجدها في صفحة دعم العربية علي موقع الرباط هنا :

http://alrebat.tadwen.com/index.php?title=...%A8%D9%8A%D8%A9

جزاك الله خيرا أخي د.عمر

أخي halwa معك حق السؤال الأول لم يكن واضحا :S

في الحقيقة أنا أردت أن أعرف كيف يتم حساب الbase والlimit يعني في النمط الحقيقي عندما نقول العنوان 0022:0587 يعني 22*10+587=807

ربما تساعدني إذا أعطيتني حل هذا التمرين:

اصنع مدخل لقسم بيانت من سعه 32 بت طول 220 ميجا يبعد عن بداية الذاكرة الحقيقية ب 250 كيلوبايت(يعني 3E80:0000 بالنمط الحقيقي) يتوفر علي اعلي درجه حمايه

وأنا متأكد أن الدرس الموالي سيوضح الغموض

وشكرا

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

للفهم رحلى إلى الإعماق

منتظرين بقية الدروس لعلنا نفهم أكثر

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

شارك هذا الرد


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

اخ szerf اهنائك لأن حسبتك 100% صح لكن في شويه امور

1- لازم تخلي البت G 0 حتي يتم حسابها بالكيلو ولازم يكون يكون اكبر حجم 64 كيلو لو حبيت تكتب مدخل حجمه زي ما بتقول 250 ميجا مثلاً لازم تقسم الحجم ده علي اكتر من مدخل

2-في حل تاني انك تخلي البت G=1 وبدل ما تخلي الطول 4جيجا تخليه زي ما انته عايز

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

اخ hatem الموضوع الي انته حطيطه مفيد جداً بس ده وصف مبدئي بصوف الشكل من الخارج ولم يدخل في الامور من الداخل مثل كيفيه التبديل إلي النمط المحمي او ما الامور الازم للدخول إليه

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

لن اكمل درس حتي اتأكد من السابق انه مفوم 100% :D

0

شارك هذا الرد


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

أخي halwa المشكلة هي أنني لاأعرف كيف أعدل الطول على 4G أو 3G أو أي قيمة أخرى

لم أفهم طريقة ترتيب الأرقام بحيث تشير إلى القيمة المطلوبة

المثال الذي قدمته كان بطول 4G وبما أن القيمة القصوى هي 4G كان من الطبيعي أن تملأ جميع أقسام الlimit بأقصى قيمة ولكن للأسف هدا جعلني لا أدرك كيفية حساب الطول

أظن أن مشكلتي توضحت

آسف على الأسئلة الكثيرة

أرجو أن تكمل الدرس (90% فهم كافي للإنتقال للدرس الموالي ;) )

وشكرا

0

شارك هذا الرد


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

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

0x0f,0xf9,0,0,0,1011011b,11011111b,0

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

الطريقه التي اتبعتها في حساب الطول

افتح الاله الاحسبه المرفق مع الويندوز من قائمه view اختر scientific ستغير شكهل الاله الحاسبه

اضغط كلمه hex

ثم اكتب ffff=4 جيجا

مثلاً انت تريد الحجم 250 ميجا اضغط علامه الشرطه المائله /

ثم الرقم 6 فيصبح الحجم المكتوب امامك طبعاً بنظام hex وليس الارقام العاديه = 512 ميجا

ثم اضغط علامه الطرح(الرقم 262 = بالهكس 106)ثم الرقم 106 يصبح الحجم لديك 250 ميجا تقريباً

0xffff = 64 كيلو بايت وبوضع البت G = 1 يصبح الحجم 4 جيجا اي ان المثال السابق شبه صحيح

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

ولماذا تريد تصغير الحجم ام انها لعلم فقط ؟

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

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

شارك هذا الرد


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

السلام عليكم

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

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

0

شارك هذا الرد


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

في الحقيقة أخي halwa بعد تحليل مطول لكيفية مساواة القيمة ffff ل4G وصلت إلى الإستنتاج التالي:

إذا كان G=1 فإن كل قيمة في base أو limit يتم حسابها بهذه الطريقة: (القيمة+1)*64 كيلوبايت

(ffff+1) *64

أي h10000*64kb

أي 65536*64kb

أي 4194304kb

أي 4096mb

أي 4Gb

بنفس الطريقة وصلت إلى أن 250mb قيمتها هي f9f

ولكنني لم أفهم أين أضع هذه القيمة بالضبط(أرجو الشرح)

وأيضا لم أفهم كيف يكون حل المسألة ب8 برامترات فقط يعني على الأقل 10 إذا لم نحسب الإنقسامات في الbase و الlimit وحينها يجب أن يكون 13 بارامترا

أرجو منك التوضيح(خطوة خطوة) لكيفية حل المسألة وماذا تمثل البارامترات الثمانية وكيف يمكننا ترجمتها إلى gdt يتكون من 64 بت(دائما العدد 64 يلازمنا :D )

وشكرا

0

شارك هذا الرد


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

موضوع شيق و انا كانت لي محاولة أحب ان أضعها بين يدكم الكود التالي للـGDT و اذا اردتم بامكاني وضع الباقي

/*---dt.h---
we're make DataStruct for descriptor table in all kind
-----------*/

#ifndef _descriptor_H
#define _descriptor_H
#define MAXIDT_entry 256
#define MAXGDT_entry 1024
/*--بينة جدول الواصفات--*/
/*--Datastruct of GDT--*/
typedef struct _GDT
{
unsigned short segsize1;
unsigned short base_addr1;
unsigned char base_addr2;
unsigned char s_type:5;
unsigned char dpl_p:3;
unsigned char segsize2:4;
unsigned char avl:1;
unsigned char resv:1;
unsigned char db_g:2;
unsigned char base_addr3;
}GDT;
/*--بينة جدول المقاطعات او المطبات على حسب--*/
/*--Datastruct of IDT--*/
typedef struct _IDT
{
unsigned short offset1;
unsigned short segment;
unsigned char resv:5;
unsigned char int_trap:3;
unsigned char type:5;
unsigned char dpl:2;
unsigned char p:1;
unsigned short offset2;
}IDT;
/*--مسجل جدول الواصفات--*/
/*--Register of GDT--*/
typedef struct _selector {
unsigned short limt;
unsigned long address;
}SELECTOR_DT;
/*الدوال*/
/*--some function--*/
/*--GDT--*/
void gdt_setup(void);
void init_kernel(void);
void request_GDT(short ,long ,long ,char ,char ,char );
void release_GDT(short );
/*--IDT--*/
void IDT_setup();
void setExHandler(char ,int ,char);
void ExHandler_setup(void);
/*//-------exception function-----*/
void EX0(void);
void EX1(void);
void EX2(void);
void EX3(void);
void EX4(void);
void EX5(void);
void EX6(void);
void EX7(void);
void EX8(void);
void EX9(void);
void EX10(void);
void EX11(void);
void EX12(void);
void EX13(void);
void EX14(void);
void EX15(void);
void EX16(void);
void EX17(void);
void EX18(void);
/*---------------------------*/
extern void setSCHandler(char ,int ,char );/*--For Int--*/
#endif

/*---gdt.c---
-----------*/
#include "sys\dt.h"
#define m_value(num) num=(num>>8)
#define h_value(num) num=(num>>16)
GDT gdt[MAXGDT_entry];
/*----------------*/
void GDT_setup(void) {
SELECTOR_DT GDTR;
GDTR.limt=sizeof(GDT) * MAXGDT_entry-1;
GDTR.address=(long)&gdt;
asm volatile ("lgdt %0" :: "m"(GDTR));
}
/*----------------*/
void init_GDT(void) {
request_GDT(0,0,0,0,0,0);
request_GDT(1,0xfffff,0,0x1a,1,0x11);
request_GDT(2,0xfffff,0,0x12,1,0x11);
request_GDT(3,0xfffff,0,0x12,1,0x11);

request_GDT(4,0xfffff,0,0x1a,0x31,0x11);
request_GDT(5,0xfffff,0,0x12,0x31,0x11);
request_GDT(6,0xfffff,0,0x12,0x31,0x11);

request_GDT(7,0xfffff,0,0x10,0x21,0x11);

GDT_setup();
}
/*----------------*/
void request_GDT(short selector;long size,long base,char s_type,char dpl_p,char db_g,) {
if(selector < 8 || selector > 1023 || size > 0xfffff || base > 0xffffffff ||
db_g > 0x11 || dpl_p > 0x31 || s_style > 0x1f)
return;
else if (gdt[selector].dpl_p < 1)
return;
else {
gdt[selector].segsize1 = (size & 0xffff);
gdt[selector].segsize2 = (size>>16) & 0xf;
gdt[selector].base_addr1 = base & 0xffff;
gdt[selector].base_addr2 = (base>>16) & 0xff;
gdt[selector].base_addr3 = (base>>24) & 0xff;
gdt[selector].s_type = s_type & 0xff;
gdt[selector].dpl_p = dpl_p & 0xff;
gdt[selector].db_g = db_g & 0xff;
gdt[selector].avl = 0;
gdt[selector].resv = 0;
}
}
/*---------------*/
void release_GDT(short selector) {
if (selector < 8 || selector > 1023)
return;
else
gdt[selector].dpl_p=0;
}

0

شارك هذا الرد


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

أهلا بك أخي MAE هل بالإمكان أن تشرح لنا النمط المحمي بالتفصيل وجزاك الله خيرا

0

شارك هذا الرد


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

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

أي أن يعمل كل برنامج على حده بدون أن يتدخل في ذاكرة البرنامج الآخر

و هذه الخاصية هامة جدا لتعدد المهام

للمزيد من المعلومات المفصلة الرجاء قراءة صفحة المعلومات لمعالجات الـ 32

0

شارك هذا الرد


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

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

0

شارك هذا الرد


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

السلام عليكم .

نظام الـGDT موجود لتدعيم الـSegments في معالجات x86 , كما تعرفون في هذا النوع من المعالجات لدينا 6 مسجلات اقسام هم كالتالي :

cs : مسجل قسم الكود Code Segment .

ds : مسجل قسم البيانات Data Segment .

es : مسجل اضافي Extra Segment .

ss : مسجل قسم المكدس Stack Segment .

gs : مسجل لاغراض اخرى .

fs : مسجل لاغراض اخرى ( في أنظمة الـNT يستخدم ليشير الى بلوك الـKPRCB في الكرنل مود و الى TEB في اليوزر مود :lol: ) .

المهم ... يجب ان يشير كل مسجل منهم الى مدخل للـ GDT أو يسمى بالـSegment Descriptor .

طيب كيف نتعامل مع الـGDT ؟؟ يعني كيف نقوم بوضع جدول للـGDT خاص بنا ؟

يمكن فعل ذلك عن طريق مسجل خاص يسمى GDTR لكن لا يمكننا التعامل معه مباشرة بل باستخدام أحد التعليمتين : SGDT/LGDT .

GDTR يتكون من 6 بايتات , أول WORD تحتوي على الـlimit او طول الـSegment Descriptors .

يليها DWORD يشير الى مصفوفة من الـSegment Descriptors , باختصار تركيب الـGDTR كالتالي :

انسخ الكود
  1. [color= #0000ff;]struct[/color] _GDT [color= #000000;]{[/color]
  2. WORD wLimit;
  3. PKGDTENTRY Base;
  4. [color= #000000;]}[/color]GDT, [color= #000000;]*[/color]PGDT;
  5.  

كما تلاحظون فإن Base عبارة عن مؤشر الى مصفوفة من الـSegment Descriptor او ما اسميناه بـKGDTENTRY تركيبها كما توضح الصورة :

segmentdescriptorox7.png

وهذا هو التركيب ككود مع بعض التسهيلات لتفصيص الـFlags بشكل أفضل :

انسخ الكود
  1. [color= #0000ff;]struct[/color] _KGDTENTRY [color= #000000;]{[/color]
  2. USHORT LimitLow;
  3. USHORT BaseLow;
  4. [color= #0000ff;]union[/color] [color= #000000;]{[/color]
  5. [color= #0000ff;]struct[/color] [color= #000000;]{[/color]
  6. UCHAR BaseMid;
  7. UCHAR Flags1;
  8. UCHAR Flags2;
  9. UCHAR BaseHi;
  10. [color= #000000;]}[/color] Bytes;
  11. [color= #0000ff;]struct[/color] [color= #000000;]{[/color]
  12. ULONG BaseMid [color= #000000;]:[/color] [color= #000000;]8[/color];
  13. ULONG Type [color= #000000;]:[/color] [color= #000000;]5[/color];
  14. ULONG Dpl [color= #000000;]:[/color] [color= #000000;]2[/color];
  15. ULONG Pres [color= #000000;]:[/color] [color= #000000;]1[/color];
  16. ULONG LimitHi [color= #000000;]:[/color] [color= #000000;]4[/color];
  17. ULONG Sys [color= #000000;]:[/color] [color= #000000;]1[/color];
  18. ULONG Reserved_0 [color= #000000;]:[/color] [color= #000000;]1[/color];
  19. ULONG Default_Big [color= #000000;]:[/color] [color= #000000;]1[/color];
  20. ULONG Granularity [color= #000000;]:[/color] [color= #000000;]1[/color];
  21. ULONG BaseHi [color= #000000;]:[/color] [color= #000000;]8[/color];
  22. [color= #000000;]}[/color] Bits;
  23. [color= #000000;]}[/color] HighWord;
  24. [color= #000000;]}[/color] KGDTENTRY, [color= #000000;]*[/color]PKGDTENTRY;
  25.  

التعليمة SGDT تأخذ عنوان لـGDT فتقوم بملأها بالحجم ومؤشر الـSegment Descriptor .

أما LGDT فتقوم بالعكس حيث تعطيها مؤشر لـGDT به الحجم ومؤشر لمصفوفة الـSegment Descriptor وتقوم هي بشحن مسجل الـGDTR بهم .

-----------------

نصيحة مني أن تقوموا بقراءة الـDocumentation الخاص بمعالجات انتل بتأني فستجدون بها ما تريدون واكثر .

Volume 3A: System Programming Guide

Volume 3B: System Programming Guide

0

شارك هذا الرد


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

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

شكراً لقد افدتنا

حسب ما فهتم من طلبك انك تريد فهم كيفيه تكوين المدخل من الصفر

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

شكراً اخ MAE ولكن الا تري انه لم يحن وقت ال c/c++ بعد فنحن مازلنا في مرحله الاسمبلي

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

اولاً لك يتم بناء مدخل يجب تحديد عدة امور

1-طول المدخل(طريقه الحساب وضعها الاخszerf وله الشكر الجزيل بذالك)

2-نوع المدخل

3-هل المدخل خاص بانظام ام لا(0 = خاص بالنظام)

4-درجه افضليه القسم(0= اعل درجه 3=اقل درجه)(درجه الافضليه تحدد للبرنامج ما إذا كان مسموح له بجلب البيانات من القسم كذا

5-هل القسم سوف يكون موجود في الذاكره الحقيقه ام الوهميه

6-هل هذا الكود لبيانات من طول 16بت ام 32بت(1=32 بت)

7-كيفيه حساب طول المدخل(بكيلو ام بالميجا(1=باميجا))

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

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

1-وضع الطول(عندي سؤال كيف اضع الطول؟)

اولاً عليك بوضع البيتات الخاصه بالطول من 0 إلي 15 (مثلاً انها تساوي 0xfff)

ثانياً وضع البيتات الخاصه بالطول من 48 إلي 51 (مثلاً انها تساوي 0xe)

اي ان الطول في النهايه سوف يساوي 0xfffe

بالنسبه للأخ szerf القيمه التي طلبت ان اضعها ستكون كالأتي 0xf9f0

2-وضع قيمه base والتي تكون صفر(لانك من تحدد العنوان عن طريق المسجلات وعن طريق نوع المدخل)

(تحدد قيم المسجلات(es ds ss fs gs)إذا كتبت ان هذا القسم)

(خاص بالبيانات(cs)إذا كان خاص بالكود)

3-نضع البت الخاص بحاله المدخل هل هو موجود ام لا(البتp)

4-نضع درجه الافضليه(البيتات dpl)

5-نضع البيتات الخاصه بنوع القسم اهو خاص بالنظام ام لا(البت S)

6-نوع المدخل(البتات type)

7-نضع البت الخاص بطريقه حساب الطول( البت G)

8-حجم البيانات الموجود بالمدخل(D/b)

9-نضع البتات من 52 إلي 54

10-البتات الخاصه بالطول من 48 إلي 51

لاحظ الشرح والمثال السابق

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

الجزء الثاني

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

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

2-صلاحيه النظام في العمل لانه ليس برنامج بل نظام كامل اي يجب تكون له كافه الصلاحيات

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

جدول GDT :

هو جدول يتم وصف الذاكره فيه ويت تحديد صلاحيات الاقسام

يتكون هذا الجدول من قسمين

1-مكان البيانات التي تصف الجدول

2-طول تلك البيانات

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

كيفيه المرور إلي النمط المحمي عن طريق جعل البت pe الموجود في المسجل(مسجل التحكم الموجود في البروسيسور)CR0 = 1

MOV EAX,CR0 
or al,1
MOV CR0,EAX

ما المفترض عمله بعد المرور إلي النمط المحمي

1-تحديد الاقسام عن طريق تحميل المسجلا es ds ss fs gs برقم محدد القسم(0x10)

2-تحديد قسم الكود عن طريق عمليه القفزإلي العنوان(0x8 :0x1000)حيث 0x10000 هو العنوان الخطي لبدايه النواه

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

المثال

حمل الملف المرفق

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

سوف يتم شرح طريقه عملها في الجزء القادم كتابه النواه بسي /سي++

وتحميل النواه بواسطهGrub وترك المحمل البدائي الذي قمنا بعمله

tut.rar

0

شارك هذا الرد


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

اذا كان المشروع مازال في مرحلة الاسمبلي أي مرحلة البوت فأنا كتبت بوت

هو مشابه للعديد من النماذج لكن في النهاية فإن له وظيفة معينة :P

;we do some things in this boot:
;we make sure that process is +386
;we refresh protect mode and put kernel in true address
;we'll refresh the A20 for key-board
;that all we do in this simple boot
[bits 16]
ORG 7c00h
jmp start
;data----------------------------------------
bdv db 0
find_286 db 'this process is too old and the OS can't work on it',13,10,0
reboot db 'press any key to reboot...',13,10,0
succ db 'all test be successful we go to next grade',13,10,0
;--------------------------------------------
start:
mov [bdv],dl
mov ax,7c00h
mov ds,ax
mov ax,1000h
;after stack
mov es,ax
;setup stack
cli
mov ax,9000h
mov ss,ax
mov sp,ffffh
sti
detect:
;process+enable A20 for"K-board"+load-kernel
;--------------------------------------------------
process:
;nobody use 8086 now so we test for +286
;test for +386 for now and after we'll know vision
pushf
mov ah,0f0h
push ax
popf
pushf
pop ax
and ah,0f0h
jz f286
popf
;if not jump that's mean find +386 and use its instruction
;if take jump it'll print it and reboot
;---------------------------------------------
A20_line:
;we enable and turn on it only

;----------------------------------------------
hardD:
mov ah,0
mov dl,10h;for HD
int 13h
jae l_kernel
jc hardD
;----------------------------------------------
l_kernel:
;we assume that we are in HD
mov ax,0201h
mov cx,0002h
mov dx,0010h
int 13
jc l_kernel
;on error
mov si,succ
set_succ:
lodsb
cmp al,0
je end_succ
mov ah,0eh
mov bx,0007h
int 10h
jmp set_succ
end_succ:
jae dword[es:bx]
;that's mean 100:0h
;----------------------------------------------
f286:
mov si,find_286
set_find:
lodsb
cmp al,0
je end_find
mov ah,0eh
mov bx,0007h
int 10h
jmp set_find
end_find:
mov si,reboot
set_reboot:
lodsb
cmp al,0
je end_boot
mov ah,0eh
mov bx,0007h
int 10h
jmp set_reboot
end_reboot:
mov ah,0
int 16h
db eah
dw 0000h
dw ffffh
times 510-($-$$) db 0
dw 0AA55h

هذا للاستفادة و سأكون هنا أولا بأول :lol:

0

شارك هذا الرد


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

السلام عليكم

أخي halwa يوجد الكثير من النقاط غير المفهومة

setup_gdt:	
cli
lgdt[gdtptr] ;تحميل المسجل GDT
mov eax, cr0 ;المرور إلي النمط المحمي
or ax, 1
mov cr0, eax

jmp next

next:

لماذا القفز إلى السطر الموالي؟

gdt:
gdt_null:
dw 0,0,0,0 ;المدخل الاول 0 تبعاً لتعليمات كتاب intl
gdt_cs:
db 0xFF, 0xFF, 0,0, 0, 10011011b, 11011111b, 0 ;مدخل الكود
gdt_ds:
db 0xFF, 0xFF, 0,0, 0, 10010011b, 11011111b, 0 ;مدخل البيانات
gdtend:

gdtptr:
dw (DESC_ENTRIES * DESC_LENGTH)-1 ; limite =( number_entries x entry_length)-1
dd 0x7C00+gdt ; base, linear address = (segment_adressx16) + offset

في الحقيقة لم أفهم منه شيئا

ماذا تفعل gdt: و gdtend: بدون كود بعدهما؟

أيضا إلى الآن لم أفهم كيفية عمل المدخل :يوجد 8 بارامترات ماذا تمثل ff الأولى والثانية. ماذا تمثل الأصفار الثلاثة وماذا يمثل العددان التاليان الثنائيان (بيناري). الشيئ الوحيد الذي فهمته هو الصفر الأخيرة التي تمثل نهاية الgdt :wacko:

gdtptr:
dw (DESC_ENTRIES * DESC_LENGTH)-1 ; limite =( number_entries x entry_length)-1
dd 0x7C00+gdt ; base, linear address = (segment_adressx16) + offset

أرجو أن توضح لي ماذا يعني هذا :S

ولماذا

times 510-($-$$) db 144

عوض

times 510-($-$$) db 0

:wacko: :wacko: :wacko: :wacko: :wacko: :wacko: :wacko: :wacko:

0

شارك هذا الرد


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

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

الرد علي الاسئله

1-تعليمه القفز لتنفيذ عده تعليمات مواليه وضمان عدم تنفيذ المعالج لأي تعليمات اخري

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

Gdt تمثل بدايه جدول مداخل الذاكره العام

حيث يتكون من جزئين الجزء الاول طول الجدول

الجز الثاني يمثل العنوان الخطي لوصف الجدول

gdt end:تمثل نهايه الجدول

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

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

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

gdtptr:

dw (DESC_ENTRIES * DESC_LENGTH)-1 ; limite =( number_entries x entry_length)-1

dd 0x7C00+gdt ; base, linear address = (segment_adressx16) + offset

أرجو أن توضح لي ماذا يعني هذا

ولماذا

DESC_ENTRIES:تمثل عدد المداخل التي تمت كتابتها

DESC_LENGTH:مع كتابته طول الطول العام للمداخل

وعن طريق الضرب نحصل علي طول جدول المداخل - 1 (تبعاً لتعليمات كتاب انتل)

السطر الثاني يمثل العنوان الخطي لجدول المداخل

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

اخي هناك امر في بدايه السطر يقوم بعمل مصفوفه طولها 510 - الكود المكتوب قبل امر المصفوفه

ولكن اليس لكل مصفوفه قيم توضع فيها لملاً خانات فقط جرب وضع اي رقم بشرط الا يزيد عن 256

المهم لدينا هو عمل ملف 512 بايت في نهايته رقمين يدلان علي ان هذا boot sector

ومن الواضح انك لست جيد في لغه الاسمبلي :wacko:

0

شارك هذا الرد


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

السلام عليكم

في الحقيقة لم أفهم هذا الجزء

mov esp,0x9F000	
mov ax,0x10 ;نحديد قسم البيانات
mov ds,ax
mov fs,ax
mov gs,ax
mov es,ax
mov ss,ax
jmp dword 0x8:0x1000 ; تحديد قسمه المسجل cs

لماذا تحميل قسم البيانات العادية والإضافية بالقيمة 0x10 بالتحديد

لماذا يتم القفز إلى العنوان 0x8:0x1000 عوض 0x0:0x1000

وشكرا

0

شارك هذا الرد


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

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

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



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

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

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