19يوليو

نظام إدارة العلاقات مع الزبائن

يتضمن هذا المشروع جميع المفاهيم النظرية والتطبيقية لتصميم وتنفيذ نظام Web-Based لإدارة العلاقات مع الزبائن CRM، تتضمن الأطروحة المفاهيم النظرية لإدارة العلاقات مع الزبائن أو العملاء كما يشيع، وأسس تنفيذ تطبيق برمجي بلغة PHP لإدارة ذلك.

أكمل القراءة »

21يناير

سقوط

عندما سقط اكتشفه الجميع فجأة.

نجاح:

أخبره الجميع بحتمية فشله لكنه كان واثقاُ من نجاحه لأبعد الحدود، لاحقاً اندهش الجميع من نجاحاته الباهرة، بينما كان ينام حزينا لفشله.

حلم:

اعتاد مساء كل يوم أن يحلم بحبيبته، لكنه من الآن لن يحلم بها بعد الآن فقد أضحت زوجته .

وثبة:

لطالما رددوا على مسامعه بيت الشعر ، شرف الوثبة أن ترضي العلاـ غلب الواثب أم لم يغلب ، لكن أخفوا عنه  أن الوثب عالياً قد يكسر قدميك ..

هروب:

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

 

من مجموعة دبابيس 2007

 

 

11ديسمبر

قرار مصيري

فجأة ودون سابق إنذارٍ، وجد نفسه مجبراً على اتخاذ قراره، لقد حاول وبشتى الوسائل تأخير هذا القرار وتأجيله لوقت لاحق، كان يعرف في قرارة نفسه أن عليه إتخاذه عاجلاً أم آجلاَ، ولكن من يدري لعل اتخاذه في وقت مبكر أفضل من تأخيره.

جاءه صوت من داخله يناديه:

–  هيا حان الوقت  لا تتردد،  احسم الأمور الآن.

— إنها مغامرة و لا أستطيع تحمل نتائج المغامرات، سأدعه لجولة أخرى ..
–   جولة أخرى  .. جولة أخرى و أخرى،  سئمت منك ومن جولاتك،  لقد أضعت فرصة تلو الاخرى بسبب هروبك من هذه اللحظة المناسبة.
—  لا تقل هروب إنه تريث، إنني أتريث  فحسب لاختيار اللحظة المناسبة.
– لكن تذكر أنك كلما تأخرت كلما قلت الاحتمالات، وكلما أصبحت مجبراُ على اتخاذ قرار ما عوضاً عن الاختيار من عدة خيارات، من واجبي أن أذكرك ، أليس كذلك ؟
— نعم نعم أعرف،  ولكنك تتكلم كأنه قراري لوحدي ، ألا تعرف أن لي شريكاُ علي أن أفكر به، و أحسب حسابه؟
– فكر وهل أمنعك ؟  على أي حال ألا تنتبه إلى تلميحاته؟  إلى نظراته ؟ ألم تفهم بعد ماذا يريد وبم يفكر ؟؟؟..
— كلا .. لو أنني عرفت لقررت حالاً،  ولكنه يفاجئني كل مرة بحركة ما ، صراحة إنني لا أفهم عليه ، وجل ما أخشاه أنني إن قررت  الآن أن يكون قراري ليس صائباً كما حدث في المرة السابقة ، آه لو كان بإمكانه الافصاح ..
– وماذا حدث المرة السابقة ؟
— لقد لمح لي عدة تلميحات متعارضة ، ولم أفهمها و اتخذت قراري الذي جعلنا نندم  سوية، وهجرني بعدها عدة أشهر كردة فعل.
– إذاً !!!
— لا أعرف أنا محتار بين أن أقرر الآن وبين الانتظار ..

 و فجأة قاطعه صوت زميله …
هيا ماذا تنتظر إنه دورك في اللعب .. هل سننتظر جنابك ساعة .. !!!
نظر إلى شريكه في لعبة الشدة  بثقة، و رمى ورقة “الختيار¨ بحزم:
لقد اتخذت قراري وسأرمي هذه الورقة اللعينة فإما النصر أو الهزيمة.
انتفض شريكه غاضباً .. يالك من أحمق ..ألم تفهم تلميحاتي ،  لقد خسرنا مرة أخرى بسببك،  كان عليك تأجيل هذه الورقة للجولة التالية ..
كلم نفسه تارة أخرى ..

ألم أخبرك كان علي أن أتريث  أكثر .. باغتته مسرعة ، ولكن ماذا لو ربحت ، هل كنت لتكلمني  نفس الكلام .

من مجموعة دبابيس عام 2007

1يوليو

إصدار كتاب أسس ومبادئ البرمجة

أصدرت لي  دار شعاع للنشر والعلوم كتاب “أسس ومبادئ البرمجة”، الذي قمت باعداده بالاشتراك مع أسماء الحسين وليلى حاج موسى. يتناول الكتاب تعليم لغة البرمجة للمبتدئين وخاصة طلاب الجامعات باستخدام لغة ++C  حيث يركز على تعليم مفاهيم البرمجة، وبناء الفكر البرمجي الخوارزمي، علاوة على تنفيذ ذلك باستخدام لغة السي بلس. أكمل القراءة »

12أغسطس

تقنيات وحلول في جافا جزء 2

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

وصف الكتاب حسب دار شعاع: “هذه السلسلة دورية تصدر تباعاً وهذا مايساعد على تطور وحداثة المعلومات الواردة في أجزائها. وقد قام بجمع وإعداد أجزاء هذه السلسلة كتاب مبرمجون لهم تجربة عملية إن على صعيد البرمجة أو على صعيد الترجمة والإعداد والتأليف”. أكمل القراءة »

1أغسطس

مقدمة أطروحة التخرج

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

31يوليو

لمحة عامة عن نظام التشغيل

يمتلك معظم مستخدمي الحاسب بعض الخبرة في أحد أنظمة التشغيل, و لكن يبقى من الصعب الإجابة على سؤال ما هو نظام التشغيل بدقة؟ ولكن يمكن القول كجواب أولي أن نظام التشغيل هو برنامج يدير عتاديات الحاسوب و يوفر أساسات البرامج التطبيقية كما يؤدي دور الوسيط بين مستخدم الحاسوب و عتاديات الحاسوب و لعل أحد الأوجه المذهلة في نظم التشغيل هو التنوع الواسع في إنجازها تلك المهام.
يقسم النظام الحاسوبي عموما إلى أربعة مكونات: العتاديات، نظام التشغيل، البرامج التطبيقية، المستخدمين حيث توفر العتاديات مثل وحدة المعالجة و الذاكرة و تجهيزات الدخل و الخرج الموارد الأساسية للحاسب و تحدد البرامج التطبيقية مثل معالجات النصوص و برامج الجدال الالكترونية و متصفحات الانترنت الأساليب التي تستخدم بها هذه الموارد لحل المسائل الحاسوبية للمستخدمين يتولى نظام التشغيل مهمة مراقبة و تنسيق استخدام العتاديات بين مختلف البرامج التطبيقية لمختلف المستخدمين كما في الشكل التالي:
إذا يمكن تشبيه نظام التشغيل بالحكومة الذي يقوم بالوظائف الأساسية و يوفر ببساطة بيئة يمكن لغيره من البرامج القيام بعمل مفيد و لكي نتعرف على نظم التشغيل أكثر لا بد من لمحة تاريخية سريعة لتطورها.

لمحة تاريخية عن أنظمة التشغيل

شهدت أنظمة التشغيل تطورا كبيرا منذ ظهورها حتى الآن و سنلقي الضوء في المقاطع التالية على أهم المراحل التي مرت بها أنظمة التشغيل و لما كانت أنظمة التشغيل تاريخيا وثيقة الصلة بالأجهزة التي تعمل عليها فإننا سنطلع على الأجيال المتعاقبة من الحواسب لنرى كيف كانت أنظمة تشغيلها تبدو.
الجيل الأول 1945-1955 الصمامات المفرغة و لوحات التوصيل: بدأت الحواسب بالظهور في أواسط الأربعينات و كانت بدائية جدا و تستخدم الصمامات و كانت تتألف من آلاف الصمامات التي تملأ عدة غرف و لم يكن آنذاك لغات برمجة (حتى لغة التجميع ) و لم يكن هناك أنظمة تشغيل أيضا.
الجيل الثاني 1955-1965 الترانزستور و الأنظمة الدفعية: تغيرت الصورة جذريا مع ظهور الترانزستورات حيث أصبحت الحواسب أصغر حجما بكثير و أكثر موثوقية و أقل أعطالاَ و أصبح هناك تمييز بين المصممين و المنفذين و المشغلين و المبرمجين و عمال الصيانة و بسبب غلاء التجهيزات آنذاك فقد ظهرت فكرة البرمجة الدفعية حيث يتم تجميع مجموعة من الأعمال ثم تحويلها إلى أشرطة مغناطيسية بواسطة حاسب رخيص ثم نقلها إلى الحاسب الرئيسي ليتم معالجتها دفعة واحدة.
الجيل الثالث 1965-1980 الدارات المتكاملة و البرمجة المتعددة:  كانت الشركات في نهاية الستينات تنتج نوعين من أجهزة الحاسب الحواسبSystem/360 وهوة و الحواسب التجارية الصغيرة نسبيا و كان استخدام و برمجة نوعين مختلفين من الأجهزة مهمة صعبة، خاصة أن معظم الشركات كانت تبدأ بحاسب صغير ثم تتوسع إلى حاسب كبير.قدمت IBM حلا لهذه المشكلة من خلال تطوير جيل جديد من الحواسب يسمى System/360 وهو عبارة عن سلسلة من الحواسب المتوافقة مع بعضها من الناحية البرمجية و تتدرج بالحجم من الكبيرة القوية إلى الصغيرة التجارية و بما أن جميع هذه الأجهزة لها نفس مجموعة التعليمات فإن البرامج المكتوبة لأحدها يمكن أن تعمل عليها كلها نظريا كما أنها مصممة لمعالجة العمليات العلمية بالإضافة إلى العمليات التجارية.و بعد سنوات قدمت IBM سلسلة متوافقة مع 360.
كان 360 الجهاز الأول المعروف الذي استخدم الدارات المتكاملة و كان هذا تطورا كبيرا عن الجيل الثاني الذي استخدمت حواسبه الترانزستورات المنفردة و مازالت هذه الأجهزة مستخدمة حتى الآن لكن بنسخ أحدث و فيما يلي بعض مميزات هذا الجيل:

  • البرمجة المتعددة حيث في الجيل السابق كان المعالج يبقى خاملا عند القيام بعملية دخل / خرج حتى ينهي هذه العملية و تم حل هذا الأمر في البرمجة المتعددة.
  • الأرتال أي عملية ترتيل عمليات الطرفيات و وضعها في أرتال و هو ما يدعى ب Spooling.
  • المشاركة الزمنية أي تقسيم الزمن لخدمة مجموعة لا بأس منها من المستخدمين بنفس الوقت و بشكل تفاعلي.

