منذ بعض الوقت ، قمت بتثبيت 16 جيجابايت من الذاكرة على أحد أجهزة الكمبيوتر الخاصة بي. يحتوي على اللوحة الأم
فوكسكون P55MX مع كور i5 750 على ذلك ، سيكون من الممكن استبدال وحدة المعالجة المركزية القديمة ، لكنها لا تزال تعمل بشكل جيد
وتفعل كل ما أحتاجه.
هنا ما هو مثير للاهتمام. لا تدعم اللوحة الأم رسمياً 16 جيجابايت من ذاكرة الوصول العشوائي. تشير المواصفات الموجودة في الصفحة أعلاه إلى دعم حد أقصى قدره 8 جيجابايت. لا يوجد سوى شريحتين على السبورة ، لذا كان لدي شك في أن شرائح 8GB كانت نادرة في وقت خروج اللوحة الأم. قررت أن أحاول على أي حال. في العديد من الحالات ، تدعم اللوحات الأم ذاكرة RAM أكثر مما تدعي الشركة المصنعة رسميًا.
لقد تأكدت من تثبيت أحدث إصدار من BIOS (الإصدار 946F1P06) وإدخال اثنين من ثمانى غيغابايت. ثم قمت بتنزيل Ubuntu 16.04 ، وعمل كل شيء بشكل مثالي. قررت أن نظريتي التي مفادها أن اللوحة تدعم ذاكرة أكثر مما هو مذكور في الوثائق تبين أنها صحيحة ، وقد نسيت ذلك. أحببت العمل مع ذاكرة الوصول العشوائي الإضافية وكنت سعيدًا لأن اللعبة آتت أكلها.
لكن بعد بضعة أشهر حاولت تنزيل Windows 10. بشكل أساسي ، يعمل الكمبيوتر على نظام Linux. فقط في بعض الأحيان تحتاج إلى تشغيل Windows للتحقق من شيء ما. عندها بدأت المتعة.
عندما ظهر GRUB ، اخترت Windows 10 من القائمة واضغط على Enter. ظهرت شاشة تمهيد Windows لفترة وجيزة ، ثم استقبلتني شاشة الموت الزرقاء على الفور.

رمز الإيقاف: ACPI_BIOS_ERROR. لقد غوغل كثيرا ووجدت أن الجوهر في مشكلة من نوع ما مع جداول ACPI في BIOS. من بين أشياء أخرى ، توضح جداول ACPI لنظام التشغيل كيفية تكوين الأجهزة. أدت محاولة التمهيد من محرك USB لتثبيت Windows إلى حدوث نفس الخطأ. لذا ، أعتقد أن فوكسكون لم تكن كذبة. هذا الكمبيوتر حقا لا يدعم 16 جيجابايت من ذاكرة الوصول العشوائي. العودة إلى 8 جيجابايت نتج عنها تنزيل ناجح. كانت اختبارات ذاكرة الوصول العشوائي ممتازة أيضًا ، لذا فهي ليست شريط ذاكرة سيئًا.
حاولت الاتصال بدعم Foxconn حول إصلاح BIOS ، لكنني لم أتلق ردًا. عنوان البريد الإلكتروني مدرج على موقعه على الإنترنت ، لكنه لا يعمل. ربما لم تعد شركة فوكسكون تتعامل مع اللوحات الأم. يبدو أنهم أيضًا لا يقدمون الدعم.
في هذه المرحلة ، سيتخلى شخص عادي عن 8 جيجا بايت من الذاكرة أو يشترى جهاز كمبيوتر جديد. لكنني لا أريد الاستسلام بهذه السهولة. كنت أعرف أنه من الناحية النظرية ، يمكن لجهاز الكمبيوتر استخدام 16 جيجابايت لأنه يعمل بشكل مثالي على نظام Linux. لذلك بدأت في تعلم ACPI وتجربة إعدادات BIOS.
لقد وجدت قسم BIOS مثيرًا للاهتمام حيث يمكنك اللعب مع بعض إعدادات الذاكرة. كان أحد المعلمات "ميزة إعادة تسمية الذاكرة". كانت مدرجة. تشير وثائق BIOS إلى أن الخيار يسمح "بتداخل ذاكرة PCI" للتعيين أعلى الذاكرة الفعلية المشتركة. أشار البحث على الإنترنت إلى أنه يجب تمكينه عند التشغيل في نظام تشغيل 64 بت. فقط من أجل التجربة ، قمت بإيقاف تشغيله ، وتمهيد Windows بالفعل! ومع ذلك ، قالت إنها يمكن أن تستخدم أقل من 4 جيجابايت من ذاكرة الوصول العشوائي. لكنها كانت لطيفة: حصلت على طريقة للدخول إلى Windows دون الحاجة إلى إزالة شريط الذاكرة فعليًا.
أوبونتو هو نفسه. مع تعطيل ميزة إعادة تعيين الذاكرة ، حددت لي أقل من 4 جيجابايت من ذاكرة الوصول العشوائي. في الوقت الحالي ، كنت متأكدًا من وجود مشكلة في تعيين الذاكرة. قررت دراسة خطأ ACPI_BIOS_ERROR وأسبابه بمزيد من التفصيل - وشاهدت
هذا المستند الممتاز لتصحيح أخطاء برامج تشغيل Microsoft ، وهو ما يفسر تدقيق الأخطاء ACPI_BIOS_ERROR.
وفقًا للمستند ، كان من الضروري البحث عن أربع معلمات خطأ تم عرضها مسبقًا على شاشة زرقاء في الإصدارات القديمة من Windows. يخفي نظام التشغيل Windows 10 جميع المعلومات افتراضيًا ، لكن يمكنك إعادة تمكين عرض معلومات الخطأ الإضافية عن طريق إضافة إدخال إلى السجل. إليكم
إجابة رائعة على موقع superuser.com الذي أشار لي في الاتجاه الصحيح .
بعد تحرير السجل وفقًا لذلك ، قمت بتشغيل وظيفة إعادة تعيين الذاكرة في نظام BIOS ونظام التشغيل Windows. الموت الزرقاء الآن يظهر أربعة رموز إضافية في الزاوية اليسرى العليا:

