سؤال

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

في الوضع الحقيقي ، تبلغ السجلات 16 بت فقط ، بحيث يمكنك معالجة ما يصل إلى 64 ألفًا فقط. In order to allow addressing of more memory, addressקד are calculated from segment * 16 + offset.

هنا يمكنني فهم السطر الأول. لدينا 16 بت ، حتى نتمكن من معالجة ما يصل إلى 2^16 = 64k.

ولكن ما هو هذا السطر الثاني؟ ما المقطع الذي يمثله؟ لماذا نضاعفها مع 16؟ لماذا نضيف الإزاحة. لا أستطيع أن أفهم ماهية هذا الإزاحة؟ هل يمكن لأي شخص أن يشرح لي أو يعطيني رابطًا لهذا من فضلك؟

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

المحلول

تحت ذاكرة الوضع الحقيقي x86 ، يبلغ طول العنوان الفعلي 20 بت ويتم حسابه:

PhysicalAddress = Segment * 16 + Offset

تحقق أيضا: إدارة الذاكرة الوضع الحقيقي

نصائح أخرى

عندما كانت Intel تقوم ببناء 8086 ، كانت هناك حالة صالحة لوجود أكثر من 64 كيلو بايت في الجهاز ، ولكن لم يكن هناك أي وسيلة لاستخدام مساحة عنوان 32 بت. في ذلك الوقت ، كان حتى ميغابايت مجموعة كبيرة من الذاكرة. (تذكر اقتباس سيئ السمعة "640K يجب أن يكون كافياً لأي شخص"؟ إنه في الأساس عملية سوء الترجمة لحقيقة أنه في ذلك الوقت ، كان 1 ميجابايت ينقط تسربت)

لذا ، بدلاً من تنفيذ مساحة عنوان ضخمة لدرجة أنه لن يتم استخدامها بالكامل ، فإن ما فعلوه هو تنفيذ عناوين 20 بت. ما زالوا يستخدمون كلمات 16 بت للعناوين ، لأنه بعد كل شيء ، هذا معالج 16 بت. كانت الكلمة العلوية هي "الجزء" وكانت الكلمة السفلية هي "الإزاحة". تداخل الجزءان بشكل كبير ، على الرغم من ذلك - "الجزء" هو جزء من الذاكرة 64 كيلو بايت تبدأ في (segment) * 16, ، و "الإزاحة" يمكن أن تشير إلى أي مكان داخل هذا الجزء. من أجل حساب العنوان الفعلي ، يمكنك مضاعفة الجزء المقطع من العنوان بمقدار 16 (أو تحويله تركه 4 بت ... نفس الشيء) ، ثم إضافة الإزاحة. عندما تنتهي ، لديك عنوان 20 بت.

 19           4  0
  +--+--+--+--+
  |  segment  |
  +--+--+--+--+--+
     |   offset  |
     +--+--+--+--+

على سبيل المثال ، إذا كان الجزء 0x8000 ، وكانت الإزاحة 0x0100 ، فإن العنوان الفعلي يخرج إلى ((0x8000 << 4) + 0x0100) == 0x80100.

   8  0  0  0
      0  1  0  0
  ---------------
   8  0  1  0  0

نادرا ما تكون الرياضيات أنيقة ، رغم ذلك - 0x80100 يمكن أن يمثلها حرفيًا الآلاف من القطاعات المختلفة: مجموعات الإزاحة (4096 ، إذا كانت الرياضيات الخاصة بي صحيحة).

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

كانت المشكلة التي ربما كنت أواجهها من نفسي أفهم حقًا كيف وضعت Commodore 64 (6502 Processor) الذاكرة. ويستخدم تدوين مماثل لمعالجة الذاكرة. يحتوي على 64 كيلو بايت من إجمالي الذاكرة ، ويستخدم قيم الصفحة 8 بت: إزاحة للوصول إلى الذاكرة. يبلغ طول كل صفحة 256 بايت (رقم 8 بت) وتشير الإزاحة إلى إحدى القيم في تلك الصفحة. يتم تباعد الصفحات إلى الوراء في الذاكرة. لذلك تبدأ الصفحة 2 من حيث تنتهي الصفحة 1. كنت أذهب إلى 386 أفكر في نفس النمط. الأمر ليس كذلك.

يستخدم الوضع الحقيقي نمطًا مشابهًا حتى لو كان جزءًا مختلفًا للصياغة: الإزاحة. الجزء هو 64 كيلو بايت. ومع ذلك ، فإن الأجزاء نفسها لا يتم وضعها متتالية مثل العميد البحري. فهي متباعدة 16 بايت بصرف النظر عن بعضها البعض. لا يزال الإزاحة يعمل على نفس الوقت ، مما يشير إلى عدد البايتات من START START.

آمل أن يساعد هذا التفسير أي شخص آخر يجد هذا السؤال ، فقد ساعدني في كتابته.

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

ضمن الوضع الحقيقي ، ليست السجلات 16 بت فقط ، لأن هناك أيضًا 6 سجلات أيضًا. كل من سجلات 8 بت هي جزء من سجل 16 بت مقسوم إلى جزء أقل وأعلى من سجل 16 بت.

وبدء بدء الوضع الحقيقي مع 80386+ ، سنصبح سجل 32 بت وأيضًا أيضًا بوقتين جديدتين من التعليمات ، أحدهما لتجاوز/عكس حجم المعامل الافتراضي وواحد لتجاوز/عكس حجم العنوان الافتراضي لتعليمات واحدة بداخله codesegress.