الجيل الرابع 1980- الوقت الحاضر الحواسب الشخصية: بدأ عصر الحواسب الشخصية مع ظهور الدارات ذات التكامل الواسع LSI و أصبحت بعد ذلك الحواسب الشخصية رخيصة و بمقدار أي شخص شراءها. صممت IBM جهازها الشخصي IBM PC في أوائل الثمانينات و طرحته في الأسواق مرفقا مع نظام التشغيل MS DOS ومفسر لغة BASIC من شركة MicroUNIX.لناشئة و قد كان أحد أهم القرارات الحكيمة ل بيل غيتس أنه قرر توزيع نظام تشغيله مع الأجهزة من خلال الاتفاق مع شركات تصنيع العداد مثل IBM و غيرها على عكس ما كانت تفعله منافسته شركة Digital Research التي كانت تسوق نظام التشغيل CP/M مباشرة للمستخدم النهائي.أصبح بعد ذلك نظام MS DOS نظام التشغيل الأشهر و قد أضيفت له الكثير من المميزات في الإصدارات اللاحقة و كانت كلها مستوحاة من نظام UNIX.
حتى هذا الوقت كانت جميع أنظمة التشغيل تعتمد على كتابة الأوامر على لوحة المفاتيح و لكن الأمور تغيرت مع ظهور ما يسمى بواجهة المستخدم الرسومية GUI التي صممت في البداية في شركة Xerox على أجهزة Xerox parc المتطورة و لكن Xerox لم تهتم كثيرا بهذه التقنية التي استوحت منها شركة Apple فكرة نظام Lisa الذي لم ينجح بسبب غلاء سعره و لكنها اتبعته مباشرة بنظام Macintosh الذي تميز بسهولة استخدامه فنجح نجاحا باهرا. تأثرت Microsoft بهذا النظام و بدأت بتطوير نظام وندوز الذي لم يكن نظام تشغيل حقيقي بل كان عبارة عن طبقة رسومية فوق نظام MS DOSو استمر ذلك حتى عام 1995 حيث أطلقت عندئذ نظام وندوز مستقلا أسمته Windows 95 و الذي استخدم نظام DOS في داخله من أجل الإقلاع و برامج التشغيل القديمة و هكذا بدأت سلسلة الإصدارات من وندوز.
نذكر من المنافسين الآخرين في عالم الحواسب الشخصية نظام التشغيل Unix الذي لاقى نجاحا اكبر على أجهزة محطات العمل و الحواسب القوية مثل مخدمات الشبكات و على الرغم من أن UNIX كان نظام أوامر سطري منذ البداية فإن MIT طورت واجهة رسومية خاصة سمتها X Windows من أجل أنظمة UNIX.
سنكتفي بهذا القدر من السرد التاريخي و دعونا نتحدث قليلا عن أنواع و أشكال أنظمة التشغيل.

أنواع أنظمة التشغيل

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

أنظمة تشغيل الأجهزة الكبيرة Mainframe: تحتل أنظمة التشغيل الكبيرة المرتبة الأولى من حيث الحجم و تتميز عن الحواسب الشخصية بسعة منافذ الدخل و الخرج فمن الطبيعي أن يحتوي جهاز منها حوالي 1000 قرص صلب و تستخدم ه/360.اسب كملقمات ويب متطورة و ملقمات مواقع التجارة الالكترونية المتطورة.تهتم أنظمة تشغيل هذه الأجهزة بالدرجة الأولى بتشغيل عدة مهام في وقت واحد و تحتوي على كمية هائلة من معالجات الدخل و الخرج من الأمثلة على هذه الأنظمة OS/390 المشتق من OS /360.

أنظمة تشغيل المخدمات: تعمل هذه الأنظمة على المخدمات التي تكون إما أجهزة شخصية كبيرة جدا أو محطات عمل أو حتى أجهزة كبيرة و تخدم هذه الأنظمة عدة مستخدمين بوقت واحد على شبكة و يسمح للمستخدمين بمشاركة الموارد العتادية و البرمجية و من الأمثلة على هذه الأنظمة UNIX و Windows 2000 و ظهر مؤخرا على الساحة نظام LINUX.

أنظمة تشغيل المعالجات المتعددة: تعني المعالجات المتعددة وصل عدة معالجات معا لتامين طاقة معالجة كبيرة و تدعى هذه الأنظمة بالأنظمة المتوازية أو المعالجات المتفرعة و تحتاج لأنظمة تشغيل خاصة بها و عادة ما تكون هي أنظمة مخدمات و مع بعض التعديلات.
أنظمة تشغيل الحواسب الشخصية
تنحصر مهمة هذه الأنظمة بتقديم واجهة جيدة لمستخدم واحد و من الأمثلة الشهيرة Windows و Linux و في الواقع يوجد العديد من أنظمة التشغيل الأخرى و لكن ليست مشهورة بسبب الناحية التجارية.

أنظمة تشغيل الزمن الحقيقي: تعتمد هذه الأنظمة على الزمن بشكل رئيسي مثل أنظمة التحكم بالعمليات الصناعية و تحتوي هذه الأنظمة على نقاط حرجة يجب احترامها و نظم الزمن الحقيقي نوعان Hard و Soft و من الأمثلة على هذه الأنظمة vxworks و QNX.

أنظمة التشغيل المضمنة: ننتقل الآن الحواسب المحمولة باليد و الأنظمة المضمنة و تتسم غالبا هذه الأنظمة بنفس مزايا أنظمة الزمن الحقيقي لكن لها قيود بالنسبة للحجم و متطلبات الذاكرة و القوة الحسابية و من الأمثلة عليها Palm Os و Windows CE.

أنظمة تشغيل البطاقات الذكية:تعمل هذه الأنظمة على البطاقات الذكية ة تحوي على معالج و لها قيود قاسية بالنسبة للقوة الحسابية و حجم الذاكرة و بعض هذه البطاقات يعتمد على لغة الجافا و هذا يعني أن الذاكرة ROM تحتوي على مفسر لآلة جافا الظاهرية JVM.
بنية أنظمة التشغيل

الأنظمة الأحادية:يمكن وصف هذا الأسلوب الذي يعتبر الأكثر شيوعا حتى الآن بأنه فوضى كبيرة “Big Mess” و تعتمد هذه البنية على عدم وجود بنية و يكتب نظام التشغيل على شكل مجموعة من الإجراءات يستطيع كل منها استدعاء أي إجراء آخر عندما يحتاج إليه و لإنشاء البرنامج التنفيذي الفعلي لنظام التشغيل عند إتباع هذا الأسلوب يجب أولا ترجمة جميع الإجراءات أو الملفات التي تحتوي هذه الإجراءات أو الملفات التي تحتوي هذه الإجراءات و من ثم ربطها معا ضمن ملف هدف واحد باستخدام رابط النظام و يكون إخفاء المعلومات مفقودا تماما حيث يستطيع كل إجراء رؤية جميع الإجراءات الأخرى يقترح هذا التنظيم بنية بسيطة لنظام التشغيل:

  • برنامج رئيسي ينفذ إجراء الخدمة المطلوبة.
  • مجموعة من إجراءات الخدمة التي تنفذ إستدعاءات النظام.
  • مجموعة من الإجراءات المساعدة التي تساعد إجراءات الخدمة.

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

الآلات الظاهرية: كما ذكرنا سابقا يتألف النظام عادة من طبقات و العتاديات هي المستوى الأدنى في جميع النظم و النواة هي التي تعمل في المستوى التالي، تستخدم تعليمات العتاديات لإنشاء مجموعة إستدعاءات النظام كي تستخدمها الطبقات الخارجية فبرامج النظام عندئذIBM. قادرة على استخدام إستدعاءات النظام أو التعليمات العتادية و هذه البرامج عادة لا تفرق بين الاثنين.جاءت الأنظمة الظاهرية بحيث تؤمن وجود آلة افتراضية للمستخدم يستطيع خلالها تنفيذ برامجه و هكذا يعطى المستخدمون آلات افتراضية خاصة بهم و من ثم يستطيعون تنفيذ أي نظام تشغيل أو حزمة برمجية متاحة في الآلة الأساسية و كمثال نذكر نظام VM من IBM .

أنماط عمل معالجات INTEL:

معالجات 8086: يعمل المعالج في النمط الحقيقي و يسمح بعنونة ذاكرة بحجم 16 خانة, و يعمل في عنونة الذاكرة على أساس تقنية التقطيع. و تحتوي مسجلات المعالج التي هي بحجم 16 خانة أيضا على عناوين المقاطع الذاكرية المباشرة و الإزاحات ضمن هذه المقاطع أي يقوم بالوصول إلى الذاكرة مباشرة. و هذا ما يحققه نظام العمل في النمط الحقيقي إلا أن نمط العمل هذا له بعض السلبيات و لا يؤمن لنا إمكانية الحماية للقطع الذاكرية كما أنه لا يدعم تقنيات تعدد المهام.

معالجات 80386: تعمل هذه المعالجات أيضا في النمط الحقيقي و بنفس طريقة عمل المعالج 8086 و لكن بشكل أسرع منه، وكما أنها تعمل في نمط جديد لم يكن موجود في معالجات 8086 وأول ما تم إيجاده في المعالج 80286 و تم تحسينه نمط العمل هذا في الإصدار 80386 لكي يعمل على عنونة ذاكرة بحجم عنونة 32 خط عنونة. و يتم العنونة في نمط العنونة هذا على أساس جداول تخطط بنية الذاكرة،و سنقتصر في نظامنا على المعالجات على 80386 فقط لأنها هي المعتمدة في نظام التشغيل المصمم أو لنقل بشكل أدق أن بنية هذه المعالجات هي البنية القياسية المعتمدة.

