So drücken Sie 16 GB Speicher auf ein Motherboard, das diese Menge nicht unterstützt

Vor einiger Zeit habe ich 16 GB Speicher auf einem meiner Computer installiert. Es hat das Foxconn P55MX- Motherboard mit einem Core i5 750. Es wäre möglich, diese alte CPU zu ersetzen, aber es funktioniert immer noch gut und macht alles, was ich brauche.

Hier ist was interessant ist. Das Motherboard unterstützt offiziell keine 16 GB RAM. Die Angaben auf der obigen Seite geben an, dass maximal 8 GB unterstützt werden. Es gibt nur zwei Steckplätze auf der Platine, daher hatte ich den Verdacht, dass 8-GB-Streifen zum Zeitpunkt der Veröffentlichung des Motherboards nur eine Seltenheit waren. Ich beschloss es trotzdem zu versuchen. In vielen Fällen unterstützen Motherboards mehr RAM als der Hersteller offiziell behauptet.

Ich habe sichergestellt, dass die neueste BIOS-Version (Version 946F1P06) installiert ist, und zwei meiner 8-Gigabyte-Trims eingefügt. Dann habe ich Ubuntu 16.04 heruntergeladen und alles hat perfekt funktioniert. Ich entschied, dass meine Theorie, dass das Board mehr Speicher unterstützt als in der Dokumentation angegeben, richtig war, und vergaß es. Ich habe gerne mit zusätzlichem RAM gearbeitet und war froh, dass sich das Spiel ausgezahlt hat.

Einige Monate später versuchte ich, Windows 10 herunterzuladen. Grundsätzlich läuft der Computer unter Linux. Nur manchmal müssen Sie Windows starten, um etwas zu überprüfen. Dann begann der Spaß.

Als GRUB erschien, wählte ich Windows 10 aus dem Menü und drückte die Eingabetaste. Der Windows-Startbildschirm erschien kurz, und dann wurde ich sofort vom blauen Bildschirm des Todes begrüßt.



Stoppcode: ACPI_BIOS_ERROR. Ich habe viel gegoogelt und herausgefunden, dass das Wesentliche in einem Problem mit ACPI-Tabellen im BIOS liegt. Unter anderem teilen ACPI-Tabellen dem Betriebssystem mit, wie Hardware konfiguriert werden soll. Der Versuch, vom USB-Laufwerk der Windows-Installation zu starten, führte zu demselben Fehler. Ich denke, Foxconn hat nicht gelogen. Dieser Computer unterstützt wirklich keine 16 GB RAM. Die Rückkehr zu 8 GB führte zu einem erfolgreichen Download. Die RAM-Tests waren ebenfalls ausgezeichnet, es ist also keine schlechte Speicherleiste.

Ich habe versucht, den Foxconn-Support bezüglich der Behebung des BIOS zu kontaktieren, aber keine Antwort erhalten. Die E-Mail-Adresse ist auf ihrer Website aufgeführt, funktioniert aber nicht. Vielleicht beschäftigt sich Foxconn nicht mehr mit Motherboards. Es scheint, dass sie auch keine Unterstützung bieten.

Zu diesem Zeitpunkt gab ein gewöhnlicher Mensch einfach auf, gab sich mit 8 GB Speicher ab oder kaufte einen neuen Computer. Aber ich wollte nicht so einfach aufgeben. Ich wusste, dass ein Computer theoretisch 16 GB verwenden kann, da er unter Linux perfekt funktioniert. Also fing ich an, ACPI zu lernen und mit BIOS-Einstellungen zu experimentieren.

Ich habe einen interessanten BIOS-Bereich gefunden, in dem Sie mit einigen Speichereinstellungen spielen können. Ein Parameter war die „Memory Remap-Funktion“. Sie war dabei. In der BIOS-Dokumentation heißt es, dass die Option "PCI-Speicher überlappen" für die Zuordnung über dem gemeinsam genutzten physischen Speicher zulässt. Eine Suche im Internet ergab, dass es beim Booten in ein 64-Bit-Betriebssystem aktiviert sein muss. Nur zum Experimentieren habe ich es ausgeschaltet und Windows wirklich gebootet! Sie sagte jedoch, sie könne weniger als 4 GB RAM verwenden. Aber es war schön: Ich habe eine Möglichkeit, in Windows zu gelangen, ohne die Speicherleiste physisch entfernen zu müssen.

