كتاب "جهاز ويندوز داخلي. الطبعة السابعة

الصورة منذ إصدار الإصدار السابق من هذا الكتاب ، قطع نظام التشغيل Windows شوطًا طويلاً في الترقيات والتغييرات المفاهيمية التي أدت إلى بنية مستقرة جديدة لـ Windows 10 kernel.

تم إنشاء كتاب "Windows Internal Device" للمحترفين الذين يرغبون في فهم الحياة الداخلية للمكونات الرئيسية لـ Windows 10. بناءً على هذه المعلومات ، سيكون من الأسهل على المطورين العثور على حلول التصميم المناسبة من خلال إنشاء تطبيقات لنظام Windows الأساسي وحل المشكلات المعقدة المرتبطة بتشغيلها. سيتمكن مسؤولو النظام ، الذين يعرفون ما هو موجود تحت غطاء المحرك تحت نظام التشغيل ، من فهم سلوك النظام وحل مشكلات زيادة الإنتاجية وتشخيص الأعطال بسرعة أكبر. سيحتاج اختصاصيو الأمان إلى معلومات حول التعامل مع الثغرات الأمنية في نظام التشغيل.

ديناميكيات قائمة الصفحات


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

الصورة

تنتقل كتل الصفحات بين قوائم الصفحات بالطرق التالية.

1. عندما يحتاج مدير ذاكرة إلى صفحة مليئة بالأصفار لخدمة خطأ في الصفحة يتعلق بمتطلب إعادة تعيين الصفحة (الوصول إلى صفحة تم تعريفها على أنها مليئة بالأصفار بالكامل ، أو إلى صفحة مغلقة ومثبتة من وضع المستخدم لم يتم الوصول إليها بعد) ، أولاً جرت محاولة للحصول على هذه الصفحة من قائمة هذه الصفحات. إذا كانت القائمة فارغة ، يتم أخذ الصفحة من قائمة الصفحات المجانية ومليئة بالأصفار. إذا كانت قائمة الصفحات المجانية فارغة ، يتم الوصول إلى قائمة صفحات الانتظار ويتم ملء صفحة من هذه القائمة بالأصفار.

2. أحد أسباب الطلب على الصفحات المملوءة بالأصفار هو تلبية متطلبات الأمان المختلفة - على سبيل المثال ، المعايير المشتركة (المعايير العامة). تشير معظم أحكام المعايير العامة إلى أن عمليات وضع المستخدم يجب أن تتلقى كتل صفحات صفرية بحيث لا يمكنها قراءة محتويات الذاكرة للعمليات السابقة. لذلك ، يوفر مدير الذاكرة عمليات وضع المستخدم مع كتل صفحات ملغاة ، ما لم تتم قراءة الصفحة من تخزين النسخ الاحتياطي. في هذه الحالة ، يستخدم مدير الذاكرة كتل صفحات غير قابلة لإعادة التهيئة ، وتهيئتها بالبيانات من القرص أو من التخزين البعيد. يتم تجديد قائمة الصفحات المملوءة بالأصفار من قائمة الصفحات المجانية بمؤشر ترابط برنامج نظام يسمى مؤشر ترابط صفري - وهذا هو مؤشر الترابط 0 في عملية النظام. ينتظر التدفق الصفري للصفحة إشارة للعمل من كائن البوابة. عندما يكون هناك ثماني صفحات أو أكثر في القائمة المجانية ، تصدر البوابة صفيرًا. ولكن لا يتم تشغيل مؤشر الترابط الصفري للصفحة إلا إذا لم يكن لدى معالج واحد على الأقل سلاسل تنفيذية أخرى ، حيث أن مؤشر الترابط الصفري للصفحة يبدأ بالأولوية 0 وأقل أولوية يمكن تعيينها لدفق المستخدم هي 1.
ملحوظة: عندما تكون الذاكرة بسبب تخصيص صفحة فعلية بواسطة برنامج تشغيل يستدعي وظيفة MmAllocatePagesForMdl أو MmAllocatePagesForMdlEx يجب أن يتم ملؤها بالأصفار بواسطة تطبيق Windows الذي يستدعي وظيفة AllocateUserPhysicalPages أو AllocateUserPhysicalPagesNuma ، أو عندما يستخدم التطبيق ذاكرة كبيرة تستخدم الذاكرة يعرض مساحات أكبر من تدفق الصفحة صفر ، إعادة تعيين صفحة واحدة فقط في كل مرة. بالإضافة إلى ذلك ، في أنظمة المعالجات المتعددة ، يقوم مدير الذاكرة بإنشاء مؤشر ترابط إضافي للنظام للتصفير في الوضع المتوازي (وعلى أنظمة NUMA الأساسية ، يتم ذلك بأسلوب محسن لتقنية NUMA).