المسجلات في 80386

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

  • أربع مسجلات أغراض عامة
  • مسجل أعلام
  • ست مسجلات مقطعية
  • مسجلي فهرسة
  • مسجل تكديس
  • مسجل قاعدي و مسجل التعليمة
  • مسجلات الجداول
  • GDTR مسجل جدول الموصفات العامة.
  • LDTR مسجل جدول الموصفات المحلية.
  • IDTR مسجل جدول الموصفات المقاطعات.
  • TR مسجل تخزين المهمة.
  • CR0 – CR3 مسجلات التحكم,
  • DR0 – DR7 مسجلات نمط التنقيح.

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

 

المسجلات

  • مسجلات مخفية لا يمكن الوصول إليها من قبل المبرمج و تستخدم من قبل المعالج و ذلك لأغراض العنونة الذاكرية و التخزين المؤقت لبعض العناوين.
  • مسجلات تخزين واصفة مقطع الشفرة الحالي : Code Segment Descriptor Cach Reg .
  • مسجلات تخزين واصفة مقطع المعط يات الحالي: Data Segment Descriptor Cach Reg.
  • مسجلات تخزين واصفة مقطع التكديس الحالي: Stack Segment Descriptor Cach Reg.
  • مسجلات تخزين عنوان جدول وصفات المقاطع العامة الـ GDT الحالي.
  • مسجل تخزين عنوان جدول واصفات المقاطعات الـ IDT الحالي.
  • مسجل تخزين عنوان جدول الواصفات المحلية LDT الحالي.
  • سجل تخزين جدول واصفات الحالة TSS.
30يوليو

إقلاع الحاسب

يعتبر إقلاع الحاسب الخطوة الأولى في بناء نظام تشغيل حيث هو المرحلة التي تأتي بعد تشغيل الجهاز إلى تحميل نظام التشغيل و تسليم القيادة له.عندما يقوم جهاز الحاسب بالإقلاع من قرص مرن تقوم وحدة الدخل و الخرج للنظام BIOS بقراءة القرص و تحميل القطاع الأول إلى الذاكرة عند العنوان 0000:7C00. يدعى القطاع الأول بسجل إقلاع دوس DOS Boot Record (DBR). تقوم البيوس BIOSبالقفز إلى العنوان 0x7C00 و تقوم بتنفيذ التعليمات الموجودة هناك و تكون هذه التعليمات عبارة عن برنامج تحميل الإقلاع boot loader و الذي سيقوم بتحميل نظام التشغيل OS إلى الذاكرة و تبدأ عندئذ عملية إقلاع نظام التشغيل.

تم البحث في هذا المجال بالاعتماد على الكتب و المقالات التخصصية في كتابة برامج الإقلاع و الفروقات بينها و الاحتمالات الموجودة لكتابة برنامج إقلاع و تبين أن بناءنظام تشغيل يتطلب برنامجين رئيسين و هما نواة نظام التشغيل أي نظام التشغيل بحد ذاته و برنامج الإقلاع الذي يقوم بإقلاع الحاسب و تحميل نظام التشغيل إلى الذاكرة و تشغيله.انطلقنا في العمل في جعل الحاسب قادر على الإقلاع من قرص مرن و بالتالي تشغيل نظامي الخاص بي و الذي كان بداية عبارة عن حلقة لا نهائية لا تقوم بشيء مفيد و بعد ذلك شرعنا في بناء نظام تشغيل بسيط يقوم بطباعة حرف واحد على الشاشة و بعد ذلك وضع هذا النظام على قرص مرن والإقلاع منه. ثم قمنا بتطوير نظام التشغيل ذلك بحيث يقوم بطباعة جملة HELLO WORLD على الشاشة، ثم فكرنا بعد ذلك بجعله أكثر تفاعلا بحيث يقوم نظام التشغيل بقراءة أحرف من لوحة المفاتيح و طباعتها على الشاشة.الخطوة الأخيرة كانت في كتابة برنامج إقلاع للحاسب مستقل و يقوم ذلك البرنامج بتحميل نظام التشغيل إلى الذاكرة, و بعد ذلك تم البحث في برامج الإقلاع الجاهزة و المستخدمة في نظم التشغيل المختلفة في وقتنا الحاضر ولتنفيذ ذلك تم استخدام لغة البرمجة الاسمبلي لكتابة البرامج و قد استعنت بأداة المنقح لكتابة برامج الاسمبلي في البداية و من ثم نسخ البرنامج للقرص الصلب, و للحصول على طريقة سريعة لكتابة برامج الاسمبلي قمت باستخدام برنامج الاسمبلي “Netwide Assembler” (NASM).

بداية كان العمل يقتصر على ال512 بايت ضمن القطاع الأول من القرص الصلب بحيث أصبح برنامج الإقلاع موجود ضمن القطاع الأول من القرص, و لكن كما نعلم انه من المستحيل أن يقتصر نظام تشغيلنا على 512 بايت فقط فكان الحل بكتابة برنامج إقلاع يقوم ببساطة بتحميل ملف تنفيذي من القرص و يبدأ بتنفيذه و يدعى هذا البرنامج بمحمل الإقلاع Boot Loader, و يكون الملف الذي سنحمله من القرص بالحجم الذي نريده و لن يقتصر حجمه على قطاع واحد. وبعد ذلك قمنا بكتابة برنامج الإقلاع loader, هذا المحمل loader يفترض استخدام نظام الملفات FAT12 و هو النظام الذي تتم به تهيئة القرص المرن. و لذلك من اجل نظاما آخر عليه استخدام محمل loader آخر.

في النهاية تم استخدام محمل الإقلاع GRUB الذي يتناسب مع نواة نظام تشغيلنا التي قمنا بتطويرها حيث يعود السبب إلى كون النواة من النوع ELF و بالتالي لا يمكن تحميلها بالمحملات السابقة و أما كتابة محمل خاص جديد خاص بهذه النواة فهو يعتبر ضربا من الجنون، و خاصة إذا علمنا أن محمل الإقلاع GRUB هو عبارة عن برنامج حر و مجاني و مفتوح المصدر و يمكن تطويره بحرية تحت رخصة البرامج الحرة و المفتوحة المصدر.

قطاع الإقلاع The Boot Sector

في هذه القسم سنتعرف على محتويات قطاع الإقلاع و بعد ذلك سنتعلم كيف نكتب برنامج الإقلاع الخاص بنا.عندما يقوم جهاز الحاسب بالإقلاع من قرص مرن تقوم وحدة الدخل و الخرج للنظام BIOS بقراءة القرص و تحميل القطاع الأول إلى الذاكرة عند العنوان 0000:7C00. يدعى القطاع الأول بسجل إقلاع دوس DOS Boot Record (DBR). تقوم البيوس BIOS بالقفز إلى العنوان 0x7C00 و تقوم بتنفيذ التعليمات الموجودة هناك و تكون هذه التعليمات عبارة عن برنامج تحميل الإقلاع boot loader و الذي سيقوم بتحميل نظام التشغيل OS إلى الذاكرة و تبدأ عندئذ عملية إقلاع نظام التشغيل.

بداية سنقوم بإلقاء نظرة إلى داخل سجل الإقلاع, و سيساعدنا في ذلك أداة المنقح DEBUG و الذي يستخدم لعرض محتويات الذاكرة و الأقراص و في حالتنا سنقوم بعرض محتويات سجل الإقلاع لقرص مرن.

المنقح Debugger:

يمكن تشغيل المنقح من محرر الأوامر دوسDOS أو من قائمة ابدأStart و اختيار تشغيلRUN ثم كتابة DEBUG.

عرض محتويات الذاكرة

يقوم الأمر d بعرض جزء من محتويات الذاكرة RAM.
-d
136E:0100 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
136E:0110 00 00 00 00 00 00 00 00-00 00 00 00 34 00 5D 13 ............4.].
136E:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
136E:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
136E:0140 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
136E:0150 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
136E:0160 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
136E:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................


الحصول على المساعدة

من أجل الحصول على المساعدة و الشرح لأمر ما يمكنك كتابة ? .

-?

assemble A [address]

compare C range address

dump D [range]

enter E address [list]

fill F range list

go G [=address] [addresses]

hex H value1 value2

input I port

load L [address] [drive] [firstsector] [number]

move M range address

name N [pathname] [arglist]

output O port byte

proceed P [=address] [number]

quit Q

register R [register]

search S range list

trace T [=address] [value]

unassemble U [range]

write W [address] [drive] [firstsector] [number]

allocate expanded memory XA [#pages]

deallocate expanded memory XD [handle]

map expanded memory pages XM [Lpage] [Ppage] [handle]

display expanded memory status XS

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

تحميل سجل الإقلاع

خذ قرص مرن floppy و قم بتهيئته formatثم ضعه في محرك الأقراص المرنة.لتحميل سجل الإقلاع Boot Record لقرصك المرن أدخل الأمر التالي:

-l 0 0 0 1

يقوم هذا الأمر l (الحرف L) بتحميل القطاعات من القرص إلى جزء من الذاكرة RAM أما الأرقام الأربعة التالية فتعبر عن بداية العنوان الذي ستقوم بتحميله إلى الذاكرة حيث:

الرقم الأول : رقم القرص الصلب حيث 0 تشير للقرص المرن الفلوبي floppy .

الرقم الثاني : رقم القطاع من القرص حيث في حالتنا نريد القطاع الأول أي القطاع ذو الرقم 0 .

الرقم الثالث : العنوان الذي سنبدأ منه التحميل .

الرقم الرابع :عدد القطاعات التي نريد تحميلها .

و يصبح الأمر السابق يقوم بتحميل القطاع الأول من القرص المرن إلى الذاكرة بدءا من العنوان 0 و بعدد قطاع واحد.

الآن قمنا بتحميل القطاع إلى الذاكرة و نريد عرض محتوياته, يتم ذلك بالأمر التالي:

-d 0

سيظهر لديك الشكل التالي حيث يتم عرض 128 بايت (0x80 in hex) من سجل إقلاع القرص المرن كالتالي:

0AF6:0000 EB3C 90 4D 53 44 4F 53-35 2E 30 00 02 01 01 00 <.MSDOS5.0…..

0AF6:0010 02 E0 00 40 0B F0 09 00-12 00 02 00 00 00 00 00 …@…………

0AF6:0020 00 00 00 00 00 00 29 F6-63 30 8.8 4E 4F 20 4E 41 ……).c0.NO NA

