الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مجموعة متنوعه من الأسئله المتعلقه بالبروسسور

بدأه C++er في 26 أبريل 2010 · 13 رد · 1,644 مشاهدة · في أرشيف قسم الـــ Assembly
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

توجد لدي مجموعه من الأسئله متعلقه بالبروسسور بحثت عن اجابات و التالى منهم هو مالم اجد له اجابه:

1 -البروسسور الـ 32bit لا يستطيع ان يتعامل مع الذاكره اعلى من 4 جيجا فى حين ان بعض بروسسرات انتل تدعم ما يسمى بـ PAE او Physical Address Extension و التى تتيح للبروسسور ان يتعامل مع الذاكره الأعلى من 4 جيجا فكيف تتم هذا؟ هل تحدث هذه العمليه مثلما يتعامل البروسسور 64 بت مع الذاكره؟

2 - كيف أستطيع حساب سرعة البروسسور؟ حاولت بإستخدام rdtsc و لكنى لم استطع الحصول عليها.

3 - احاول تضمين الداله sleep و التى تقوم بعمل Execution Delay لفتره زمنيه معينه بإستخدام تعليمات البروسسور و لكنى فشلت فى كل مره، هل يعرف احدكم كيف تتم هذه العلميه؟

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#2

إلي أعـــلى

مدونتي: C++ Tips and Tricks

#3

أعلى من كده مفيش :D

أسئلتك بحاجة للمخمخة.. سنمخمخ سوياً إن شاء الله في الأيام القادمة.

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#4

كما قال Xacker

1) google it , ستحتاج لبحث اكثر وقد تجد الإجابة

2) شخص ما كتب هذا

http://www.win32asm.com.cn/view.asp?file=67

جربه , لا أعلم ان كان يعمل

3) ضع ما عملته حتى يعلم الآخرين ما فعلته ...

#5

شكرا ليكم يا جماعه.

@YaSeenTA

1 - بحثت كتيير قوى و مازلت لا اجد و لكنى لن امل و سأكمل البحث ان شاء الله.

2 - الكود الموجود بالرابط يعمل لويندوز فقط، انا اريد كود اسمبلى صــــرف (لا يوجد به اى استدعاءات لأى دوال تتعلق بنظام تشغيل معين).

3 - مش عارف النقطه دى غابت ازاى عني :blink: ، شكرا لتذكيرك سأضعها بعد قليل :wacko:

مدونتي: C++ Tips and Tricks

#6

2) لم أكن أعلم ذلك ..

هل بالإمكان إخبارنا أين تريد إستعمال هذا الشئ؟ ولماذا؟

إطلع على هذا الملف من intel

http://www.intel.com/assets/pdf/appnote/241618.pdf

فيه عدد من الأمثلة الرائعة

الصفحة رقم 105 تحوي الجزء الخاص بـ Frequency Detection .

لا أعلم هل سيفيدك في شئ أم لا ..

حظ موفق

1
#8

حقيقى يا ياسين انا مش عارف من غيرك كنت هعمل ايه.

بارك الله فيك و زادك علما و نفعك به.

سأقرأ ما تشير إليه الروابط و سأعلق عليهم.

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#9

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

1- ماهو الغير مفهوم بالضبط ؟ لقد درست هذا الموضوع بعمق في الماضي ولم يكن هناك شئ مريب .

2/3 - أنا متأكد انه كان يوجد موضوع للأخ Ikossan تحدث فيه عن هذا الأمر لكن لا يمكنني ايجاده الان عن طريق البحث !

ربما هو مخفي او حدث للموضوع شئ ما ، اسأل المشرفين الأقدم اكيد يذكرون هذا الموضوع (يمكن X مازال يذكره) .

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

لم ارى هذا الموضوع من قبل :blink:

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#10

Up

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#11

معذره اخى GameingMasterR حيث انى ادخل قليلا هذه الأيام

اقتباس
ماهو الغير مفهوم بالضبط ؟

داخل الـ 64bit العنونه فى النهايه هى Displacement حيث عندما يكتب كود كالتالى

00001000  jmp Ah ; jump to 0000100A
   .
   .
   .
0000100A  ....

او كالتالى

00001000  mov  eax, 5h
00001001  call eax; the calling address is 00001006
   .
   .
   .
00001006 ....

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

داخل الـ 32bit الأمور لا تتم كذلك (او هى كذلك فقط داخل الكود الذى يتم حفظه بالملف التنفيذى و لكن بعند ما يتم تحميله بالذاكره تصبح العناوين كلها relative للـ imageBase) حيث يكون الموقع المراد الإنتقال إليه هو موقع فعلى و ليس relative للموقع الحالى، لذا عندما نتكلم عن نظام عنونه اعلى من 32bit داخل بيئة 32bit فلابد من ان المعالج يتعامل مع الأمر بشكل مختلف، و هذا هو ما استفسر عنه.

و الله ولى التوفيق

تم تعديل هذه المشاركة بواسطة Muhammad alaa في 9 مايو 2010 في 04:42

مدونتي: C++ Tips and Tricks

#12

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

الموضوع يطول شرحه لكن سأحاول عرضه بشكل مبسط .

