سؤال

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

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

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


يحرر

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

هل كانت مفيدة؟

المحلول

هذه مجموعة من بايت (متجاورة)، كما قلت:

my_arr db 5, 2, 8, 9, 1, 7, 3, 0, 4, 6

هذا متغير يحتل 10 ميغابايت (وهو أمر كبير بالنسبة لذاكرة التخزين المؤقت لمعهد وحدة المعالجة المركزية):

wasted_space BYTE 10485760 DUP(?)

فيما يلي العديد من المتغيرات مع الكثير من المساحة الضائعة بين:

my_var_1 db 5
spacer_1 BYTE 10485760 DUP(?)
my_var_2 db 2
spacer_2 BYTE 10485760 DUP(?)
my_var_3 db 8
spacer_3 BYTE 10485760 DUP(?)
my_var_4 db 9
spacer_4 BYTE 10485760 DUP(?)
my_var_5 db 1
spacer_5 BYTE 10485760 DUP(?)
my_var_6 db 7
spacer_6 BYTE 10485760 DUP(?)
my_var_7 db 3
spacer_7 BYTE 10485760 DUP(?)
my_var_8 db 0
spacer_8 BYTE 10485760 DUP(?)
my_var_9 db 4
spacer_8 BYTE 10485760 DUP(?)
my_var_10 db 6

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

هناك طريقة أخرى للحصول على عناوين الذاكرة هي استدعاء APIs O / S، والتي تخصيص الذاكرة من كومة الكومة وإرجاع عنوان تلك الذاكرة المخصصة، على سبيل المثال، واجهات برمجة التطبيقات Heapalloc أو Virtualalloc.


لا أعرف لماذا تفعل هذا في ASM (باستثناء تعلم التجميع). إذا كان الأمر يتعلق بالخزن التخزين المؤقت، فقد اعتقدت أنك تستطيع أن تفعل ذلك أيضا (وأكثر سهولة) باستخدام C.

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

(التخزين المؤقت) لديه، على مر السنين، تصبح موضوعا معقدا، على ما يبدو. http://lwn.net/articles/252125/ هو مقال مرتبط من ويكيبيديا. تتضمن هذه المقالة بعض الرسوم البيانية، على سبيل المثال الشكل 3.11: قراءة متتابعة لعدة أحجام.

نصائح أخرى

الوصول إلى الذاكرة غير المباشرة في التجميع

لعلاج البايتات في مجموعة كعاول الذاكرة، ستحتاج إلى تحميلها في سجل يمكن أن يكون بمثابة عنوان أساسي، ثم الوصول إلى الذاكرة المدببة بواسطة السجل:

MOV AX, [MY_ARR+3]  ; Element 3 in array, that is 9
MOV BX, [AX]        ; Read from that address

حول مخابئ

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

أيضا، اعتبر أن ذاكرة التخزين المؤقت الخاصة بك ربما تكون مرتبطة، مما يعني أن العناوين متباعدة للغاية يمكن أن تتناسب معا في ذاكرة التخزين المؤقت إذا لم تحدث في خطوط ذاكرة التخزين المؤقت نفسها (كاملة).

لنفذ فعلا ذاكرة التخزين المؤقت وضمان أن يكون لديك للوصول إلى الذاكرة مباشرة، يجب عليك الوصول (في حلقة) مجموعة من مواقع الذاكرة المتتالية أكبر من ذاكرة التخزين المؤقت الخاصة بك. أي إنشاء مجموعة كبيرة مثل ذاكرة التخزين المؤقت الخاصة بك. تأخذ أيضا في الاعتبار أن هناك طبقات متعددة من ذاكرة التخزين المؤقت متعددة (L1، L2، ربما L3 ومزيد من المعلومات)، فكيف يجب أن تعتمد حجمها على ذاكرة التخزين المؤقت التي تريد تجاوزها.


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

ومع ذلك، لم يكن برنامجي الطريقة الأكثر فعالية في القيام بذلك، وكذلك لم تلمح الكثير من الزملاء في ذاكرة التخزين المؤقت (يجب عليك قياس ذلك بشكل منفصل مع معرفة مخطط التلوين). ومع ذلك تم القيام به كلاهما بكفاءة كبيرة بطريقة مستقلة نسبيا مع عدد قليل من الحيل التفكير في Sigmetrics 2005 عمل لاري مكفوي وكارل ستيلين.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top