0AF6:0030 4D 45 20 20 20 20 46 41-54 31 32 20 20 20 33 C9 ME FAT12 3.

0AF6:0040 8E D1 BC F0 7B 8E D9 B8-00 20 8E C0 FC BD 00 7C ….{…. …..|

0AF6:0050 38 4E 24 7D 24 8B C1 99-E8 3C 01 72 1C 83 EB 3A 8N$}$….<.r…:

0AF6:0060 66 A1 1C 7C 26 66 3B 07-26 8A 57 FC 75 06 80 CA f..|&f;.&.W.u…

0AF6:0070 02 88 56 02 80 C3 10 73-EB 33 C9 8A 46 10 98 F7 ..V….s.3..F…

كنظرة أولية لن يخبرنا هذا الشكل أي معلومات و لكن يمكن أن أعرف بعض المعلومات مثل أن نظام الملفات هو FAT12 و أن نوع القرص هو MS-DOS 5.0 بدون اسم .

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

الخ.ض هذه البايتات التي تراها في هذا الجزء من سجل الإقلاع هي أجزاء من التعليمات في محمل الإقلاع (boot loader) و بعض هذه البايتات تقوم بتخزين المعلومات حول القرص مثل رقم البايتات ضمن القطاع, رقم القطاعات في المسار track… الخ .

شفرة محمل الإقلاع

دعونا نلقي نظرة إلى شفرة محمل الإقلاع boot loader.

لنكتب الأمر التالي:

-u 0

تقوم هذه التعليمة بفك تجميع unassembled أي تظهر لك التعليمات بلغة التجميع المقابلة للبايتات السابقة و بدءا من العنوان المحدد و في حالتنا هو الصفر و سنحصل على الخرج التالي:

0AF6:0000 EB3C JMP 003E

0AF6:0002 90 NOP

0AF6:0003 4D DEC BP

0AF6:0004 53 PUSH BX

0AF6:0005 44 INC SP

0AF6:0006 4F DEC DI

0AF6:0007 53 PUSH BX

0AF6:0008 352E30 XOR AX,302E

0AF6:000B 0002 ADD [BP+SI],AL

0AF6:000D 0101 ADD [BX+DI],AX

0AF6:000F 0002 ADD [BP+SI],AL

0AF6:0011 E000 LOOPNZ 0013

0AF6:0013 40 INC AX

0AF6:0014 0BF0 OR SI,AX

0AF6:0016 0900 OR [BX+SI],AX

0AF6:0018 1200 ADC AL,[BX+SI]

0AF6:001A 0200 ADD AL,[BX+SI]

0AF6:001C 0000 ADD [BX+SI],AL

0AF6:001E 0000 ADD [BX+SI],AL

تقوم التعليمة الأولى JMP 003 بالقفز إلى العنوان 0x3E. أما التعليمات التالية فهي معلومات القرص التي ذكرناها قبل قليل و لكن هذه التعليمات لا توافقها تماما و إنما بالعنوان 0x3Eعل ما بوسعه بتحويل البايتات إلى تعليمات أسمبلي و يفسر البايتات بالشكل السابق.إذا إن التعليمة الأولى تقوم بالقفز إلى العنوان الذي يبدأ عنده برنامج الإقلاع boot program والذي يبدأ عادة بالعنوان 0x3E دعونا نطلع على هذه التعليمات بكتابة الأمر:

-u 3E

هنا يمكنك رؤية بداية الشMS-DOS يقوموم بتحميل نظام التشغيل DOS أو Windows.هذا الكود لنظام التشغيل MS-DOS يقوم بالبحث على القرص الصلب عن الملفات IO.SYS , MSDOS.SYS حيث تحتوي هذه الملفات على شفرة نظام التشغيل, تقوم شفرة محمل الإقلاع boot loader بتحميل هذه الملفات إلى الذاكرة ة البدء بتنفيذها و إما إذا لم يجد محمل الإقلاع هذه الملفات فإنه يقوم بعرض رسالة الخطأ الشائعة .

Invalid system disk

Disk I/O error

Replace the disk, and then press any key

هذه الرسالة تكتب في سجل إقلاع الدوس بدءا من العنوان 180 كما يبن الشكل:

-d 180

0AFC:0180 18 01 27 0D 0A 49 6E 76-61 6C 69 64 20 73 79 73 ..’..Invalid sys

0AFC:0190 74 65 6D 20 64 69 73 6B-FF 0D 0A 44 69 73 6B 20 tem disk…Disk

0AFC:01A0 49 2F 4F 20 65 72 72 6F-72 FF 0D 0A 52 65 70 6C I/O error…Repl

0AFC:01B0 61 63 65 20 74 68 65 20-64 69 73 6B 2C 20 61 6E ace the disk, an

0AFC:01C0 64 20 74 68 65 6E 20 70-72 65 73 73 20 61 6E 79 d then press any

0AFC:01D0 20 6B 65 79 0D 0A 00 00-49 4F 20 20 20 20 20 20 key….IO

0AFC:01E0 53 59 53 4D 53 44 4F 53-20 20 20 53 59 53 7F 01 SYSMSDOS SYS..