3. عندما لا يحتاج مدير الذاكرة إلى صفحة مليئة بالأصفار ، فإنه يصل أولاً إلى قائمة الصفحات المجانية. إذا كانت هذه القائمة فارغة ، يتم الانتقال إلى قائمة الصفحات التي تحتوي على صفر. إذا كانت قائمة الصفحات المصفرة فارغة ، فإنها تذهب إلى قائمة الصفحات المعلقة. قبل أن يتمكن مدير الذاكرة من استخدام كتلة الصفحة من قائمة صفحات الانتظار ، يجب عليه أولاً الرجوع وإزالة الرابط من سجل PTE غير الصالح (أو من سجل PTE النموذجي) ، والذي لا يزال يشير إلى كتلة الصفحة. نظرًا لأن إدخالات قاعدة بيانات رقم PFN تحتوي على مؤشرات للخلف إلى الصفحة السابقة لجدول صفحة المستخدم (أو إلى صفحة تجمع مدخلات PTE النموذجية للصفحات المشتركة) ، يمكن لمدير الذاكرة العثور بسرعة على إدخال PTE وإجراء التغيير المقابل.

4. عندما يجب أن تتخلى العملية عن صفحة من مجموعة العمل الخاصة بها (إما لأنها تشير إلى صفحة جديدة ومجموعة العمل الخاصة بها ممتلئة ، أو لأن مدير الذاكرة قطع مجموعة العمل الخاصة بها) ، تنتقل الصفحة إلى قائمة الانتظار إذا بقيت على حالها دون تغيير (بدون تغيير) ، أو إلى قائمة الصفحات التي تم تغييرها ، إذا تم تغيير الصفحة أثناء وجودها في الذاكرة الفعلية.

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

تجربة: عرض قوائم الصفحات المجانية والمصفرة


يمكن ملاحظة إصدار الصفحات المغلقة في نهاية العملية في نافذة معلومات النظام في Process Explorer. تحتاج أولاً إلى إنشاء عملية تحتوي على الكثير من الصفحات المغلقة في مجموعة العمل الخاصة بها. لقد قمنا بذلك بالفعل في إحدى التجارب السابقة باستخدام أداة TestLimit:

C:\Tools\Sysinternals>Testlimit.exe -d 1 -c 1500 Testlimit v5.24 - test Windows limits Copyright (C) 2012-2015 Mark Russinovich Sysinternals - www.sysinternals.com Process ID: 13928 Leaking private bytes with touch 1 MB at a time... Leaked 1500 MB of private memory (1500 MB total leaked). Lasterror: 0 The operation completed successfully. 

التبديل –d يجعل TestLimit لا يقوم فقط بتحديد الذاكرة على أنها مغلقة ومؤكدة ، ولكن أيضًا "لمسها" ، أي الوصول إلى هذه الذاكرة. وينتج عن ذلك تخصيص الذاكرة الفعلية وتخصيصها للعملية لتحرير مساحة الذاكرة الظاهرية المغلقة المؤكدة. إذا كان النظام يحتوي على كمية كافية من ذاكرة الوصول العشوائي المتاحة ، فسيتم تخصيص 1500 ميجابايت للعملية في ذاكرة الوصول العشوائي. الآن ستنتظر هذه العملية حتى تجبرها على إكمال أو مقاطعة العمل (ربما مع تركيبة المفاتيح Ctrl + C في نافذة الأوامر الخاصة بها). اتبع هذه الخطوات.

1. افتح مستكشف العمليات.

2. حدد الأمر View InformationSystem Information (معلومات النظام) وحدد علامة التبويب Memory (الذاكرة).

3. لاحظ حجم قوائم الصفحات المجانية (Zeroed) و المجانية (Zeroed).

4. إنهاء أو إحباط عملية TestLimit.