فلننسى الآن أمر الـPAE ولنتحدث عن الوضع العادي حيث الـ4KB Pages لمعالجات x86 وبالتحديد في نظم NT (لجعل الأمور واضحة فقط)، كيف يقوم المعالج بتحويل أي عنوان افتراضي Virtual Address إلى العنوان الفيزيائي Physical Address المقابل له كي يتم الوصول إلى الجزء الصحيح من الذاكرة الفيزيائية ؟

يتم ذلك عن طريق تجزئة الـVA إلى 3 حقول وهي الـPage Directory Index بطول 10 بت، تليها الـPage Table Index بطول 10 بت أيضا، يليهم الـByte Index بطول 12 بت (المجموع = 32 بت وهو طول أي مؤشر في x86) .

فلنفترض أن لدينا العنوان الوهمي 0x7F56E112 ونريد تحويله إلى العنوان الفيزيائي .

أولا سنقوم بتقسيمه كما سلف كالتالي :

Page Directory Index = 0111111101b = 0x1FD

Page Table Index = 0101101110b = 0x16E

Byte Index = 000100010010b = 0x112

يتعرف المعالج أولا على عنوان الـPage Directory عن طريق احد مسجلات التحكم وهو cr3 وهو عبارة عن Physical Address وليس Virtual Address، بالطبع نظام التشغيل هو الذي يقوم بتحميل العنوان الصحيح إلى cr3 مع كل Context switch من Thread إلى آخر في عمليتين مختلفتين ، يتم حفظ هذه القيمة في الـProcess Object Block لكل عملية (KPROCESS بالتحديد) .

الـPage Directory عبارة عن مصفوفة من الـEntries تسمى الـPDE وهي بطول 4 بايت ، يحتوي كل Entry على مجموعة من الـFlags بالإضافة إلى حقل يحتوي عنوان الـPage Table الذي يحتوي على عنوان الـPage المراد الوصول إلى احد أجزائها ويسمى الـPage Frame Number او PFN اختصارا وطوله 20 بت من حجم الـPDE/PTE .

يتم أولا التعرف على عنوان الـPage Directory عن طريق cr3 ولنفترض انه كان 0x5000 (أذكرك أننا نستخدم هنا عناوين فيزيائية وليست وهمية) ، يتم استخدام الـPage Directory Index للوصول إلى الـPDE المراد وهو يساوي هنا 0x1FD ، إذا عنوان الـPDE = 0x5000 + 0x1FD*4 = 0x57F4 .

يتم النظر داخل الـPDE لمعرفة إذا كان الـPage Table موجود وصالح أم لا (وباعتبار أننا بصدد التعامل مع 4KB Pages فقط) ، ثم يتم معرفة الـPFN للـPage Table ، فلنفترض أن الـPFN = 0x23 ، أي أن الـPage Table عنوانه هو الـPhysical Page صاحب الترتيب 0x23 ، أي 0x23000 (حيث أننا نعمل على نظام حجم الـPAGE فيه هو 4 كيلو بايت) .

إذا الـPage Table المراد البحث داخله يقع في العنوان 0x23000 ، الـPage Table مثله مثل الـPage Directory عبارة عن مصفوفة هو الآخر من الـEntries تسمى كل واحدة اختصارا الـPTE وهي بطول 4 بايت أيضا ولها نفس تركيب الـPDE من حيث الـFlags و الـPFN ، يتم استخدام الـPage Table Index لمعرفة الـEntry الصحيح المراد البحث داخله ، في حالتنا الـPage Table Index هو 0x16E ، إذا عنوان الـPTE هو 0x235B8 ، فلنفترض أن الـPFN = 0x362 ، إذا عنوان الـPhysical Page المقصود هو 0x362000 .

بهذا نكون قد حصلنا على عنوان الـPAGE الذي يحتوي على الـData المراد الوصول إليها في الذاكرة الفيزيائية ، لم يبقى سوى أن نقوم بعمل إزاحة بقيمة الـByte Index إلى أن نصل إلى العنوان المراد من الذاكرة الفيزيائية وسيكون 0x362112 .

هذا ابسط ما يمكن قوله ، لكن في الحقيقة هناك أشياء أخرى كثيرة تفرض نفسها في هذا الموضوع إذا أردنا الحديث بشكل واقعي عن أي Memory Manager محترم لأي OS مثل الـCaching Tables (TLB) و الـPage Fault Handling ، لكن هذا موضوع آخر ;) .

الآن فلنعد إلى موضوعنا الرئيسي وهو الـPAE Mode وكيفية عمله !

حسنا، عند تفعيل الـPAE يتم ترجمة أي عنوان وهمي إلى العنوان الفيزيائي المقابل له بنفس الطريقة التي سلف ذكرها مع تعديلات بسيطة ، وهي استخدام طبقة أخرى للـIndexing عن طريق وجود حقل رابع أثناء تقسيم العنوان الوهمي بغرض عمل Indexing يتيح الوصول إلى عدد اكبر من الـPhysical Pages .

التقسيم الجديد للـVA هو كالتالي ، 2 بت يستخدم كـPage Directory Pointer Index ثم 9 بت لكل من الـPage Directory و الـPage Table ثم 12 بت للـByte Index .

