GamingMasteR

Kernel-mode Programming #1

13 ردود في هذا الموضوع

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

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

يمكن تقسيم مكونات النظام كالتالي :-

User-mode components :

- Subsystem : وهو يتمثل في العملية Csrss.exe وهو المسؤول عن الـConsoleWindows بالاضافة الى انشاء وحذف الـThreads .

- System Processes : وهي تتمثل في العمليات التي تساعد النظام بشكل اساسي كي يعمل مثل SMSS.EXE/WINLOGON.EXE .

- Services : وهي عمليات لابد من وجودها كي تستطيع برامج اخرى ان تعمل بشكل صحيح مثل SQL Server/Spooler/MS Exchange Server .

- User Applications : وهي البرامج العادية التي نستخدمها يوميا .

Kernel-mode components :

- Kernel : ويحتوي على الروتينات الاساسية لنظام التشغيل مثل الـInterrupts Dispatcher/Thread Scheduler/Synchronization System .

- Executive : يحتوي على الـMemory Manager/Objects Manager/Security/IO System/Networking .

الـKernel و الـExecutive يتواجدان في ملف ntoskrnl.exe وهو يمثل نواة النظام .

- Hardware Abstraction Layer (HAL) : وهي طبقة لعزل باقي الكرنل عن الهاردوير بانواعه المختلفة والغرض من ذلك هو الـPortability حيث ان كل hardware مختلف سيحتاج الى HAL مختلف فقط بدون التعديل في باقي الكرنل لأن الـHAL هو الذي يوفر روتينات التعامل مع الهاردوير .

يوجد الـHAL في ملف HAL.DLL .

- GUI Kernel : وهو المسؤول عن الـUserInterface كالتعامل مع النوافذ و كائنات الـGDI كلها , ويتمثل في ملف win32k.sys .

post-51753-1245135663_thumb.jpg

الفرق بين User-mode و Kernel-mode :

في مستوى المستخدم User-mode كل عملية لها ذاكرة وهمية VirtualMemory خاصة بها , كل Thread داخل العملية يتم تنفيذ الكود الخاص به داخل هذه الـVM ولا يمكنه تغيير الذاكرة الوهمية الخاصة بعملية اخرى , في مستوى الكرنل يمكن لأي Thread ان يغير من ذاكرة أي بروسس اخر وسنتكلم عن ذلك لاحقاً .

أيضا من المعلوم ان هناك Privileged Instructions لا يستطيع Thread يعمل في اليوزر مود استخدامها مثل IN/OUT/ LLDT , في مستوى الكرنل يمكنك استخدام جميع التعليمات بلا أي قيود .

أي Thread يعمل في اليوزر مود لا يمكنه استخدام موارد النظام مباشرة مثل الذاكرة الخاصة بالنظام او التعامل مباشرة مع الـHardware .

عند حدوث أي خطأ في Thread يعمل بمستوى المستخدم ولم يكن هناك ExceptionHandler فإن الذي يحدث هو إغلاق البروسس الذي يحتوي على الـThread , بينما عند حدوث خطأ اثناء عمل الـThread بمستوى النظام ولم يكن هناك ExceptionHandler مناسب فان النظام كله ينهار وربما يحدث bugcheck و ترى الشاشة الزرقاء BSoD .

هل يمكن الانتقال للكرنل من خلال Thread يعمل في يوزر مود ؟؟

نعم , وذلك عن طريق استدعاء خدمات النظام او عن طريق احداث Exception او استدعاء المقاطعات , لكن اثناء وجود الـThread في الكرنل مود لا يمكنك التحكم في سير التنفيذ حتى يعود الـThread الى الوضع السابق .

هل يمكنني استدعاء دوال الـuser-mode مثل الدوال الموجودة في Kernel32.dll/User32.dll/Ntdll.dll من خلال الكرنل مود ؟

لا يمكنك فعل ذلك مباشرة , اذا كنت تظن انه يمكنك اظهار MessageBox من driver فأنت مخطئ تماماً , لكن بالطبع هناك طرق لفعل ذلك بشكل غير مباشر , سنتكلم عن هذا في الدروس اللاحقة .

ما هي انواع الذاكرة التي سنتعامل معها ؟

نوعان PagedPool/NonpagedPool , PagedPool هي الذاكرة التي يتم عمل swapping لها اثناء انتقال الـExecution من process الى اخر فيتم تخزينها في الـPagefile الى ان ينتقل الـتنفيذ مرة اخرى الى نفس البروسس فيتم ارجاعها الى الرام , كمثال الذاكرة التي تحتوي على ملف dll في بروسس معين .

اما الـNonpagedpool فهي ذاكرة تظل موجودة في الرام ولا يتم تخزينها في الـPagefile حيث انها تمثل عناصر مهمة لا يستغني النظام عن تواجدها اثناء التنفيذ في أي بروسس كان , كمثال الـkernel نفسه و معظم الدرايفرات و الـExecutive Objects مثل الـObjects التي تمثل الـThread/Process/Key/Device .. الخ .

ما هي الادوات التي سنحتاجها للبدأ في كتابة درايفر ؟

سنحتاج الى حزمة الـDDK , أي نسخة ابتداءا من 2600 ستنفع , هذه النسخة التي استعملها حاليا وهي 3790 الخاصة بـWindows 2003 :

http://www.microsoft.com/whdc/devtools/ddk/default.mspx

لدي ايضا النسخة الخاصة بـWindows 7 لكن لم اجربها بعد .

ستحتاج أيضا الى أي اداة تقوم باظهار الـDebug Output مثل DbgView/KernelDetective/Syser , عن نفسي أفضل استخدام DbgView .