قد تكون قادرًا على رؤية أن قائمة الصفحات المجانية قد زادت للحظات. نقول "ربما" لأن الدفق الصفري للصفحة "يستيقظ" بمجرد وجود ثمانية إدخالات فقط في قائمة الصفحات التي تحتوي على صفر ، وسيعمل بسرعة كبيرة. يقوم Process Explorer بتحديث هذه النافذة مرة واحدة فقط في الثانية ، ويبدو أن باقي الصفحات لديها بالفعل الوقت لإعادة تعيينها إلى قائمة صفحات إعادة التعيين ، بينما كنا قادرين على "التقاط" هذه الحالة. إذا تمكنت من ملاحظة زيادة مؤقتة في قائمة الصفحات المجانية ، فسترى بعد ذلك أن حجمها سينخفض ​​إلى الصفر ، وستحدث زيادة مقابلة في قائمة الصفحات صفر. إذا فاتتك اللحظة ، فسترى فقط زيادة في قائمة الصفحات التي تحتوي على صفر.

التجربة: عرض قوائم الصفحات المتغيرة والمتوقعة


يمكن ملاحظة نقل الصفحات من مجموعة العمل للعملية إلى قائمة الصفحات المعدلة ، ثم إلى قائمة صفحات الانتظار باستخدام برنامجي VMMap و RAMMap من حزمة Sysinternals أو في مصحح أخطاء kernel. اتبع هذه الخطوات.

1. قم بتشغيل برنامج RAMMap ولاحظ الحالة الهادئة للنظام. في هذه الحالة ، هو نظام x86 مع 3 غيغابايت من ذاكرة الوصول العشوائي. تعكس الأعمدة في النافذة الحالات المختلفة للصفحات (انظر الشكل 5.37). تم تضييق بعض الأعمدة غير ذات الصلة بهذه التجربة من أجل الراحة.

الصورة

2. يحتوي النظام على حوالي 420 ميجا بايت من ذاكرة الوصول العشوائي المجانية (تتكون من صفحات مجانية وصفرية). يظهر حوالي 580 ميغابايت في قائمة صفحات الانتظار (وبالتالي ، فإن بعضها "متوفر" ، ولكن على الأرجح يحتوي على بيانات فقدتها العمليات في السابق أو تم استخدامها في أخذ العينات الفائقة). حوالي 830 ميغابايت نشطة ، يتم تعيينها مباشرة إلى العناوين الافتراضية من خلال إدخالات جدول الصفحة الصالحة.

3. يتم تقسيم كل سطر أيضًا وفقًا لحالات الصفحات حسب الاستخدام أو الأصل (صفحات معالجة مغلقة ، ملف معروض ، إلخ). على سبيل المثال ، في لحظة 830 ميجا بايت النشطة ، حوالي 400 ميجا بايت بسبب تخصيص الصفحات المغلقة للعملية.

4. الآن ، كما في التجربة السابقة ، استخدم الأداة المساعدة TestLimit لإنشاء عملية تحتوي على عدد كبير من الصفحات في مجموعة العمل. هنا مرة أخرى ، نستخدم المفتاح –d لإجبار TestLimit على الكتابة على كل صفحة ، ولكن هذه المرة على سبيل المثال لا الحصر ، لإنشاء أكبر عدد ممكن من الصفحات المعدلة المغلقة:

 C:\Tools\Sysinternals>Testlimit.exe -d Testlimit v5.24 - test Windows limits Copyright (C) 2012-2015 Mark Russinovich Sysinternals - www.sysinternals.com Process ID: 7548 Leaking private bytes with touch (MB)... Leaked 1975 MB of private memory (1975 MB total leaked). Lasterror: 8 

5. الآن أنشأت TestLimit مجالات تخصيص 1975 لكل منها 1 ميجابايت. لتحديث الشاشة في RAMMap ، تحتاج إلى استخدام الأمر FileRefresh لتحديث الشاشة ، نظرًا لأن RAMMap لا يقوم بذلك من تلقاء نفسه (نظرًا لارتفاع تكلفة هذه العملية).

الصورة

6. كما ترى ، أكثر من 2.8 غيغابايت نشطة ، منها 2.4 غيغابايت في سطر صفحات العملية المغلقة (سطر العملية الخاصة). هذا هو نتيجة تخصيص الذاكرة والوصول إليها من عملية TestLimit. لاحظ أيضًا أن قوائم الصفحات الاحتياطية والصفرية والمجانية أصبحت الآن أصغر كثيرًا. تم أخذ معظم الذاكرة المخصصة لـ TestLimit من الصفحات المدرجة في هذه القوائم.