يمكن استخدام بادئات التعليمات هذه في تركيبة لعكس حجم المعامل وحجم العنوان معًا للحصول على تعليمات واحدة. ضمن الوضع الحقيقي ، يبلغ حجم المعامل الافتراضي وحجم العنوان 16 بت. مع كلتا البادئات في كلتا التعليمات ، يمكننا استخدام مثال معامل/تسجيل 32 بت لحساب قيمة 32 بت في سجل 32 بت واحد ، أو لنقل قيمة 32 بت من وإلى موقع Memmory. ويمكننا استخدام جميع سجلات 32 بت (ربما بالاشتراك مع Base+Index*Scale+Discome) باعتبارها مسجلاً عناوينًا ، ولكن لا يجب أن يتجاوز مجموع العنوان الفعلي الحد الأقصى لحجم 64 كيلو بايت. .

(في صفحة OSDEV-Wiki ، يمكننا العثور في الجدول لبادئة "المعامل بحجم وحجم العنوان" "أن" البادئة المعاملة 0x66 "و" 0x67 بادئة العنوان "هي N/A (غير قابلة للتحديد) لـ الوضع الحقيقي ووضع 8086 الظاهري. http://wiki.osdev.org/x86-64_instruction_encoding
ولكن هذا خطأ فادح ، لأنه في دليل Intel يمكننا العثور على هذا البيان: "يمكن استخدام هذه البادئات في وضع الإدمان الحقيقي وكذلك في الوضع المحمي ووضع الظاهري 8086".).

بدءًا من Pentium MMX ، أصبحنا ثمانية 64 بت MMX-Registers.
بدءًا من Pentium 3 ، أصبحنا ثمانية 128 بت XMM-Registers.
..

إذا لم أكن مخطئًا ، فلا يمكن استخدام سجل YMM-Legister 256 بت و 512 بت ZMM-LEGISTER وسجل الأغراض العامة 64 بت من X64 في الوضع الحقيقي.

ديرك

حد أدنى

مع:

  • إزاحة = msg
  • الجزء = ds
mov $0, %ax
mov %ax, %ds
mov %ds:msg, %al
/* %al contains 1 */

mov $1, %ax
mov %ax, %ds
mov %ds:msg, %al
/* %al contains 2: 1 * 16 bytes forward. */

msg:
.byte 1
.fill 15
.byte 2

لذلك إذا كنت ترغب في الوصول إلى الذاكرة أعلى من 64 كيلو متر:

mov $0xF000, %ax
mov %ax, %ds

لاحظ أن هذا يسمح للعناوين أكبر من 20 بت إذا كنت تستخدم شيء مثل:

0x10 * 0xFFFF + 0xFFFF == 0x10FFEF

على المعالجات السابقة التي تحتوي على 20 سلك العناوين فقط ، تم اقتطاعها ببساطة ، ولكن في وقت لاحق أصبحت الأمور معقدة مع خط A20 (سلك العنوان 21): https://en.wikipedia.org/wiki/A20_Line

على جيثب ريبو مع لوحة الغلاية المطلوبة لتشغيلها.

لا يمكن لسجل 16 بت معالجة ما يصل إلى 0xFFFF (65،536 بايت ، 64 كيلو بايت). عندما لم يكن ذلك كافيًا ، أضافت Intel سجلات القطاع.

أي تصميم منطقي كان من شأنه أن يجمع ببساطة من سجلين 16 بت لإنشاء مساحة عنوان 32 بت ، (على سبيل المثال 0xFFFF : 0xFFFF = 0xFFFFFFFF)، لكن nooooo... كان على أنتل للحصول على كل شيء غريب علينا.

تاريخياً ، كان للحافلة الأمامية (FSB) 20 سطرًا عناوين فقط ، وبالتالي لا يمكنها إلا نقل عنوان 20 بت. إلى "تصحيح" هذا ، ابتكر Intel مخططًا تقوم فيه سجلات القطاع بتمديد عنوانك فقط بمقدار 4 بت (16 بت + 4 = 20 ، من الناحية النظرية).

لتحقيق ذلك ، يتم تحويل سجل القطاع من قيمته الأصلية بمقدار 4 بتات ، ثم تمت إضافته إلى العنوان في السجل العام الخاص بك (على سبيل المثال [es:ax] = ( es << 4 ) + ax). ملاحظة: إن التحول اليسرى 4 بتات يعادل الضرب بمقدار 16.

هذا هو. إليكم بعض الأمثلة التوضيحية:

;; everything's hexadecimal

[ 0:1 ] = 1

[ F:1 ] = F1

[ F:0 ] = F0

[ F:FF] = 1EF ; [F becomes F0, + FF = 1EF]

[ F000 : FFFF ] = FFFFF (max 20-bit number)

[ FFFF : FFFF ] = 10FFEF (oh shit, 21-bit number!)

لذلك ، لا يزال بإمكانك معالجة أكثر من 20 بت. ماذا يحدث؟ العنوان "يلف حول" ، مثل الحساب المعامل (كنتيجة طبيعية للأجهزة). لذا، 0x10FFEF يصبح 0xFFEF.

وهناك لديك! استأجرت Intel بعض المهندسين الغبيين ، وعلينا أن نعيش معها.

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