0AFC:01F0 00 41 BB 00 07 60 66 6A-00 E9 3B FF 00 00 55 AA .A…`fj..;…U.

يظهر الشكل السابق نهاية سجل الإقلاع , هناك ملاحظة هامة جدا و هي أن سجل تليه,ع محدد بالحجم 512 بايت و بالتالي إذا ما تم تحميله إلى الذاكرة بدءا من العنوان 0 سيتوضع البايت الأخير عن العنوان0x1FF كما أن آخر بايتين ضمن سجل الإقلاع هما 0x1FE , 0x1FF ويحتويان دوما القيمتين0x55 و 0xAA على الترتيب يجب أن دوما وضع هاتين القيمتين ضمن أخر بايتين و إلا سوف لن تقوم البيوس بتحميل القطاع و البدء بتنفيذه.

في الخلاصة نقول إن سجل الإقلاع لدوس يبدأ بتعليمة قفز فوق المعطيات التي تليه , هذه ال60 بايت من المعطيات تبدأ عند العنوان 0x02 وتنتهي عند العنوان 0x3D و تستأنف شفرة الإقلاع عند العنوان 0x3E و تكمل عملها حتى العنوان 0x1FD حيث تنتهي ب بايتين لهما قيمتين محددتين هما 0x55 , 0xAA .

إنشاء قرص إقلاع

في هذا القسم سنتعلم كيف نقوم بصنع برنامج إقلاع لقرص مرن و سننطلق في ذلك بتعديل سجل الإقلاع لدوس DOS Boot Record.إن هدفنا هو استبدال شفرة محمل الإقلاع بدون تغيير المعطيات الأخرى في قطاع الإقلاع, لأنه إذا قمنا بتغيير المعطيات إلى شيء آخر غير متاح فسوف لن يعتبر نظام التشغيل دوس DOS أو وندوز Windows القرص الصلب قرصا مقبولا, و سيعطي النظام رسالة خطأ تفيد أن يجب تهيئة القرص المرن.

تعديل سجل الإقلاع

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

اكتب التعليمة التالي:

-u 3E

لنبدأ بتعديل المعطيات و ذلك بالأمر:

-a 3E

يقوم المحث prompt بالتغيير إلى العنوان الذي نريد كالتالي:

jmp 3E

يتم تنفيذ التعليمة إلى لغة الآلة و توضع في الذاكرة و يشير المحث إلى الموقع الذاكري التالي المتاح بعد إدخال التعليمة, اضغط Enter مرة أخرى لإنهاء شفرة الاسمبلي و يصبح الشكل النهائي للكود كالتالي:

-a 3E

0AFC:003E jmp 3E

0AFC:0040

الآن يمكنك عرض التعليمات التي أدخلتها كالتالي:

-u 3E

و يكون بالشكل التالي:

-u 3e

136E:003E EBFE JMP 003E

136E:0040 8ED1 MOV SS,CX

136E:0042 BCF07B MOV SP,7BF0

136E:0045 8ED9 MOV DS,CX

136E:0047 B80020 MOV AX,2000

136E:004A 8EC0 MOV ES,AX

136E:004C FC CLD

136E:004D BD007C MOV BP,7C00

136E:0050 384E24 CMP [BP+24],CL

136E:0053 7D24 JGE 0079

136E:0055 8BC1 MOV AX,CX

136E:0057 99 CWD

136E:0058 E83C01 CALL 0197

136E:005B 721C JB 0079

136E:005D 83EB3A SUB BX,+3A

يمكنك ملاحظة أن التعليمة الأولى تغيرت إلى تعليمة القفز التي وضعناها و بالتالي سنحصل على حلقة لانهائية أي أن برنامج إقلاعنا سيعلق ببساطة لأنه سيتوقف مكانه مستمرا بالقفز عند نفس العنوان, بقي أن نحفظ هذه المعطيات الجديدة على القرص الصلب لان إغلاق المنقح لن يؤدي لآي عملية حفظ و يتم الحفظ كما ذكرنا بالكتابة إلى القطاع الأول من القرص المرن و ببساطة بالأمر التالي:

-w 0 0 0 1

إن أمر الكتابة write يشبه أمر التحميل load حيث يكتب المعطيات الموجودة في الذاكرة في العنوان 0 للقرص رقم 0 بدءا من القطاع رقم 0 و بطول قطاع واحد 1.عليك الحذر عند استخدام هذا الأمر و خصوصا مع الأقراص الصلبة غير المرنة لأنه يؤدي لكتابة معطيات فوق أخرى موجودة و قد يسبب ضياع معلومات لك.

الآن يمكنك أن تقلع من القرص الصلب, عندما تقوم بإعادة إقلاع الحاسب تقوم البيوس بتحمالمطلوب. الأول من القرص إلى الذاكرة و تبدأ التنفيذ عند بداية القطاع و ستجد عندئذ تعليمة القفز إلى العنوان 0x3E و تنفيذ التعليمة هناك.لآن قم بتنفيذ ما سبق و ستجد أن بعد أعادة الإقلاع سيعلق الحاسب أي لن يفعل شيء و هو المطلوب .

طباعة حرف على الشاشة

طبعا قد لا تكون راضيا عن النتائج فماذا نستفيد من تعليق الحاسب, لا تتسرع فهذه مجرد بداية لا بد منها تريك أنك يمكنك الاستغناء عن نظام تشغيلك و إعادة إقلاع حاسبك كما تريد, إذا أردنا فعل شيء مفيد فعلينا الاستعانة بتوابع يبوس BIOS و علينا الانتباه أن هناك نوعين من الاستدعاءات منها خاص ببيوس و الآخر خاص ب دوس و طبعا لا يمكن الاستعانة بتلك الخاصة ب(دوسDOS ) لأنه بالأصل لا يوجد نظام تشغيل دوس يعمل بالأصل، وتكون قيم المسجلات بالدلالة التالية:

AH = 0x0E

AL = ASCII code of the character to be printed

BL = color/style of character

أعد الآن التعليمات في هذا الفصل و بدل من تعليمة القفز التي كتبناها سابقا ادخل التعليمات التالية:

-a 3E

0AF6:003E mov ah, 0e

0AF6:0040 mov al, 48

0AF6:0042 mov bl, 07

0AF6:0044 int 10

0AF6:0046 jmp 46

0AF6:0048

تقوم التعليمات السابقة بإسناد القيمة صفر للمسجل AH و القيمة 0x48 للمسجل AH حيث تعبر القيمة عن الحرف H, القيمة 7 للمسجل BL و هي تعبر عن لون الخط الأبيض على خلفية سوداء, قم بحفظ قطاع الإقلاع كما سبق (-w 0 0 0 1), أعد الإقلاع مرة أخرى من القرص المرن, هذه المرة ستجد الحرف H مطبوعا على الشاشة قبل تعليق الحاسب.

استخدام المجمع NASM

سنتعلم في هذا القسم كيفية استخدام الاسمبلي لكتابة برامجنا, كنا في الفصول السابقة نستخدم أداة المنقح لكتابة برامج الاسمبلي, و لكن كتابة برامج كبيرة يعتبر أمر متعب باستخدام المنقح DEBUG و للحصول على طريقة سريعة لكتابة برامج الاسمبلي سننطلق باستخدام برنامج الاسمبلي “Netwide Assembler” (NASM). و يمكنك تحميل البرنامج من الموقع http://nasm.sourceforge.net/index.php كما يمكنك الحصول عليه من القرص المرفق.

كتابة البرنامج

سنستخدم هذا البرنامج لكتابة نفس التعليمات التي قمنا بكتابتها في الفصل السابق.هذا البرنامج ذي الاسم h.asm موجود و يمكنك الإطلاع عليه القرص المرفق, بداية هذه الترويسة للبرنامج.

——————————————————- ;

;Simple boot program that prints the letter ‘H’

;Disclaimer: I am not responsible for any results of the use of the contents

;of this file

——————————————————–;

تبدأ التعليمات في هذه البرنامج بشكل مشابه لما عرضناه في الفصل السابق, أولا تأتي التعليمة التي تقوم بالقفز فوق معطيات سجل الإقلاع و ذلك بالقفز للعنوان begin و بعد القفز فوق هذه المعطيات و هي حوالي 20 بايت من المعطيات لها البنية التالية (حيث قمت باستخلاصها من قرصي المرن بواسطة المنقح) و يمكنك التأكد من ذلك و عليك الانتباه أن الأرقام المؤلفة من أكثر من بايت واحد ستكون معروضة بشكل معكوس byte swapped بسبب بنية Intel و بحيث يخزن البايت الأقل أهمية في المكان ذو العنوان الذاكري الأقل والعكس بالعكس.

; ———————————————————————-

; data portion of the “DOS BOOT RECORD”

; ———————————————————————-

brINT13Flag DB 90H ; 0002h – 0EH for INT13 AH=42 READ

brOEM DB ‘MSDOS5.0’ ; 0003h – OEM name & DOS version(8 chars(

brBPS DW 512 ; 000Bh – Bytes/sector

brSPC DB 1 ; 000Dh – Sectors/cluster

brResCount DW 1 ; 000Eh – Reserved (boot) sectors

brFATs DB 2 ; 0010h – FAT copies

brRootEntries DW 0E0H ;; 0011h – Root directory entries

brSectorCount DW 288 ;; 0013h – Sectors in volume, < 32MB

brMedia DB 240 ;; 0015h – Media descriptor

brSPF DW 9 ; 0016h – Sectors per FAT

brSPH DW 18 ; 0018h – Sectors per track

brHPC DW 2 ; 001Ah – Number of Heads

brHidden DD 0 ; 001Ch – Hidden sectors

brSectors DD 0 ; 0020h – Total number of sectors

DB 0 ; 0024h – Physical drive no.

DB 0 ; 0025h – Reserved (FAT32)

DB 29H ; 0026h – Extended boot record sig

brSerialNum DD 404418EAH ; 0027h – Volume serial number (random)

brLabel DB ‘Joels disk ‘ ; 002Bh – Volume label (11 chars)

brFSID DB ‘FAT12 ‘ ; 0036h – File System ID (8 chars)

;————————————————————————

لننتقل الآن إلى الشفرة المكتوبة بعد اللائحة Begin حيث ستجد أنها تشبه تماما ما عرضناه في الفصل السابق, فهو يقوم ببساطة بطباعة الحرف H على الشاشة ثم يدخل في حلقة لا نهائية, و في نهاية الشفرة نقوم بالتأكد أن حجم هذا الكود هو 512 بايت و الذي يقابل حجم قطاع واحد و من ثم يأتي السطر ذو الكلمة “times” و الذي يضيف أصفار إلى نهاية الملف بحيث يكون حجم الكود 510 بايت و بعد ذلك نضيف البايتين المعروفين 0x55, 0xAA و اللذان يحددان أن القطاع هو قطاع إقلاع إلى نهاية القطاع.

; ——————————————–

; Boot program code begins here

; ——————————————–

; boot code begins at 0x003E

begin:

mov ah, 0x0e ; Function to print a character to the screen

mov al, ‘H’ ; Which character to print

mov bl, 7 ; color/style to use for the character

int 0x10 ; print the character

 

hang:

jmp hang ; just loop forever.

 

;———————————————

 

size equ $ – entry

%if size+2 > 512

%error “code is too large for boot sector”

%endif

times (512 – size – 2) db 0

db 0x55, 0xAA ;2 byte boot signature

الآن لديك الملف كامل في القرص المرفق, كذلك لديك برنامج NASM قم بفك ضغطه مثلا إلى قرص السيC وضع داخل مجلده الملف المراد ترجمته ثم قم بترجمة الملف بواسطة المجمع كالتالي:

nasm h.asm –o h.bin

سيولد لك ملف ثنائي h.bin تأكد أن حجمه هو 512 بايت من خلال خصائص الملف,

قم الآن بنسخ الملف إلى قرصك المرن و بعد ذلك شغل المنقح و اكتب التالي:

debug

-n c:\nasm\h.bin

-l 0

ستقوم الشفرة السابقة بتحميل الملف إلى الذاكرة بدءا من العنوان 0 ويمكنك التأكد من محتوياته و انه تحمل بشكل صحيح من خلال التعليمتين dump (d) و unassemble (u). حيث عند تنفيذ التعليمة d ستلاحظ أن الملف قد أضيف له أصفار حتى عنوان البايتين x1FE and 0x1FF حيث وضع فيهما قيمتين ثابتتين و طبعا هي توجد عند نهاية القطاع.

-d

136E:0180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….

136E:0190 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….

136E:01A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….

136E:01B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….

136E:01C0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….

136E:01D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….

136E:01E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 …………….

136E:01F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA …………..U.

يمكنك أن تلاحظ أيضا إن المسجل CX سيحتوي بعد ذلك عدد البايتات المحملة من الملف و طبعا يمكنك عرض محتويات المسجل بالأمر R:

-r

AX=0000 BX=0000 CX=0200 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=136E ES=136E SS=136E CS=136E IP=0100 NV UP EI PL NZ NA PO NC

136E:0100 0000 ADD [BX+SI],AL DS:0000=EB

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

-w 0 0 0 1

اعد الإقلاع و سترى نفس النتيجة و هي طباعة الحرف h, في الفصل القادم سنقوم بطباعة “Hello, World”.

طباعة العبارة “Hello, World! “

الآن دعونا ننتقل للغوص في برامج الإقلاع و كتابة نظام تشغيل خاص بنا و ككل المبتدئين في لغات البرمجة لا بد أن بدأت حياتك البرمجية ببرنامج “Hello, World” دعونا نقوم بالشيء بالنسبة لنظام التشغيل و ليكن نظامنا ذو الاسم“Hello, World” operating system . سنقوم بإنشاء تابع يقوم بطباعة نصstring و من خلاله سوف نعرض جملتنا المنشودة. سيكون من الممل أن نقوم بطبع الجملة من خلال طبع الأحرف بشكل متتالي لذلك سنقوم بإنشاء تابع يقوم بطباعة سلسلة نصية تنتهي بالصفر على الشاشة و يكون ذلك من خلال حلقة بسيطة كل الأحرف ضمن السلسلة النصية في نفس الوقت.

; ———————————————

; Print a null-terminated string on the screen

; ———————————————

putstr:

lodsb ; AL = [DS:SI]

or al, al ; Set zero flag if al=0

jz putstrd ; jump to putstrd if zero flag is set

mov ah, 0x0e ; video function 0Eh (print char)

mov bx, 0x0007 ; color

int 0x10

jmp putstr

putstrd:

retn

دعونا نلقي نظرة سريعة على عمل التابع السابق.نقوم بداية بتحميل العنوان للحرف الأول للسلسة النصية إلى المسجل SI و من ثم نستدعي ببساطة التابع الفرعي putstr. ويمكنك تشكيل السلسلة النصية كالتالي:

msg db ‘Hello, World!’, 0

و يتم الإشارة لنهاية السلسلة ب الصفر و يبقى أمر طباعتها ببساطة كالتالي:

mov si, msg ; Load address of message

call putstr ; Print the message

بقي أمر واحد عليك إعداده قبل أن يعمل برنامجنا . إن العنوان ل MSG المحمل إلى المسجل SI هو عبارة عن إزاحة عن البداية من بداية القطعةsegment التي يؤشر لها بالمسجل DS, لذلك قبل أن تستطيع استخدام العنوان MSG يجب أن تقوم بإعداد قطعة المعطيات الحالية current data segment, دعونا الآن نقوم باستخدام العنونة من أسفل الذاكرة RAM ولتحديد قطعة المعطيات بحيث تبدأ من الأسفل نقوم بإسناد القيمة 0 إلى المسجل DS و تقوم التعليمات التالية بذلك:

xor ax, ax ; Zero out ax

mov ds, ax ; Set data segment to base of RAM

لم يبق سوى إعادة الخطوات السابقة للحصول على برنامج إقلاع يطبع الجملة الشهيرة HELLO WORLD. إذا قم بنسخ الملف helowrld.asm إلى مسار NASM على سطح القرص C في حالتنا , قم بترجمته كما سبق .

أكثر من طباعة جملة

طبعا إن طباعة جملة على الشاشة أمر جيد و لكن أي نظام تشغيل يحتاج لشيء من التفاعل مع المستخدم و ليس مجرد عرض المعلومات, دعونا نضفي شيئا من التفاعلية على نظام تشغيلنا الوليد و ذلك بجعله يقرأ دخل من لوحة المفاتيح. سنقوم بقراءة الدخل من لوحة المفاتيح اعتمادا على مقاطعات بيوس BIOS و ليس دوس DOS و من أجل ذلك سنستخدم التابع function 0 مع المقاطعة 16 (interrupt 0x16) كالتالي:

xor ah, ah ; we want function zero

int 0x16 ; wait for a keypress

يقوم هذا التابع بجعل الحاسب ينتظر حتى أن يتم ضغط مفتاح من لوحة المفاتيح و يخزن شفرة المسح للمفتاح المضغوط في المسجل AH و شفرة الاسكي ASCII code في المسجل AL. سنقوم بهذا الوقت بإضافة شيء من التفاعلية و ذلك في الملف المرفق lesson5.asm.

; ——————————————–

; Boot program code begins here

; ——————————————–

; boot code begins at 0x003E

begin:

xor ax, ax ; zero out ax

mov ds, ax ; set data segment to base of RAM

mov si, msg ; load address of our message

call putstr ; print the message

 

loop1:

xor ah, ah ; function 0

int 0x16 ; get a key from the keyboard

 

mov si, charmsg ; load address of message

call putstr ; print the message

 

mov ah, 0x0e ; function print character

mov bl, 0x07 ; white on black

int 0x10

mov si, newline ; print a newline

call putstr

jmp loop1 ; just loop forever.

; ——————————————-

أما المعطيات كالتالي:

; data for our program

msg db ‘Press a key.’

Newline db 13,10,0

Charmsg db ‘Character: ‘,0

و التابع من أجل الطباعة كما سبق مع تعديل بسيط:

———————————————

; Print a null-terminated string on the screen

; ———————————————

putstr:

push ax

putstrl:

lodsb ; AL = [DS:SI]

or al, al ; Set zero flag if al=0

jz putstrd ; jump to putstrd if zero flag is set

mov ah, 0x0e ; video function 0Eh (print char)

mov bx, 0x0007 ; color

int 0x10

jmp putstrl

putstrd:

pop ax

retn

;———————————————

محمل الإقلاع Boot Loader

كل ما كتبناه في الفصول السابقة تم وضعه ضمن القطاع الأول بحيث أصبح برنامج الإقلاع موجود ضمن القطاع الأول من القرص, و لكن كما نعلم انه من المستحيل أن يقتصر نظام تشغيلنا على 512 بايت فقط فما هو الحل ؟ الحل هو بكتابة برنامج إقلاع يقوم ببساطة بتحميل ملف تنفيذي من القرص و يبدأ بتنفيذه و يدعى هذا البرنامج بمحمل الإقلاع Boot Loader, و يكون الملف الذي سنحمله من القرص بالحجم الذي نريده و لن يقتصر حجمه على قطاع واحد. أنها لفكرة جيدة أن نعرج قليلا على نظام الملفات FAT حيث سنفترض أننا نستخدم هذا النظام من الملفات في بحثنا هذا, دعونا الآن نلقي نظرة سريعة إلى عملية تحميل الإقلاع boot loading process.

عملية تحميل الإقلاع

يحتوي القرص المرن في حالتنا هذه على سجل الإقلاع DOS (القطاع الأول من القرص الذي نعمل عليه ), جدول توضع الملفات File Allocation Table (FAT), مجلد الجذر the Root Directory, و من ثم المعطيات المحتواة في الملفات على القرص المرن. بالنسبة للقرص الصلب hard disk فالأمر أكثر تعقيدا, حيث يحتوي على سجل الإقلاع الأساسي Master Boot Record و مبدأ تعدد الأجزاء multiple partitions.

لنفترض أننا قمنا بكتابة نظام تشغيل و قمنا بترجمته إلى ملف سميناه LOADER.BIN و وضعناه على القرص الصلب , إن مهمة محمل الإقلاع هو تحميله كالتالي:

تتم قراءة سجل إقلاع دوس DOS Boot Record (DBR) لتحديد حجم الأشياء التالية: DBR, FAT, Root Directory و بذلك يتحدد موقع كل منهم على القرص.

تتم قراءة مجلدة الجذر Root Directory إلى الذاكرة.

يبحث ضمن المجلد الجذر Root Directory عن الملف ذو الاسم فإذا وجد يمكننا عندئذ البحث ضمن مدخل المجلد directory entry للبحث عن أول عنقودcluster (وحدة توضع الملف file allocation unit ) للملف, أما إذا لم يوجد سنعطي رسالة خطأ .

تتم قراءة جدول توضع الملفات من القرص إلى الذاكرة..

نبدأ من العنقود cluster الأول للملف و نستخدم نظام الملفات FAT لوضع جميع العناقيد التي تخص الملف,و تتم قراءتهم من القرص إلى الذاكرة عند موقع محدد .

نقفز إلى ذلك العنوان و نبدأ تنفيذ نظام التشغيل.

يجب أن تتم جميع عمليات القراءة من القرص بواسطة استدعاءات بيوس BIOS, يمكنك الإطلاع على توابع البيوس المستخدمة من أجل قراءة القطاعات من القرص, على كل حال ستجد محمل إقلاع يتعامل مع نظام الملفات FAT و هو بالاسم BOOT12.ASM ويمكنك ترجمته وتنفيذه كما تعلمنا سابقا .

محمل الإقلاع

هناك عدة إعدادات قابلة للتعديل ضمن هذا المحمل loader, هذا المحمل loader يفترض استخدام نظام الملفات FAT12 و هو النظام الذي تتم به تهيئة القرص المرن. و لذلك من اجل نظام آخر عليك استخدام محمل loader آخر, تتلخص الأشياء التي يمكنك تعديلها بمواقع نظام التشغيل و بنى المعطيات المختلفة لنظام FAT التي سيتم تحميلها إلى الذاكرة, طبعا يمكنك تعديل اسم نظام التشغيل الذي سيقوم المحمل loader بتحميله.

افتراضيا يقوم المحمل بتحميل الملف المسمى LOADER.BIN الموجود على مجلد الجذر إلى الذاكرة بدءا من العنوان 0x1000:0000 و يمكنك تعديل العنوان من خلال : %define IMAGE_SEG و بذلك يمكنك ترجمة نظام تشغيلك و نسخه إلى القرص المرن بالاسم LOADER.BIN . دعونا نعتبر أن نظام تشغيلنا هو ذلك النظام الذي يقوم بطباعة جملة Hello World على الشاشةpointer, في الفصل الرابع و سنشغل نظامنا بمحمل الإقلاع هذا, لا يمكننا نفس الملف الذي برمجناه حرفيا في الفصل الرابع و إنما علينا القيام ببعض التعديلات الصغيرة, أحد التعديلات التي تلفت النظر أنه يجب الانتباه أن الملف سيتم تحميله إلى موقع مختلف ضمن الذاكرة و هو 0x1000:0000 عوضا عن 0000:7C00, تعديل آخر أنه يمكننا التخلص و حذف معطيات سجل الإقلاع دوس DOS Boot Record data.سنبدأ شفرتنا بتحديد قطع المعطيات و المكدس data and stack segments و مؤشر المكدس stack pointer , و سنقوم بذلك على النحو التالي :

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

mov ax, cs ; Get the current segment

mov ds, ax ; The data is in this segment

cli ; disable interrupts while changing stack

mov ss, ax ; We’ll use this segment for the stack too

mov sp, 0xfffe ; Start the stack at the top of the segment

sti ; Reenable interrupts

أخيرا يمكننا التخلص من بعض الأسطر في نهاية البرنامج التي تقوم توقيع قطاع الإقلاع و تتأكد أن حجم الملف هو 512 بايت فلسنا بحاجة لذلك الآن و ستجد نظام تشغيلنا تحت الاسم lesson6.asm في القرص المرفق , قم بترجمة البرنامج و نسخه للقرص المرن باسم آخر

nasm lesson6.asm –o lesson6.bin

copy lesson6.bin a:\LOADER.BIN

و يصبح برنامج Hellowrld كالتالي:

;———————————————————————-

; Hello World Operating System;

; Disclaimer: I am not responsible for any results of the use of the contents

; of this file

;———————————————————————-

 

; Here is the operating system entry point

; ——————————————–

begin:

mov ax, cs ; Get the current segment

mov ds, ax ; The data is in this segment

cli ; disable interrupts while changing stack

mov ss, ax ; We’ll use this segment for the stack too

mov sp, 0xfffe ; Start the stack at the top of the segment

sti ; Reenable interrupts

 

mov si, msg ; load address of our message

call putstr ; print the message

 

hang:

jmp hang ; just loop forever.

 

; ——————————————–

; data for our program

 

msg db ‘Hello, World!’, 0

 

; ———————————————

; Print a null-terminated string on the screen

; ———————————————

putstr:

lodsb ; AL = [DS:SI]

or al, al ; Set zero flag if al=0

jz putstrd ; jump to putstrd if zero flag is set

mov ah, 0x0e ; video function 0Eh (print char)

mov bx, 0x0007 ; color

int 0x10

jmp putstr

putstrd:

retn

الآن كل ما هو مطلوب منك نسخ ملف نظام تشغيلك ذو الاسم Loader.bin مع برنامج الإقلاع boot12.bin إلى القرص المرن و من ثم نسخ برنامج الإقلاع boot12.bin إلى قطاع الإقلاع على القرص المرن كما تعلمنا سابقا .أعد الإقلاع و استمتع بالجملة Helo,World! .يلخص الشكل التالي عملية الإقلاع في الحاسب.

 

تعدد الإقلاع Multi booting:

أصبح الآن من البديهي القول أن كل نظام تشغيل يحتاج لمحمل إقلاع لتحميله و تشغيله و في البداية كان يتم كتابة برنامج إقلاع خاص بكل نظام تشغيل و كان لكل حاسب نظام تشغيل خاص به، و مع مرور الزمن شعر المستخدمون بالحاجة لوجود أكثر من نظام تشغيل على أجهزتهم بحيث يستطيعون تنزيل أكثر من نظام تشغيل و التنقل بين نظام و آخر عند إقلاع الحاسب. هذه الضرورة استدعت وجود معيار موحد لنواة نظام التشغيل بحيث تكون داعمة لمبدأ تعدد الإقلاع.يوجد ثلاث مالتالية:ية لواجهة محمل الإقلاع و يقوم هذا المعيار بتحديد ما يجب إضافته و تعديله للمبادئ التالية:

صيغة نظام التشغيل كما يراه محمل الإقلاع.

حالة الآلة عندما يبدأ محمل الإقلاع بتحميل النظام.

صيغة المعلومات التي يتم تمريرها من محمل الإقلاع لنظام التشغيل.

صيغة نظام التشغيل

إن صيغ نظام التشغيل المدعومة في هذا المعيار هي صيغة الملفات الثنائية bin و التي لها اللاحقة التالية out و أيضا الملفات التنفيذية من النوع ELF و تجدر الإشارة هنا إلى أن النوعان السابقان يستخدمان في الأنظمة المبينة على فلسفة UNIX و منها نظامنا الذي بصدد شرحه.

حالة الآلة

عندما يقوم محمل الإقلاع باستدعاء نظام التشغيل يجب أن تكون الآلة محققة المواصفات التالية:

CS must be a 32-bit read/execute code segment with an offset of 0 and a limit of 0xffffffff.

DS, ES, FS, GS, and SS must be a 32-bit read/write data segment with an offset of 0 and a limit of 0xffffffff.

The address 20 line must be usable for standard linear 32-bit addressing of memory (in standard PC hardware, it is wired to 0 at

EAX must contain the magic value 0x2BADB002; the presence of this value indicates to the OS that it was loaded by a MultiBoot-compliant boot loader (e.g. as opposed to another type of boot loader that the OS can also be loaded from).

EBX must contain the 32-bit physical address of the multiboot_info structure provided by the boot loader (see below boot up, forcing addresses in the 1-2 MB range to be mapped to the 0-1 MB range, 3-4 is mapped to 2-3, etc.).

Paging must be turned off.

The processor interrupt flag must be turned off.).

و أما باقي المسجلات و الأعلام في المعالج غير معرفة و هذا يشمل على وجه الخصوص:

ESP: the 32-bit OS must create its own stack as soon as it needs one.

GDTR: Even though the segment registers are set up as described above, the GDTR may be invalid, so the OS must not load any segment registers (even just reloading the same values!) until it sets up its own GDT.

IDTR: The OS must leave interrupts disabled until it sets up its own IDT

صيغة معلومات الإقلاع

يحتوي المسجل EBX العنوان الفيزيائي لسجل المعطيات ‘multiboot_info’ و الذي من خلاله يقوم محمل الإقلاع بتمرير المعلومات لنظام التشغيل و عندها يمكن لنظام التشغيل قراءة المعلومات منه. إن السجل multiboot_info و أقسامه الفرعية يمكن أن تتوضع في أي مكان في الذ1كرة من قبل محمل الإقلاع و من مسؤولية نظام التشغيل تجنب الكتابة على ذلك المكان لكي لا تمحى المعلومات.

صيغة multiboot_info

يأخذ السجل المتعلق بمعلومات سجل الإقلاع الصيغة التالية:

+——————-+

0 | flags | (required)

+——————-+

4 | mem_lower | (present if flags[0] is set)

8 | mem_upper | (present if flags[0] is set)

+——————-+

12 | boot_device | (present if flags[1] is set)

+——————-+

16 | cmdline | (present if flags[2] is set)

+——————-+

20 | mods_count | (present if flags[3] is set)

24 | mods_addr | (present if flags[3] is set)

+——————-+

28 – 40 | syms | (present if flags[4] or flags[5] is set)

+——————-+

44 | mmap_length | (present if flags[6] is set)

48 | mmap_addr | (present if flags[6] is set)

+——————-+

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

قسم التنفيذ Implementation

تحقيق تعدد الإقلاع Multi booting

فيما يلي لمحات عن تنفيذ و تحقيق تعدد الإقلاع و ذلك من خلال الوحدة multiboot.h.كما ذكرنا أن تعدد الإقلاع يدعم صيغتي out و ELF و بالتالي يجب تعريفهما أيضا ضمن ملف الترويسة لدينا :

تعريف الترويسة للصيغة out

//! The symbol table for a.out format.

typedef struct {

unsigned long tab_size;

unsigned long str_size;

unsigned long address;

unsigned long reserved;

}

aout_symbol_table_t;

تعريف ملف الترويسة للصيغة ELF

//! The section header table for ELF format.

typedef struct {

unsigned long num;

unsigned long size;

unsigned long address;

unsigned long shndx;

}

elf_section_header_table_t;

تعريف سجل الإقلاع

بعد أن وضحنا المبادئ السابقة يمكن ببساطة تعريف سجل الإقلاع على النحو التالي:

typedef struct multiboot_info

{

unsigned long flags;

unsigned long mem_lower;

unsigned long mem_upper;

unsigned long boot_device;

unsigned long cmdline;

unsigned long mods_addr;

union

{

aout_symbol_table_t aout_sym_t;

elf_section_header_table_t elf_sec_t;

} u;

unsigned long mmap_length;

unsigned long mmap_addr;

} multiboot_info_t;

التأكد من صحة الإقلاع

بقي أن نتأكد أن عملية الإقلاع تمت بنجاح و يتم ذلك بمقارنة البت المتعلق ب boot_device و ذلك بالكود التالي و الذي سيكون طبعا ضمن البرنامج الرئيسي و بداية نظام التشغيل أي ضمن main على النحو التالي:

main ()

//! The multiboot information pointer from GRUB.

extern multiboot_info_t *boot_info;

 

// Get some multiboot informations.

boot_info = (multiboot_info_t *)PHYSICAL((dword)boot_info);

if (boot_info->flags & 0x02)

{

printk( KERN_INFO

“Total amount of conventional memory: %uKB\n”,

((size_t)boot_info->mem_lower) );

}

else

{

printk( KERN_EMERG

“\nError reading multiboot informations… halting system!\n” );

}

 

محمل الإقلاع GRUB

ميزات Grub

محمل الإقلاع GRUB (GRand Unified Bootloader) هو برنامج مجاني مفتوح المصدر للقيام بتحميل نظام التشغيل ويحتوي محمل الإقلاع هذا على الكثير من المميزات وهي :

يقدم واجهة رسومية لا بأس بها.

يقدم محرر أوامر متكامل.

يتعرف على أجزاء القرص الصلب FDISK.

يقدم دعم لعدة أنظمة ملفات مثل FAT, EXT2 …

يمكنه إقلاع أكثر من نظام تشغيل.

الحصول على grub

يمكن الحصول على الملفات المصدرية للبرنامج و الملفات الثنائية المترجمة عن طريق الموقع التالي و باستخدام خدمة FTP:

Source code:ftp://alpha.gnu.org/gnu/grub/grub-0.92.tar.gz

Binaries:ftp://alpha.gnu.org/gnu/grub/grub-0.92-i386-pc.tar.gz

نحتاج لبعض الأدوات للعمل في بيئة وندوز و هي ARTCOPY or RAWRITE

http://www.execpc.com/~geezer/johnfine/index.htm#zero

http://uranus.it.swin.edu.au/~jn/linux/rawwrite.htm

http://www.tux.org/pub/dos/rawrite/

أما الصفحة الرئيسية للبرنامج فهي:

http://www.gnu.org/software/grub

متطلبات لا بد منها

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

GCC :

مترجم لغة السي و يجب أن يكون إصداره GCC 2.95 و ما فوق و يمكنك الحصول عليه من الرابط :

http://gcc.gnu.org/.

GNU Make:

يجب أن يكون لديك دعم لخاصية Automake و التي تعتمد على GNU Make و يمكنك الحصول عليها من الرابط :

http://www.gnu.org/software/make/make.html

GNU binutils 2.9.1.0.23:

يجب أن تمتلك الأدوات الخاصة ب GNO من أجل ترجمة بعض ملفات البرنامج و خاصة تلك المكتوبة بلغة المجمع و يمكنك الحصول عليه من الرابط: http://sourceware.cygnus.com/binutils

Texinfo 4.0:

يوجد بعض البريمجات (ماكرو) في المستندات و تحتاج لبرنامج قراءة المستندات السابق ويمكنك الحصول عليه من الرابط: http://www.gnu.org/software/texinfo/texinfo.html

تهيئة التطبيق Configuring the GRUB

تتم تهيئة البرنامج بواسطة الأمر `configure’ ضمن محث الأوامر حيث يقوم بعملية فحص للملفات و الشفرة المصدرية و التأكد أنها كاملة و لا مشكلة بها و غير ناقصة كما يقوم بتهيئة بعض المتحولات و القيم اللازمة خلال عملية التنصيب.