عظيم! وبالتالي ، المعلمة 1 هي 0x0000000000000002. تشير وثائق Microsoft إلى أن المعلمة 1 ، تساوي 0x02 ، تعني مشكلة في معالجة قائمة الموارد لحافلات الجذر PCI. نظرًا لأن المعلمات 2 و 3 و 4 تشبه القيم المجنونة ، فربما تكون هذه مؤشرات. وإذا كانت هناك مؤشرات فقط هنا ، تقول Microsoft إن المشكلة تكمن في أن منطقة فك ترميز PCI تتداخل مع قائمة مناطق الذاكرة التي يتم إرجاعها بواسطة BIOS E820.
حسنا. هناك الكثير من المعلومات ، ولكن يمكنك بدء البحث بشيء ما. لقد عثرت على معلومات حول كيفية قيام BIOS E820 بتوفير معلومات حول مناطق الذاكرة. ثم عاد إلى Linux ونظر إلى جميع معلومات بدء kernel باستخدام الأمر dmesg ، مع الانتباه بشكل خاص إلى E820 و ACPI. هنا ما وجد:
BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] قابلة للاستخدام
BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] محفوظة
BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] محفوظة
BIOS-e820: [mem 0x0000000000100000-0x00000000cf77ffff] قابلة للاستخدام
BIOS-e820: [mem 0x00000000cf780000-0x00000000cf78dfff] بيانات ACPI
BIOS-e820: [mem 0x00000000cf78e000-0x00000000cf7cffff] ACPI NVS
BIOS-e820: [mem 0x00000000cf7d0000-0x00000000cf7dffff] محفوظة
BIOS-e820: [mem 0x00000000cf7ed000-0x00000000cfffffff] محفوظة
BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] محفوظة
BIOS-e820: [mem 0x00000000ffb00000-0x00000000ffffffff] محفوظة
BIOS-e820: [mem 0x0000000100000000-0x000000042fffffff] قابلة للاستخدام
في وقت لاحق رأيت هذا:
acpi PNP0A08: 00: تجاهل نافذة جسر المضيف [mem 0x400000000-0xfffffffff
نافذة] (يتعارض مع ذاكرة الوصول العشوائي للنظام [ذاكرة 0x100000000-0x42fffffff])
PCI host bridge to bus 0000: 00
pci_bus 0000: 00: مورد ناقل الجذر [نافذة io 0x0000-0x0cf7]
pci_bus 0000: 00: مورد ناقل الجذر [نافذة io 0x0d00-0xffff]
pci_bus 0000: 00: مورد ناقل الجذر [نافذة 0x000a0000-0x000bffff مورد]
pci_bus 0000: 00: مورد ناقل الجذر [نافذة المذكرة 0x000d0000-0x000dffff]
pci_bus 0000: 00: مورد ناقل الجذر [نافذة 0xd0000000-0xdfffffff]
pci_bus 0000: 00: مورد ناقل الجذر [نافذة 0xf0000000-0xfed8ffff]
pci_bus 0000: 00: مورد ناقل الجذر [bus 00-ff]
آها! رؤية تحذير الصراع؟ لم أكن لألاحظ ذلك ، لكن بعد تثبيت الذاكرة ، بدأ Linux في عرض هذه الرسالة عند كل عملية تمهيد. حاولت التمهيد في Linux مع تعطيل ميزة إعادة تعيين الذاكرة في BIOS. في هذه الحالة ، اختفت منطقة e820 الأخيرة من 0x100000000 إلى 0x42fffffffff ، وبالتالي اختفت أيضًا رسالة التعارض ، وظهر "مورد ناقل جذر" آخر في القائمة مع إطار الجسر الرئيسي من 0x400000000 إلى 0xfffffffff.
إذن ماذا يحدث. يعمل نظام Linux بسعة 16 جيجابايت لأنه يلاحظ وجود تعارض ويتجاهل نطاق PCI المتضارب الذي يوفره ACPI ، بينما يرفع Windows يديه في حالة من الاشمئزاز ويبصق شاشة زرقاء: "BIOS لديك مشكلة!" لا أستطيع إلقاء اللوم على ويندوز. في الواقع ، هناك تداخل ، لذلك يمكنك أن تفهم أنه مشوش.
في هذه المرحلة ، لم أكن متأكدًا من الاستمرار. يتم تعيين آخر 768 ميجابايت من الذاكرة ، من 0x400000000 إلى 0x42fffffffffff ، إلى بداية المساحة الضخمة من مساحة الذاكرة التي تستخدمها اللوحة الأم لـ PCI. بوضوح ، إذا كانت اللوحة تتوقع PCI هناك ، يمكن أن يحدث شيء سيء حقًا. وبالتالي ، فإن اللوحة الأم تدعم فقط 15.25 غيغابايت من ذاكرة الوصول العشوائي ، أليس كذلك؟
ولكن ... على نظام Linux ، يعمل كل شيء على ما يرام ، دون دعم من ناحية تعيين PCI الإضافية هذه! ماذا لو قمنا بتعديل جداول ACPI بطريقة ما بحيث يبدأ نطاق PCI كبير من 0x430000000 بدلاً من 0x400000000 ، أي فور انتهاء ذاكرة الوصول العشوائي الفعلية. ثم يختفي التعارض ، وستظل معظم نافذة تعيين PCI متاحة.
تم قبول المكالمة.
لقد بدأت الحفر في جداول ACPI. لحسن الحظ ، Linux يجعل الإغراق سهلاً للغاية. هناك أدوات خاصة لهذا الغرض ، ولكن يمكن العثور على الجداول بسهولة في sysfs:
/ تميز الكلية / البرامج الثابتة / acpi / الجداول
ها هم. لقد سررت أيضًا أن GRUB لديه الفرصة لاستبدال جداول ACPI بنسخ جديدة. لذلك ، إذا اكتشفت أي جدول متضمن ، يمكنك تثبيت إصدار جديد من هذا الجدول باستخدام GRUB. من الناحية النظرية ، سيكون Windows سعيدًا بهذا.
من بين الأدوات الأخرى ، استخدمت
iasl لتحليل جداول ACPI المختلفة والعثور على القيمة 0x400000000 للاستبدال. على الأرجح ، هذه القيمة بترتيب عكسي للبايت (endian قليلاً) و 64 بت في الحجم ، لذلك قمت بتشغيل
binwalk للبحث في جميع ملفات الجدول:
binwalk -R '\ x00 \ x00 \ x00 \ x00 \ x04 \ x00 \ x00 \ x00' *
كان هناك نتيجة واحدة في الجدول OEMB. الكلمة 64 بت التالية بعد أن كانت 0x1000000000 ، أكبر قليلاً من عنوان النهاية في رسالة تعارض نافذة الجسر الرئيسية. فكرة واعدة جدا. يعد جدول OEMB خاصًا لأنه ليس جدولًا قياسيًا وفقًا لمواصفات ACPI. يشكو نظام Linux من المجموع الاختباري غير الصحيح ، لكنني لا أعتقد أن هذا مهم. أفترض أنك تخمن ما فعلت بعد ذلك ...
لقد صنعت نسخة من جدول OEMB ، واستبدل البايت 0x00 مباشرة قبل البايت 0x04 مع 0x30 لتغيير القيمة إلى 0x430000000 (تذكر أن هذا هو الترتيب العكسي). لقد وضعت هذه النسخة المعدلة في الملف / boot/oemb.dat. ثم استخدم GRUB لاستبدال جدول OEMB بنسختي ، ولصق الأمر التالي مؤقتًا في قائمة أوامر التمهيد (إدخال الحرف 'e' في GRUB بعد تحديد Ubuntu):
acpi - استبعاد = OEMB /boot/oemb.dat
تتمثل الفكرة في أنه يخبر GRUB بتحميل جميع جداول ACPI باستثناء جدول OEMB ، ثم تحميل محتويات /boot/oemb.dat وإضافته كجدول إضافي. سيؤدي هذا إلى استبدال جدول OEMB القديم بجدول OEMB الجديد.
حسنًا ، قمت بالتمهيد لنظام التشغيل Linux و ...
acpi PNP0A08: 00: تجاهل نافذة جسر المضيف [mem 0x400000000-0xfffffffff
نافذة] (يتعارض مع ذاكرة الوصول العشوائي للنظام [ذاكرة 0x100000000-0x42fffffff])
. WTF? , PCI - , , . , OEMB , .
iasl DSDT. , DSDT
_CRS
, .
iasl -d DSDT
.dsl _CRS, PCI, . DSDT , . _CRS . , _CRS , 0xCF78E064. Linux dmesg :
ACPI: Early table checksum verification disabled
ACPI: RSDP 0x00000000000F9820 000014 (v00 ACPIAM)
ACPI: RSDT 0x00000000CF780000 000044 (v01 012110 RSDT0821 20100121 MSFT 00000097)
ACPI: FACP 0x00000000CF780200 000084 (v01 012110 FACP0821 20100121 MSFT 00000097)
ACPI: DSDT 0x00000000CF780460 006FE7 (v01 946F1 946F1P06 00000000 INTL 20051117)
ACPI: FACS 0x00000000CF78E000 000040
ACPI: APIC 0x00000000CF780390 00008C (v01 012110 APIC0821 20100121 MSFT 00000097)
ACPI: MCFG 0x00000000CF780420 00003C (v01 012110 OEMMCFG 20100121 MSFT 00000097)
ACPI: OEMB 0x00000000CF78E040 000082 (v01 012110 OEMB0821 20100121 MSFT 00000097)
ACPI: HPET 0x00000000CF78A460 000038 (v01 012110 OEMHPET 20100121 MSFT 00000097)
ACPI: GSCI 0x00000000CF78E0D0 002024 (v01 012110 GMCHSCI 20100121 MSFT 00000097)
ACPI: DMAR 0x00000000CF790100 000090 (v01 AMI OEMDMAR 00000001 MSFT 00000097)
ACPI: SSDT 0x00000000CF7917C0 000363 (v01 DpgPmm CpuPm 00000012 INTL 20051117)
! OEMB. . OEMB?
dmesg OEMB. , , , GRUB , OEMB, . , DSDT 0xCF78E064 OEMB. - , - . .
DSDT, OEMB, , , GRUB , OEMB.
. GRUB
write_byte
,
write_word
,
write_dword
read_
. GRUB OEMB? BIOS' . , RAM, .
. GRUB:
write_byte 0xCF78E0B5 0x30
0x00 0x04 0x30, 64- PCI 0x0000000430000000. OEMB, Linux , , , , .
Linux dmesg PCI.
PCI host bridge to bus 0000:00
pci_bus 0000:00: root bus resource [io 0x0000-0x0cf7 window]
pci_bus 0000:00: root bus resource [io 0x0d00-0xffff window]
pci_bus 0000:00: root bus resource [mem 0x000a0000-0x000bffff window]
pci_bus 0000:00: root bus resource [mem 0x000d0000-0x000dffff window]
pci_bus 0000:00: root bus resource [mem 0xd0000000-0xdfffffff window]
pci_bus 0000:00: root bus resource [mem 0xf0000000-0xfed8ffff window]
pci_bus 0000:00: root bus resource [mem 0x430000000-0xfffffffff window]
pci_bus 0000:00: root bus resource [bus 00-ff]
! 0x430000000-0xfffffffffff , . , Linux , Windows .
! Windows 16 RAM, GRUB write_byte. Windows 10, , . - Windows, , RAM, . !
GRUB, /etc/grub.d/00_patchbios :
# This file patches the BIOS in my Foxconn P55MX motherboard to work
# properly when I have 16 GB of RAM installed. It's a nasty hack.
# Basically, the BIOS is hardcoded in the OEMB ACPI table
# to have a PCI address range from 0x400000000 to 0xfffffffff, but
# that overlaps with 16 GB of RAM being installed, because the RAM
# uses up (among other ranges) 0x100000000 to 0x42fffffff.
# This patch changes the table to actually list a PCI range of:
# 0x430000000 to 0xfffffffff
echo "write_byte 0xCF78E0B5 0x30"
sudo update-grub
. GRUB.
, . PCI - . , RAM. Linux 16 RAM, . , PCI/PCIe - , , , , . , , , ACPI BIOS .
, , ! , - . , .