7. بعد ذلك ، باستخدام RAMMap ، تحتاج إلى تقييم تخصيص الصفحات الفعلية للعملية. انتقل إلى علامة التبويب "الصفحات المادية" وقم بتعيين عامل التصفية في أسفل عمود "العملية" ، وقم بتعيينه إلى Testlimit.exe. يعرض الإطار التالي جميع الصفحات الفعلية التي تعد جزءًا من مجموعة العمل الخاصة بالعملية.

الصورة

8. نحتاج إلى تحديد الصفحة الفعلية المعنية بتخصيص مساحة العنوان الفعلي ، والتي تم إجراؤها باستخدام مفتاح –d عند بدء تشغيل برنامج TestLimit. لا يعطي RAMMap أي إشارة إلى المناطق الافتراضية التي تم تخصيصها بسبب المكالمة من وظيفة RAMMap VirtualAlloc. ولكن يمكننا الحصول على تلميح قيم حول هذا الموضوع باستخدام برنامج VMMap. عن طريق استدعاء VMMap ل
من نفس العملية ، نحصل على النتيجة التالية (انظر الشكل في الصفحة 535 أعلاه).

9. يوجد في الجزء السفلي من المعلومات المعروضة مئات المناطق المخصصة لبيانات العملية المغلقة ، ويبلغ حجم كل منها 1 ميجا بايت مع 1 ميجا بايت من الذاكرة المؤكدة. هذا يتوافق مع حجم الذاكرة المخصصة من قبل TestLimit. يُبرز التقاط الشاشة السابق أول خيارات التوزيع هذه. لاحظ أن عنوانه الظاهري الافتتاحي هو 0x310000.

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

الصورة

11. يظهر هنا أن الصفحة الافتراضية التي تبدأ بالعنوان 0x310000 تم تعيينها حاليًا على العنوان الفعلي 0x212D1000. باستخدام رمز التبديل -d ، يكتب TestLimit اسمه إلى وحدات البايت الأولى لكل منطقة محددة. يمكن إظهار ذلك باستخدام الأمر! Dc الخاص بمصحح أخطاء kernel المحلي (يشير اختصار DC إلى "أحرف العرض" ، أي إخراج الأحرف إلى عنوان فعلي):

 lkd> !dc 0x212d1000 #212d1000 74736554 696d694c 00000074 00000000 TestLimit....... #212d1010 00000000 00000000 00000000 00000000 ................ ... 

12. في حالة التأخير ، قد تفشل المحاولة - قد يتم حذف الصفحة بالفعل من مجموعة العمل. في المرحلة الأخيرة من التجربة ، سنوضح أن البيانات تظل دون تغيير (على الأقل لفترة من الوقت) بعد تقليل مجموعة العمل الخاصة بالعملية ونقل الصفحة أولاً إلى قائمة التغييرات ثم إلى صفحات الانتظار.

13. بعد تحديد عملية TestLimit في VMMap ، افتح القائمة "عرض" وحدد الأمر Empty Working Set لتقليل مجموعة العمل الخاصة بالعملية. الآن في نافذة VMMap يجب عرض المعلومات التالية:

الصورة

14. لاحظ أن سطر مجموعة العمل فارغ تقريبًا. يُظهر الجزء الأوسط من العملية أن الحجم الإجمالي لمجموعة العمل هو 4 كيلوبايت فقط ، مع تقريبًا كل المساحة التي تشغلها جداول الصفحات. عد الآن إلى RAMMap. في علامة التبويب "استخدام التهم" ، يمكنك أن ترى أن عدد الصفحات النشطة قد انخفض بشكل كبير ، وهناك عدد كبير من الصفحات في قائمة التغييرات وعدد كبير من الصفحات في قائمة الانتظار.

الصورة

15. تؤكد البيانات الموجودة في علامة تبويب العمليات في RAMMap أن معظم هذه الصفحات ظهرت في هذه القوائم بسبب عملية TestLimit.

الصورة


»يمكن العثور على مزيد من المعلومات حول الكتاب على موقع الناشر على الويب
» المحتويات
» مقتطفات

خصم 20٪ على قسيمة ويندوز - ويندوز

Source: https://habr.com/ru/post/ar422269/


All Articles