ترجمة البرنامج

إن أسهل طريقة لترجمة الحزمة البرمجية هو إتباع الخطوات التالية:

قم بالانتقال للدليل الذي يحتوي مجلد البرنامج و ذلك باستخدام الأمر CD و بعد الوصول هناك قم بكتابة الأمر `./configure’ لتهيئة الحزمة البرمجية على نظامك و بعد تنفيذ هذا الأمر سيقوم بعملية التهيئة و طباعة بعض العبارات على الشاشة التي توضح ماذا يجري.

قم بكتابة الأمر `make’ للقيام بترجمة الحزمة.

هناك أمر اختياري يمكنك كتابته أيضا و هو `make check’ لتشغيل فحص ذاتي للحزمة .

الآن قم بكتابة الأمر`make install’ لتنصيب البرنامج و الملفات الثنائية و المستندات اللازمة.

يمكنك حذف الملفات الثنائية الفرعية التي تم توليدها أثناء عملية الترجمة لكي لا تختلط بالشفرة المصدرية للبرنامج و ذلك عبر الأمر `make clean’.

يمكنك حذف الملفات التي قامت عملية التهيئة بتوليدها بكتابة الأمر`make distclean’ .

بشكل افتراضي يتم تنزيل الملفات في المسارات `/usr/local/bin’, `/usr/local/man’, etc. ويمكنك تغيير المسارات بواسطة استخدام الخيار التالي ضمن أمر `configure’ و الخيار هو : `–prefix=PATH’