في هذه الحالة فان cr3 يحمل العنوان الفيزيائي للـPage Directory Pointer والذي يشير بدوره إلى الـPage Directory ، وبما أن الـPDPI طوله 2 بت فقط إذن يمكنه أن يشير إلى 4 PDPEs فقط ، أيضا حجم الـEntries في الـPAE Mode لكل من الـPDPE/PDE/PTE هو 8 بايت (36 بت فقط المستخدمة) ، وبما أننا نستخدم 9 بت كـIndex للـPDE/PTE إذن كل PDPE يمكنه أن يشير إلى 512 PDE فقط (9^2 = 512) وكل PDE يمكنه أن يشير إلى 512 PTE ، وبما انه لدينا 4 PDPE إذن مجموع الـPTEs التي يمكننا الحصول عليها = 512 * 512 * 4 = 1048576 وهو نفس العدد الذي نحصل عليه عند عدم تفعيل الـPAE حيث عدد الـPTEs = 1024 * 1024 = 1048576 .

إذا ما الذي يجعل نظام الـPAE يتمكن من عمل mapping لذاكرة فيزيائية اكبر من 4 جيجا بايت ؟

في الحقيقة السبب وراء ذلك هو زيادة حجم الـPDE/PTE نفسها إلى 36 بت بدلا من 32 بت ، هذه الزيادة تقع في الـPFN مما يعني زيادة حجمها من 20 بت إلى 24 بت ، في النظام العادي يمكن للـPFN أن يشير إلى 2 ^ 20 = 1048576 Pages ، إذا أردنا حسابها بالبايت فسنقوم بضرب 1048576 * 4094 = 4 جيجا بايت (حيث حجم الـPage الواحد = 4096 بايت) .

أما في نظام الـPAE فان الـPFN يمكنه أن يشير إلى 2 ^ 24 = 16777216 Pages ، أي 16777216 * 4096 = 64 جيجا بايت .

يمكنك تجريب تحويل بعض العناوين يدويا في نظامك ، استعمل WinDbg للمساعدة (استخدم الـ!pte extension وأخواتها ) .

بالمناسبة كنت قد كتبت أداة قديما لغرض شخصي للتحويل من العناوين الوهمية الى الفيزيائية لكن ينقصها الكثير ولا تدعم الـPAE ، سأحاول إعادة كتابتها ودعم المزيد من الـPTE Types إن أمكن وسأرفقها لك .

أنا متواجد هذه الأيام لأي سؤال

دمتم بدود :)

3

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#13

ربنا يكرمك يا جى.

اسئلتى التاليه متعلقه ببيئة الـ 32bit داخل ويندوز xp او 2003 سرفر

اقصى مساحة من الذاكره متاحه للبرنامج العامل قدرها 4 جيجا و هى اقصى مساحة يستطيع ان يتعامل معها المعالج مع عدم وجود PAE و لكن مع وجودها هل هذا يزيد مدى المساحه المتاحه للبرنامج ؟

و إذا افترضت انها تزيد من قدر المساحه المتاحه له كيف للبرنامج أن يعلم قدرها حتى يستغلها إن احتاج لها؟

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

و الله ولى التوفيق

مدونتي: C++ Tips and Tricks

#14
اقتباس
اقصى مساحة من الذاكره متاحه للبرنامج العامل قدرها 4 جيجا و هى اقصى مساحة يستطيع ان يتعامل معها المعالج مع عدم وجود PAE و لكن مع وجودها هل هذا يزيد مدى المساحه المتاحه للبرنامج ؟

و إذا افترضت انها تزيد من قدر المساحه المتاحه له كيف للبرنامج أن يعلم قدرها حتى يستغلها إن احتاج لها؟

مساحة الذاكرة الوهمية المتاحة دائما في x86 هي 4GB ، سواء تم تفعيل PAE او لا ، الزيادة تحدث في الذاكرة الفيزيائية التي يمكن عمل Allocation لها ثم Virtual Mapping .

اقرأ عن الـAddress Windowing Extensions او AWE لمعرفة كيفية استغلال الذاكرة الفيزيائية اكبر من 4GB وعمل Mapping لها في اي Process تريد .

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

لا ، يمكن لنظام العنونة ان يمتد من 36 بت الى 52 بت ، لكن هذا يعتمد على الـHardware و الـOS معا.

يمكن معرفة حجم العنوان (MAXPHYADDR) عن طريق :

CPUID.80000008H:EAX[7:0]

هذا اذا كان البروسيسور يدعم الـPAE طبعا ، يمكنك استخدام CPU-Z يعمل Dump للـCPUIPD .

حسب معلوماتي اخر اصدار للـNT PAE Kernel يدعم فقط 38 بت (اتكلم عن IA32 وليس IA32e) .

بالطبع لم يقع تحت يدي معالج يدعم اكثر من 36 بت ، هل لديك واحد يدعم نظام عنونة اكبر من 36 بت ولديك شريحتين رام كل واحدة 64 جيجا كي نجرب ؟ :P

1

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

مواضيع مشابهة

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…