Ubuntu ist das gleiche. Bei deaktivierter Speicher-Remapping-Funktion war ich auf weniger als 4 GB RAM beschränkt. Im Moment war ich mir sicher, dass es eine Art Speicherzuordnungsproblem gab. Ich habe mich entschlossen, den Fehler ACPI_BIOS_ERROR und seine Ursachen genauer zu untersuchen - und bin auf dieses hervorragende Dokument zum Debuggen von Microsoft-Treibern gestoßen, in dem die Fehlerprüfung von ACPI_BIOS_ERROR erläutert wird.

Dem Dokument zufolge mussten vier Fehlerparameter gefunden werden, die zuvor in älteren Windows-Versionen auf einem blauen Bildschirm angezeigt wurden. Windows 10 verbirgt standardmäßig alle Informationen. Sie können jedoch die Anzeige zusätzlicher Fehlerinformationen wieder aktivieren, indem Sie der Registrierung einen Eintrag hinzufügen. Hier ist eine großartige Antwort auf superuser.com, die mich in die richtige Richtung gelenkt hat .

Nachdem ich die Registrierung entsprechend bearbeitet hatte, schaltete ich die Speicher-Remapping-Funktion im BIOS erneut ein und startete Windows. BSOD zeigt jetzt vier zusätzliche Codes in der oberen linken Ecke:



Großartig! Somit ist Parameter 1 0x0000000000000002. In der Microsoft-Dokumentation heißt es, dass Parameter 1 gleich 0x02 ein Problem bei der Verarbeitung der Ressourcenliste für PCI-Root-Busse darstellt. Da die Parameter 2, 3 und 4 wie verrückte Werte aussehen, sind dies wahrscheinlich Zeiger. Und wenn es hier nur Zeiger gibt, besteht laut Microsoft das Problem darin, dass sich der PCI-Decodierungsbereich mit der Liste der vom E820-BIOS zurückgegebenen Speicherbereiche überschneidet.

Okay Es gibt viele Informationen, aber Sie können die Forschung mit etwas beginnen. Ich habe Informationen darüber gefunden, wie der Aufruf des E820-BIOS Informationen zu Speicherbereichen liefert. Dann kehrte er zu Linux zurück und sah sich mit dem Befehl dmesg alle Kernel-Startinformationen an, wobei er sich insbesondere mit E820 und ACPI befasste. Folgendes wurde gefunden:

  BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] verwendbar
 BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserviert
 BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserviert
 BIOS-e820: [mem 0x0000000000100000-0x00000000cf77ffff] verwendbar
 BIOS-e820: [mem 0x00000000cf780000-0x00000000cf78dfff] ACPI-Daten
 BIOS-e820: [mem 0x00000000cf78e000-0x00000000cf7cffff] ACPI NVS
 BIOS-e820: [mem 0x00000000cf7d0000-0x00000000cf7dffff] reserviert
 BIOS-e820: [mem 0x00000000cf7ed000-0x00000000cfffffff] reserviert
 BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserviert
 BIOS-e820: [mem 0x00000000ffb00000-0x00000000ffffffff] reserviert
 BIOS-e820: [mem 0x0000000100000000-0x000000042fffffff] verwendbar 

Später sah ich das:

  acpi PNP0A08: 00: Host-Bridge-Fenster wird ignoriert [mem 0x400000000-0xfffffffff
 Fenster] (Konflikte mit dem System-RAM [mem 0x100000000-0x42fffffff])
 PCI-Hostbrücke zum Bus 0000: 00
 pci_bus 0000: 00: Root-Bus-Ressource [io 0x0000-0x0cf7-Fenster]
 pci_bus 0000: 00: Root-Bus-Ressource [io 0x0d00-0xffff-Fenster]
 pci_bus 0000: 00: Root-Bus-Ressource [mem 0x000a0000-0x000bffff-Fenster]
 pci_bus 0000: 00: Root-Bus-Ressource [mem 0x000d0000-0x000dffff-Fenster]
 pci_bus 0000: 00: Root-Bus-Ressource [mem 0xd0000000-0xdfffffff-Fenster]
 pci_bus 0000: 00: Root-Bus-Ressource [mem 0xf0000000-0xfed8ffff-Fenster]
 pci_bus 0000: 00: Root-Bus-Ressource [Bus 00-ff] 

Ja! Eine Konfliktwarnung sehen? Ich hätte es nicht bemerkt, aber nach der Installation des Speichers zeigte Linux diese Meldung bei jedem Start an. Ich habe versucht, Linux mit deaktivierter Speicher-Remapping-Funktion im BIOS zu starten. In diesem Fall verschwand die letzte e820-Region von 0x100000000 bis 0x42fffffffff, und daher verschwand auch die Konfliktmeldung, und eine weitere „Root-Bus-Ressource“ wurde in der Liste mit dem Hauptbrückenfenster von 0x400000000 bis 0xfffffffff angezeigt.