الملفات النهائية

بعد الانتهاء من عملية الترجمة ستحصل على الملفات الثنائية التالية.Stage1, stage2, menu.lst حيث يكون حجم المرحلة الأولى Stage1 512 بايت. وهي الملف الواجب كتابته على قطاع الإقلاع.

إنشاء قرص إقلاع

الآن بعد أن حصلنا على الملفات الثنائية علينا كتابتها على قطاع الإقلاع في القرص الصلب و تنزيل البرنامج محمل الإقلاع عليه.

مراحل تنزيل البرنامج

بداية تحتاج لقرصين مرنين أحدهما تمت تهيئته بنظام ملفات ب\يتعرف عليه محمل الإقلاع GRUB مثل FAT12 أو EXT2 و الآخر عادي غير مهم لأنه ستحذف البيانات الموجودة عليه و سيستخدم كقرص وسيط.

نبدأ مع القرص الأول الذي يتعرف عليه محمل الإقلاع و ننسخ عليه الملفات الثنائية الناتجة معنا و ذلك على الدليل “/boot/grub/” وطبعا هذا يعني أن نقوم بإنشاء المجلدات السابقة لوضع الملفات ضمنها .

قم بدمج الملفين “stage1” and “stage2” إلى ملف واحد و قم بتسميته boot و يمكنك القيام بذلك عبر نظام التشغيل وندوز بالأمر التالي:

