Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- أنا كنت بجرب خاصية البحث ووصلت للموضوع ده فحبيت أضيف رأيي
- أول شيء لازم تتقن السي. آه ممكن تستعمل لغة غير السي لكن السي صممت خصيصا للغرض ده وفي نظري أفضل لغة بتعبر عن حيثيات الهاردوير.
- بعد اتقانها وعمل مشاريع أخرى باستخدمها ابدأ تاتة تاتة بانك تحاول تحاكي نظام تشغيل باستخدام الادوات المتاحة لديك. يعني بإختصار حاول تقسم كل حاجة شرايح.
- - الذاكرة:
- حاول مثلا تعمل malloc بدون استخدام دوال خارجية. اعمل array وفكر إزاي تقسمه شرايح وتعطيها لدوال مختلفة. فكر إزاي ممكن تخليها زي اللي في السي بالضبط (malloc, free, realloc). بعدين اقرا إزاي غيرك عملها (مثلا What every programmer should know about Memory - Drepper).
- حاول تحسن من الكود بتاعك بالحاجات اللي إنت قريتها. افهم إنت ليه بتعمل كده.
- - البروسيسور:
- من مميزات نظام التشغيل إنه بينظم التشغيل. اتدرب إزاي تشغل حاجات في نفس الوقت. بمعنى آخر إزاي تقسم وقت البروسيسور لشرايح؟ كمثال حاول إنك تعمل green threads بإستخدام الدوال في.setjmp.h مش عارف يعني إيه green threads؟ اقرا عنها نفس الكلام ل setjmp. فرتك ال manual.
- بعد مايكون عندك منتج كامل اقرا أكتر إيه عمل ال scheduler وإزاي ممكن تحسن البرنامج اللي إنت كتبته.
- مش لاقي مكان مناسب بس على حد ماأفتكر Deep C Secrets فيه فصل عن ال threading. ممكن تقراه.
- - الدوال:
- افهم كيف بيتم استدعاء الدوال. اقرا عن الأنواع المختلفة على نظامك (cdecl,stdcall, pascal, fastcall...الخ). حتقبلك كلمة كتيرة ربما عندك معرفة سطحية عنها بس. اقرا عنها. يعني إيه stack. يعني إيه register. ليه كده ومش كده. اعمل دوال varargs في السي. افهمها ليه هي بتعمل اللي بتعمله. فكر إزاي ممكن تعمل الدوال اللي في varargs بنفسك. هل ينفع تستدعي دالة في السي بعدد متراوح من ال arguments أثناء عمل البرنامج؟ ينيع تقول وال برنامج شغال استدعي الدالة الفلانية بمدخلات كذا وكذا؟ المعيار بيقول لأ بس لو فهمت ال varargs صح حتعرف إن عال x86 ينفع بسهولة بإستخدام varargs. اعملها. لو مش عارف اقرا عن ال FFI وحاول تاني.
- (حاجة أنا لقيتها مفيدة برضه في التعلم هي ال hooking. إزاي تخلي الدالة y عند استدعائها تستدعي x بدون مايكن لديك سورس ل y. لو عندك لعبة بتلعبها عالكمبيوتر. اقرا إزاي تستعمل المعلومات دي في إنك تخم في اللعبة (اما دالة قلل الصحة تستخدم. اشرب عصير القوة أو مااعرفش إيه).
- فيه برنامج اسمه cheatengine معمول مخصوص لانك تخم في الالعاب. شوف لعبتك المفضلة واستخدم البرنامج ده عشان تخم فيه. اقرا ليه إنت بتعمل الخطوات اللي حتلاقيها مكتوبة على منتدى البرنامج. خم بضمير.
- - ال debugger:
- حاول ولو معرفة سطحية إنك تفهم ليه ال debugger حاجة جامدة فحت وإزاي تستعمله لحاجة بسيطة. شغل البرامج اللي إنت كتبتها فيه وامشي خطوة بخطوة. مش شرط تفهم ال assembly بس شوف سير البرنامج وإيه التغييرات اللي بتطرأ على ال stack. المفروض تكون عرفتها من الجزئية اللي فاتت بس دي حترسخ المفهوم لديك.
- يوجد كتب كتيرة جدا بس لو لقيت tutorial عن استخدام ال ollydbg غالبا حيفي بالغرض.
- - ال IO
- اتعلم إزاي نظم تشغيل تانية بتطبق مكتبة السي.(كتاب The C Standard Library مثلا) اقرا عن ال file descriptors وافهم إزّي تتعامل معاهم عشان تعمل زيهم. اكتب برامج باستخدامها عشان يكون عندك فكرة إزاي الكتابة والقراية بتتنظم.
- ربما تحب تتعمق في الموضوع وتشوف مكتبات تانية. شوف مثلا libev أو libuv (الأخيرة تدعم الويندوز). اقرا عنهم وافهم إزاي بيشتغلوا. كلاهم برضه بيدعموا ال threads. حاول تعمل برامج بإستخدام مكتبة مناسبة عشان يكون عندك فكرة إزاي بيتم ال threading.
- (ال libuv ليه كتاب على github. ابحث عنه)
- - ال interrupts
- نظام التشغيل لازم يكون عنده الامكانية إنه يتعامل لا تزامني مع الحاجة. اقرا عن select واخواتها وافهم إزاي بتتعامل مع ال signals.
- (تجاهل ال MSDN. وابحث في موقع ال linux عن الموضوع ده وشوف إزاي بيتم هناك)
- سطب ال dosbox وابدأ اتعلم إزاي تتعامل مع دوال ال BIOS. اقرا عنها وحاول تقرا من لوحة المفاتيح واعرف إيه اللي متاح ليك (دوال ال BIOS هي الوحيدة المتاحة لديك أما تبرمج نظام تشغيل).
- بعد ماتتعلم إزاي تعمل interrupts عشان تقرا في ال DOS وتكتب ابدا تحاول تعمل الامثلة البسيطة دي في ال assembly.
- اعمل برامج كونسل بسيطة زي اللي بدأت تتعلم بيها سي بس بالاسمبلي. مش شرط تتقنها 101% بس يكون عندك امكانية إنك تعمل اللي إنت عايزه حتى لو الجودة زبالة.
- عندك مشكلة ممكن تخلي الكومبيلر يطلع assembly من كود C إنت كتبته. حاول تفهمه.
- بما إنك اتقنت وعرفت يعني إيه دالة. مش حتقبلك مشكلة في التوفيق بين دوال C ودوال assembly.
- الكود الرئيسي حيكون C. ال assembly حتحتاجه لكتابة بعض الدوال اللي ماينفعش تكتبها في السي (كل مايتعلق بالعالم الخارجي).
- دلوقتي المفروض تكون مستعد إنك تبدأ. حتكتب bootloader كخطوة اولانية. بما إنك عارف أساسيات ال assembly حتلاقيه سهل فشخ. ال bootloader بتاعك حيحمل ال kernel اللي موجودة في الفلوبي (برنامج ال QEMU مفيد لو ماعندكش floppy) إلى الذاكرة ويهيء العملية لتشغيل النواة بشرط على يزيد طوله عن 512 بايت.
- دلوقتي عندك برنامج جاهز بيشتغل كاملة بدون نظام تشغيل.
- حاول تطبق بقى الحاجات اللي عملتها في الأول في النظام ده. ابدأ بإنك توفر مكتبة شبه مكتبة السي.
- يعني اعمل malloc شبه اللي عملتها قبل كده. واعمل scheduler شبه اللي إنت عملته.
- طبق دوال ال signal.h اللي استخدمتها قبل كده بإستخدام ال hardware exceptions.
- برمج handlers للحاجات اللي ممكن تحصل أما تشغل برامج تانية:
- مثلا قسمة على صفر أو قراءة ذاكرة غير مطابقة.
- ---
- تكملة: (ماكنتش أعرف إن فيه عدد اقصى لحجم الكمنت في الفيس)
- حاول تعمل منظومة بدائية للإدخال والإخراج. خلي ال files الموجودة في انظمة ال unix وحتى الويندوز (اقصد الدوال مثل open, _pipe, select, dup2 .. الخ) قدوة ليك وحاول تحاكيها. لو مش عارف اقرا في المعيار (POSIX و ISO C) بيقول إيه عنها.
- اقرا أكتر عن ال interrupts وإزاي تقرا من ال floppy. حاول تخلي دوال ال files
- لديك تقدر تتعامل معاها. فكر في ال defrag. إزاي تحاول تخلي الفلوبي ال fragmentation فيه قليلة.
- لحد الآن أنت لسة ماعندكش نظام تشغيل ولكن بيئة تشغيل فقط. باستخدام الخبرة اللي اكتسبتها أثناء برمجة ال handlers برمج طريقة لأن يتم استدعاء ال kernel كل فترة معينة من الزمن.
- غير الكود بتاع ال scheduler بتاعك لانه يتعامل مع الاستدعاءات دي.
- خلي هدفك إن نظام التشغيل يكون في أي وقت عادر على اغلاق برنامج آخر عنوة.
- اقرأ أكتر عن ال scheduling. (عموما اقرا كل حاجة تلاقيها عن الموضوع مش
- العناوين اللي هنا بس)
- حسن من الواجهة. اتعلم إزاي ترسم على الشاشة وازاي تتعامل مع الماوس.
- حتى الآن أنت في ال real mode يعني 16 بت فقط وحجم الذاكرة 1 ميجا بس لديك دوال ال BIOS.
- الخطوة القادمة إنك تنقل لل prootected mode أي 32 بت وانك تبدأ تطبق drivers
- للتعامل المتقدم مع الحاجات التانية (عند هذه المرحلة غالبا ستستسلم وتستخدم نواة أخرى. دلوقتي الوقت المناسب إنك تقرا كتاب عن حيثيات نواة اللينكس)
- ونكتفي بهذا القدر.
- طبعا ناقصه حاجات كتيرة فحت بس هو يعتبر نظام دي مافيهاش كلام وانت سألت عن بداية فأظن كلامي ينفع
- //Addendum:
- - undefined behaviour. understanding why behaviour is left undefined at times and what the behaviour on x86 might be.
- - signed overflow, function sig mismatch, read/write outside of array, unreferencing NULL .. etc.
- in order to build up an understanding of the mechanics of such things
- resources: LLVM post about UB maybe.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement