Cómo exprimir 16 GB de memoria en una placa base que no admite esta cantidad

Hace algún tiempo, instalé 16 GB de memoria en una de mis computadoras. Tiene la placa base Foxconn P55MX con un Core i5 750. Sería posible reemplazar esta antigua CPU, pero aún funciona bien y hace todo lo que necesito.

Aquí está lo que es interesante. La placa base no admite oficialmente 16 GB de RAM. Las especificaciones de la página anterior indican que se admite un máximo de 8 GB. Solo hay dos ranuras en el tablero, por lo que sospeché que las tiras de 8GB eran una rareza en el momento en que salió la placa base. Decidí intentarlo de todos modos. En muchos casos, las placas base admiten más RAM de lo que el fabricante afirma oficialmente.

Me aseguré de que la última versión del BIOS (versión 946F1P06) estaba instalada e inserté dos de mis ajustes de 8 gigabytes. Luego descargué Ubuntu 16.04, y todo funcionó perfectamente. Decidí que mi teoría de que la placa admite más memoria de la indicada en la documentación resultó ser correcta, y lo olvidé. Me gustaba trabajar con RAM adicional y estaba feliz de que el juego valiera la pena.

Pero unos meses después intenté descargar Windows 10. Básicamente, la computadora funciona con Linux. Solo a veces necesita iniciar Windows para verificar algo. Fue entonces cuando comenzó la diversión.

Cuando apareció GRUB, seleccioné Windows 10 en el menú y presioné Enter. La pantalla de inicio de Windows apareció brevemente, y luego fui inmediatamente recibido por la pantalla azul de la muerte.



Código de parada: ACPI_BIOS_ERROR. Busqué mucho en Google y descubrí que la esencia está en algún tipo de problema con las tablas ACPI en el BIOS. Entre otras cosas, las tablas ACPI le dicen al sistema operativo cómo configurar el hardware. Intentar arrancar desde la unidad USB de instalación de Windows resultó en el mismo error. Entonces, creo que Foxconn no mintió. Esta computadora realmente no admite 16 GB de RAM. Regresar a 8 GB resultó en una descarga exitosa. Las pruebas de RAM también fueron excelentes, por lo que no es una mala barra de memoria.

Traté de contactar al soporte de Foxconn para arreglar el BIOS, pero no recibí una respuesta. La dirección de correo electrónico aparece en su sitio web, pero no funciona. Quizás Foxconn ya no se trata de placas base. Parece que tampoco brindan apoyo.

En este punto, una persona común simplemente se rendiría, renunciaría a 8 GB de memoria o compraría una computadora nueva. Pero no quería rendirme tan fácilmente. Sabía que, en teoría, una computadora podía usar 16 GB porque funcionaba perfectamente en Linux. Entonces comencé a aprender ACPI y a experimentar con la configuración del BIOS.

Encontré una interesante sección de BIOS donde puedes jugar con algunas configuraciones de memoria. Un parámetro fue la "Función de reasignación de memoria". Ella fue incluida. La documentación del BIOS dice que la opción permite "superponer la memoria PCI" para mapear por encima de la memoria física compartida. Una búsqueda en Internet indicó que debe habilitarse cuando se inicia en un sistema operativo de 64 bits. Solo por el simple hecho de experimentar, lo apagué, ¡y Windows realmente arrancó! Sin embargo, dijo que podría usar menos de 4 GB de RAM. Pero fue agradable: obtuve una manera de ingresar a Windows sin tener que quitar físicamente la barra de memoria.

Ubuntu es lo mismo. Con la función de reasignación de memoria deshabilitada, me limitó a menos de 4 GB de RAM. Por el momento, estaba seguro de que había algún tipo de problema de asignación de memoria. Decidí estudiar el error ACPI_BIOS_ERROR y sus causas con más detalle, y encontré este excelente documento para depurar los controladores de Microsoft, que explica la comprobación de errores ACPI_BIOS_ERROR.

Según el documento, era necesario encontrar cuatro parámetros de error que se mostraban previamente en una pantalla azul en versiones anteriores de Windows. Windows 10 oculta toda la información de forma predeterminada, pero puede volver a habilitar la visualización de información de error adicional agregando una entrada al registro. Aquí hay una gran respuesta en superuser.com que me señaló en la dirección correcta .

Después de editar el registro en consecuencia, volví a activar la función de reasignación de memoria en el BIOS y arranqué Windows. BSOD ahora muestra cuatro códigos adicionales en la esquina superior izquierda:



Genial Por lo tanto, el parámetro 1 es 0x0000000000000002. La documentación de Microsoft dice que el parámetro 1, igual a 0x02, significa un problema con el procesamiento de la lista de recursos para los buses raíz PCI. Como los parámetros 2, 3 y 4 parecen valores locos, estos son probablemente punteros. Y si solo hay punteros aquí, Microsoft dice que el problema es que el área de decodificación PCI se superpone con la lista de áreas de memoria devueltas por el BIOS E820.

Esta bien Hay mucha información, pero puede comenzar la investigación con algo. Encontré información sobre cómo llamar al BIOS E820 proporciona información sobre áreas de memoria. Luego regresó a Linux y miró toda la información de inicio del kernel utilizando el comando dmesg, con especial atención al E820 y ACPI. Aquí está lo que se encontró:

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