Also was passiert? Linux arbeitet mit 16 GB, weil es einen Konflikt bemerkt und den von ACPI bereitgestellten widersprüchlichen PCI-Bereich ignoriert, während Windows angewidert die Hände hebt und einen blauen Bildschirm ausspuckt: "Ihr BIOS hat ein Problem!" Ich kann Windows nicht beschuldigen. In der Tat gibt es Überschneidungen, so dass Sie verstehen können, dass es verwirrt ist.

Zu diesem Zeitpunkt war ich mir nicht sicher, ob ich fortfahren sollte. Die letzten 768 MB Speicher von 0x400000000 bis 0x42fffffffffff werden dem Anfang des riesigen Speicherbereichs zugeordnet, den das Motherboard für PCI verwendet. Wenn das Motherboard dort PCI erwartet, kann natürlich etwas wirklich Schlimmes passieren. Das Motherboard unterstützt also nur 15,25 GB RAM, oder?

Aber ... unter Linux funktioniert alles einwandfrei, ohne die Unterstützung dieses zusätzlichen PCI-Mapping-Bereichs! Was ist, wenn wir die ACPI-Tabellen irgendwie so ändern, dass ein großer PCI-Bereich von 0x430000000 anstelle von 0x400000000 beginnt, dh unmittelbar nach dem Ende des physischen RAM. Dann würde der Konflikt verschwinden und der größte Teil des PCI-Zuordnungsfensters wäre weiterhin verfügbar.

Herausforderung angenommen.

Ich fing an, mich in ACPI-Tabellen zu vertiefen. Glücklicherweise macht Linux das Dumping sehr einfach. Hierfür gibt es spezielle Tools, aber Tabellen finden Sie leicht in sysfs:

  / sys / firmware / acpi / tables 

Hier sind sie. Es hat mich auch gefreut, dass GRUB die Möglichkeit hat, Ihre ACPI-Tabellen durch neue Versionen zu ersetzen. Wenn Sie herausfinden, um welche Tabelle es sich handelt, können Sie daher mit GRUB eine neue Version dieser Tabelle installieren. Theoretisch wird Windows damit zufrieden sein.

Unter anderem habe ich mit iasl verschiedene ACPI-Tabellen analysiert und den zu ersetzenden Wert 0x400000000 gefunden. Höchstwahrscheinlich ist dieser Wert in umgekehrter Bytereihenfolge (Little-Endian) und 64 Bit groß. Daher habe ich binwalk ausgeführt , um alle Tabellendateien zu durchsuchen:

  binwalk -R '\ x00 \ x00 \ x00 \ x00 \ x04 \ x00 \ x00 \ x00' * 

Es gab ein Ergebnis in der OEMB-Tabelle. Das nächste 64-Bit-Wort nach 0x1000000000 war etwas größer als die Endadresse in der Konfliktnachricht des Hauptbrückenfensters. Sehr vielversprechender Hinweis. Die OEMB-Tabelle ist etwas Besonderes, da es sich nicht um eine Standardtabelle gemäß den ACPI-Spezifikationen handelt. Linux beschwert sich über eine ungültige Prüfsumme, aber ich denke nicht, dass das wichtig ist. Ich nehme an, Sie raten, was ich als nächstes getan habe.

Ich habe eine Kopie der OEMB-Tabelle erstellt und das Byte 0x00 unmittelbar vor dem Byte 0x04 durch 0x30 ersetzt, um den Wert in 0x430000000 zu ändern (denken Sie daran, dass dies die umgekehrte Reihenfolge ist). Ich habe diese geänderte Kopie in die Datei /boot/oemb.dat gestellt. Dann benutzte er GRUB, um die OEMB-Tabelle durch meine Kopie zu ersetzen, und fügte vorübergehend den folgenden Befehl in die Liste der Startbefehle ein (Eingabe des Buchstabens 'e' in GRUB nach Auswahl von Ubuntu):

  acpi --exclude = OEMB /boot/oemb.dat 

Die Idee ist, dass GRUB angewiesen wird, alle ACPI-Tabellen mit Ausnahme der OEMB-Tabelle zu laden und dann den Inhalt von /boot/oemb.dat zu laden und als zusätzliche Tabelle hinzuzufügen. Dadurch wird die alte OEMB-Tabelle effektiv durch die neue OEMB-Tabelle ersetzt.

Ok, ich habe Linux gebootet und ...

  acpi PNP0A08: 00: Host-Bridge-Fenster wird ignoriert [mem 0x400000000-0xfffffffff
 Fenster] (Konflikte mit dem System-RAM [mem 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 .

, , ! , - . , .

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


All Articles