copy /b stage1 + stage2 boot

أما بواسطة لينكس فيتم بواسطة الأمر التالي:

cat stage1 stage2 >boot

قم الآن بكتابة الملف الناتج الجديد boot إلى القرص الثاني بدءا من قطاع الإقلاع و هذا يعني إتلاف القرص وضياع بياناته بالطبع و يمكن القيام بذلك ضمن وندوز عبر الأمر:

partcopy boot 0 168000 -f0

و ضمن لينكس عبر الأمر:

cat boot >/dev/fd0

طبعا يمكنك استخدام برامج أخرى للقيام بعملية النسخ ضمن وندوز مثل مجموعة bootprog.

أعد إقلاع الحاسب تاركا القرص الثاني فيه.

سيتم الإقلاع عبر القرص و ظهور عبارة GRUB و عندئذ قم بإزالة هذا القرص و وضع القرص الأول الذي يحتوي الملفات Stage1,stage2 , menu.lst و اكتب التعليمة :

setup (fd0)

حيث تشير fd0 إلى القرص المرن.

أصبح لدينا الآن القرص الأول قابل للإقلاع و يحتوي على برنامج GRUB عليك الانتباه و المحافظة على الملفات من التعديل أو الحذف.

إقلاع نواة نظام التشغيل

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

ضع النواة في مكان تعرفه.

أعد الإقلاع بوجود القرص.

اكتب التعليمة

root (hd0,1)
و التي تقوم بالانتقال للقرص الصلب الأول على الحاسب .

أخبر البرنامج عن موقع النواة

kernel /krnl.elf

كتابة ملف : menu.lst

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

# Sample boot menu configuration file

# default – boot the first entry.

default 0

# if have problem – boot the second entry.

fallback 1

# after 30 sec boot default.

timeout 30

# GNU Hurd

title GNU/Hurd

root (hd0,0)

kernel /boot/gnumach.gz root=hd0s1

module /boot/serverboot.gz

# Linux – boot ot gsecond HDD

title GNU/Linux

kernel (hd1,0)/vmlinuz root=/dev/hdb1

# booting Mach – get kernel from floppy

title Utah Mach4 multiboot

root (hd0,2)

pause Insert the diskette now!!

kernel (fd0)/boot/kernel root=hd0s3

module (fd0)/boot/bootstrap

# booting OS/2

title OS/2

root (hd0,1)

makeactive

# chainload OS/2 bootloader from the first sector

chainloader +1

# For booting Windows NT or Windows95

title Windows NT / Windows 95 boot menu

root (hd0,0)

makeactive

chainloader +1

# Colors change :0).

title Change the colors

color light-green/brown blink-red/blue

أما بالنسبة لنواة نظام تشغيلنا فيكون الملف كالتالي:

#

# Automatically generated by make: do not edit!

#

default 0

title MyOs

root (fd0)

kernel /kernel/mr32.gz

حيث يتم كتابة العنوان الذي سيظهر على الشاشة ضمن title.

النواة متعددة الإقلاع

يقوم البرنامج GRUB بتحميل نواة نظام تشغيل بشرط دعمها لمبدأ تعدد الإقلاع و هو ما سيتم شرحها في الفصل التالي و بالإضافة لشرط آخر أن تكون من النوع ELF أي مترجمة تحت بيئة لينكس و ليس وندوز حيث أن النوع ELF مكافئ للنوع EXE في وندوز و تكون النواة محققة لمبدأ تعدد الإقلاع عندما تحتوى على ترويسة تعدد الإقلاع أي Multiboot header و هذه الترويسة تحقق

يجب أن يكون رصف المقاطع بمقدار 32 بايت لكل مقطع.

يجب أن تظهر الترويسة في أول 8 كيل من ملف النواة.

يفهم المحمل ملفات ELF مباشرة فإذا كانت نواتك عبارة عن ELF فيكفي استخدام الترويسة التالية من أجل تعدد الإقلاع multiboot التالية:

; NASM syntax

MULTIBOOT_PAGE_ALIGN equ 1<<0

MULTIBOOT_MEMORY_INFO equ 1<<1

MULTIBOOT_HEADER_MAGIC equ 0x1BADB002

MULTIBOOT_HEADER_FLAGSequMULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO

CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)

; The Multiboot header

align 4

dd MULTIBOOT_HEADER_MAGIC

dd MULTIBOOT_HEADER_FLAGS

dd CHECKSUM

بعد إضافة الشفرة السابقة للنواة نعيد ترجمتها و نتأكد أنها متوافقة مع المحمل من خلال الأداة “mbchk” التي تفحص توافقيتها مع مبدأ تعدد الإقلاع.

18يوليو

تصميم نظم التشغيل

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

إن هذه الأطروحة شاملة لكافة الخطوات اللازمة و تقع في حوالي 472 صفحة تشمل كل المفاهيم النظرية والبرمجية اللازمة، كما تصلح إن نقحت كمادة علمية مميزة لمنهج نظم التشغيل لما تتضمنه من أسس ومبادئ.

يمكن تحميل الأطروحة من هنا.

ملخص الأطروحة:
تعتبر هذه الدراسة أحد أشمل الدراسات  التحليلية و التصميمية لبناء نظام تشغيل للحاسب الشخصي بالإضافة لتنفيذ هذا النظام بحيث يكون متعدد  المهام، والخيوط، والعمليات، والمستخدمين، ويكون عبارة عن نظام مغلق closed يقلع به الحاسب و يتعامل مع الذاكرة والأجهزة المحيطية، بالإضافة إلى تعامله مع كرت الشبكة وبروتوكول TCP/IP. ويزود هذا النظام دعماً كاملاً للغة العربية حيث يمكن تنفيذ الأوامر باللغة العربية.
مميزات النظام:
يتميز نظام التشغيل بما يلي:
• نسخة عربية كاملة و نسخة أخرى إنكليزية كاملة ويمكن للمستخدم اختيار أحدهما عند الإقلاع ليعمل عليها.
• تعدد الإقلاع: يمكن إقلاعه مع أنظمة أخرى موجودة على الجهاز مثل وندوز و لينكس.
• الإقلاع من قرص مرن أو قرص مضغوط دون الحاجة لتنزيله على الهارد.
• يعمل في النمط المحمي Protected Mode.
• متعدد المهام Multitasking
• متعدد الخيوط Multithreading
• متعدد العمليات Multiprocessing
• متعدد المستخدمين Multiuser
• يستطيع التعامل مع جميع أنواع الذواكر، حتى حجم أعظمي 4GB.
• التعامل مع بطاقة الشاشة في النمط النصي Text Mode ضمن النمط المحمي للنظام.
• توفير كونسولات متعددة MultiConsole.
• دعم لغتين في النمط النصي عربية وانكليزية، مع امكانية تحميل أي لغة أخرى.
• التعرف على القرص الصلب والمرن والتعامل معهما
• دعم كل من نظامي الملفات EXT2، FAT12.
• استخدام الشبكة في مستوى نواة النظام مما يؤمن سرعة و أمن أكبر
• إمكانية إرسال البيانات لأي جهاز آخر عبر بروتوكول TCP/IP وبالتالي يستطيع نظام التشغيل الاتصال مع أي نظام تشغيل آخر يدعم بروتوكول TCP/IP.
• أكثر من 30 أمر للتعامل مع النظام متاحة باللغتين العربية والانكليزية، مع شرح وافي عن كل منها.

يمكن الإقتباس شرط الإشارة للمصدر.