بالطبع ستحتاج الى أي محرر للكود , يمكنك استخدام VS/Code::Block/Notepad++ او أي شئ اخر .

اترككم يومين في رعاية الله حتى تحصلوا على العدة اللازمة للبدأ وكي اقوم انا بتحضير الدرس القادم :D

السبت 7/2/2009

GamingMasteR / AT4RE

References :

Microsoft® Windows® Internals, Fourth Edition - Mark E. Russinovich, David A. Solomon

تم تعديل بواسطه Wael Dalloul
2

شارك هذا الرد


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

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

وبالتوفيق إن شاء الله ..

0

شارك هذا الرد


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

هي صورة واحدة الموجودة , ألا تظهر عندك ؟؟

0

شارك هذا الرد


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

السلام عليكم ,,

جميل جداً GM كما عودتنا دائماً :)

الحقيقة هناك نقطة لم أفهمها, أعتقد أنها تافهة و لكن عقلي لم يستوعب الموضوع.

في مستوى المستخدم User-mode كل عملية لها ذاكرة وهمية VirtualMemory خاصة بها , كل Thread داخل العملية يتم تنفيذ الكود الخاص به داخل هذه الـVM ولا يمكنه تغيير الذاكرة الوهمية الخاصة بعملية اخرى , في مستوى الكرنل يمكن لأي Thread ان يغير من ذاكرة أي بروسس اخر وسنتكلم عن ذلك لاحقاً .

ما هو الفرق بين الذاكرة في الـ user mode و الـ kernel mode ؟

ببساطة عندما ننشئ process في الـ user mode كيف سيكون شكل الذاكرة بالنسبة لذلك الـ process و عندما ننشئ process في الـ kernel mode كيف سيرى الذاكرة ؟

و أود نصيحتك في مقال مفصل حول الذاكرة الوهمية :)

بالمناسبة المرجع لدي و سأطلع عليه.

الصور غير ظاهرة لأن الموقع محجوب في السعودية :(

في انتظار الجزء القادم :)

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

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
ما هو الفرق بين الذاكرة في الـ user mode و الـ kernel mode ؟

الفرق في هيكل الذاكرة نفسه ثابت ولا يتغير , الفرق موجود في امكانية الوصول الى اجزاء الذاكرة , ففي user-mode لا يمكنك التعامل سوى مع اول 2GB من الذاكرة (0x00000000->0x7fffffff) أما في kernel-mode يمكنك التعامل مع الـ4GB كلها .

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

بالمناسبة المرجع لدي و سأطلع عليه.

نصيحة من أخوك , أنا اول مرة اطلعت فيها على هذا المرجع العظيم تعجبت لما يعطيه الناس كل هذا الاهتمام , كنت اراه مجرد كلام سايح لا رأس له من قدم , استأت جداً بسبب عدم احتوائه على اكواد ايضاً !!

لا تنخدع مثل اخوك , فالمرجع جبار من ناحية الـconcepts :wink:

أيضاً لن تجد مثل مراجع Intel او AMD , لكنها تتكلم بشكل عام اما المرجع السابق فيتحدث عما يدور داخل انظمة NT .

بالنسبة للصور فقد انتهت المدة المتاحة لي لتعديل الموضوع , يمكن لأي احد من الاخوة المشرفين تعديل الموضوع شاكراً .

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

شارك هذا الرد


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

جميل جداً بدأت بالقراءة :)

متابع لموضوعك أيضاً ...

0

شارك هذا الرد


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

روعة كالعادة يا GM اكمل بارك الله فيك و انا معاك اخيرا هذا القسم سوف تظهر به مواضيع جديدة لتنشيط شبابه

0

شارك هذا الرد


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

تسجيل حضور ....

درس رائع .... راجعت فيه أشياء كثيرة نسيتها من أيام الدراسة :)

في إنتظار الدرس القادم ...

0

شارك هذا الرد


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

اخى العزيز GM فينك و فين اخبارك وفين بقية الدروس اوعى تكون ناوى تخلى بينا لاجى اقتلك :) اخى لعل المانع خير

0

شارك هذا الرد


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

انا ايضا لا زلت انتظر ،، ان شاء الله المانع خير.

الدروس من العيار الثقيل و تحتاج الى وقت للتحضير ... ربما

0

شارك هذا الرد


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

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

اطمئنوا لن اتوقف عن الكتابة والنقاط الاساسية تم تحديدها مسبقاً , لكن الجهاز لدي جنّ جنونه , هناك عيب في احد قطع الهاردوير ولم اتعرف عليها بعد .

0

شارك هذا الرد


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

اطمئنوا لن اتوقف عن الكتابة والنقاط الاساسية تم تحديدها مسبقاً , لكن الجهاز لدي جنّ جنونه , هناك عيب في احد قطع الهاردوير ولم اتعرف عليها بعد .

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

الحمد لله ،، اذا على الجهاز فبسيطة:lol:

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

0

شارك هذا الرد


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

السلام عليكم

اشكر الاخ العزيز gm على هذا الشرح الجميل

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

المقدمة 1

http://www.codeproject.com/KB/system/driverdev.aspx

الجزء 2

http://www.codeproject.com/KB/system/driverdev2.aspx

الجزء 3

http://www.codeproject.com/KB/system/driverdev3.aspx

الجزء 4

http://www.codeproject.com/KB/system/driverdev4asp.aspx

الجزء 5

http://www.codeproject.com/KB/system/driverdev5asp.aspx

الجزء 6

http://www.codeproject.com/KB/system/driverdev6asp.aspx

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

0

شارك هذا الرد


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

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

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