Más tarde vi esto:

  acpi PNP0A08: 00: ignorando la ventana del puente de host [mem 0x400000000-0xfffffffff
 ventana] (entra en conflicto con la RAM del sistema [mem 0x100000000-0x42fffffff])
 Puente host PCI al bus 0000: 00
 pci_bus 0000: 00: recurso de bus raíz [ventana io 0x0000-0x0cf7]
 pci_bus 0000: 00: recurso de bus raíz [ventana io 0x0d00-0xffff]
 pci_bus 0000: 00: recurso de bus raíz [ventana mem 0x000a0000-0x000bffff]
 pci_bus 0000: 00: recurso de bus raíz [ventana mem 0x000d0000-0x000dffff]
 pci_bus 0000: 00: recurso de bus raíz [ventana mem 0xd0000000-0xdfffffff]
 pci_bus 0000: 00: recurso de bus raíz [ventana mem 0xf0000000-0xfed8ffff]
 pci_bus 0000: 00: recurso de bus raíz [bus 00-ff] 

Si! ¿Ves una advertencia de conflicto? No lo habría notado, pero después de instalar la memoria, Linux comenzó a mostrar este mensaje en cada arranque. Traté de iniciar en Linux con la función de reasignación de memoria deshabilitada en el BIOS. En este caso, la última región e820 desapareció de 0x100000000 a 0x42fffffffff, y por lo tanto el mensaje de conflicto también desapareció, y otro "recurso de bus raíz" apareció en la lista con la ventana del puente principal de 0x400000000 a 0xfffffffff.

Entonces que pasa. Linux funciona con 16 GB porque nota un conflicto e ignora el rango PCI conflictivo que proporciona ACPI, mientras que Windows levanta la mano con disgusto y escupe una pantalla azul: "¡Su BIOS tiene un problema!" No puedo culpar a Windows. De hecho, hay una superposición, por lo que puede comprender que está confundida.

En este punto, no estaba seguro de continuar. Los últimos 768 MB de memoria, de 0x400000000 a 0x42fffffffffff, se asignan al comienzo de la gran área de espacio de memoria que la placa base utiliza para PCI. Claramente, si la placa base espera PCI allí, algo realmente malo puede suceder. Por lo tanto, la placa base solo admite 15.25 GB de RAM, ¿verdad?

Pero ... en Linux, todo funciona bien, ¡sin el soporte de esta área de mapeo PCI adicional! ¿Qué pasa si de alguna manera modificamos las tablas ACPI para que un rango PCI grande comience desde 0x430000000 en lugar de 0x400000000, es decir, inmediatamente después del final de la RAM física? Entonces el conflicto desaparecería, y la mayor parte de la ventana de mapeo PCI aún estaría disponible.

La llamada es aceptada.

Empecé a buscar en las tablas ACPI. Afortunadamente, Linux hace que descargar sea muy fácil. Hay herramientas especiales para esto, pero las tablas se pueden encontrar fácilmente en sysfs:

  / sys / firmware / acpi / tables 

Aquí están También me complació que GRUB tenga la oportunidad de reemplazar sus tablas ACPI con nuevas versiones. Por lo tanto, si descubre qué tabla está involucrada, puede instalar una nueva versión de esta tabla utilizando GRUB. Teóricamente, Windows estará feliz con esto.

Entre otras herramientas, usé iasl para analizar varias tablas ACPI y encontrar el valor 0x400000000 para reemplazar. Lo más probable es que este valor esté en orden de bytes inverso (little-endian) y 64 bits de tamaño, por lo que ejecuté binwalk para buscar todos los archivos de la tabla:

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

Hubo un resultado en la tabla OEMB. La siguiente palabra de 64 bits después de 0x1000000000, un poco más grande que la dirección final en el mensaje de conflicto de la ventana del puente principal. Pista muy prometedora. La tabla OEMB es especial porque no es una tabla estándar según las especificaciones ACPI. Linux se queja de una suma de verificación no válida, pero no creo que eso importe. Supongo que adivinas lo que hice después ...

Hice una copia de la tabla OEMB, reemplazando el byte 0x00 inmediatamente antes del byte 0x04 con 0x30 para cambiar el valor a 0x430000000 (recuerde que este es el orden inverso). Coloqué esta copia modificada en el archivo /boot/oemb.dat. Luego usó GRUB para reemplazar la tabla OEMB con mi copia, pegando temporalmente el siguiente comando en la lista de comandos de arranque (ingresando la letra 'e' en GRUB después de seleccionar Ubuntu):

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

La idea es que le dice a GRUB que cargue todas las tablas ACPI excepto la tabla OEMB, y luego cargue el contenido de /boot/oemb.dat y lo agregue como una tabla adicional. Esto reemplazará efectivamente la vieja tabla OEMB con la nueva tabla OEMB.

Ok, arranqué Linux y ...

  acpi PNP0A08: 00: ignorando la ventana del puente de host [mem 0x400000000-0xfffffffff
 ventana] (entra en conflicto con la RAM del sistema [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/449940/


All Articles