Como espremer 16 GB de memória em uma placa-mãe que não suporta essa quantidade

Há algum tempo, instalei 16 GB de memória em um dos meus computadores. Possui a placa-mãe Foxconn P55MX com um Core i5 750. Seria possível substituir esse antigo CPU, mas ainda funciona bem e faz tudo o que eu preciso.

Aqui está o que é interessante. A placa-mãe não suporta oficialmente 16 GB de RAM. As especificações na página acima indicam que um máximo de 8 GB é suportado. Existem apenas dois slots na placa, então eu suspeitava que as tiras de 8 GB eram apenas uma raridade no momento em que a placa-mãe foi lançada. Eu decidi tentar de qualquer maneira. Em muitos casos, as placas-mãe suportam mais RAM do que o fabricante afirma oficialmente.

Verifiquei se a versão mais recente do BIOS (versão 946F1P06) estava instalada e inseri dois dos meus acabamentos de 8 gigabytes. Então eu baixei o Ubuntu 16.04, e tudo funcionou perfeitamente. Decidi que minha teoria de que o conselho suporta mais memória do que a declarada na documentação estava correta, e eu esqueci. Gostei de trabalhar com RAM adicional e fiquei feliz que o jogo valeu a pena.

Mas, alguns meses depois, tentei baixar o Windows 10. Basicamente, o computador roda no Linux. Somente às vezes você precisa inicializar o Windows para verificar alguma coisa. Foi então que a diversão começou.

Quando o GRUB apareceu, selecionei o Windows 10 no menu e pressione Enter. A tela de inicialização do Windows apareceu brevemente, e então fui imediatamente recebido pela tela azul da morte.



Código de parada: ACPI_BIOS_ERROR. Pesquisei bastante no Google e descobri que a essência está em algum tipo de problema com as tabelas ACPI no BIOS. Entre outras coisas, as tabelas ACPI informam ao sistema operacional como configurar o hardware. Tentar inicializar a partir da unidade USB de instalação do Windows resultou no mesmo erro. Então, acho que a Foxconn não mentiu. Este computador realmente não suporta 16 GB de RAM. Retornar a 8 GB resultou em um download bem-sucedido. Os testes de RAM também foram excelentes, por isso não é uma barra de memória ruim.

Tentei entrar em contato com o suporte da Foxconn para corrigir o BIOS, mas não recebi uma resposta. O endereço de e-mail está listado no site deles, mas não funciona. Talvez a Foxconn não esteja mais lidando com placas-mãe. Parece que eles também não fornecem apoio.

Nesse ponto, uma pessoa comum desistiria, renunciaria a 8 GB de memória ou compraria um computador novo. Mas não queria desistir tão facilmente. Eu sabia que teoricamente um computador poderia usar 16 GB porque funcionava perfeitamente no Linux. Então comecei a aprender a ACPI e a experimentar as configurações do BIOS.

Encontrei uma seção interessante da BIOS onde você pode jogar com algumas configurações de memória. Um parâmetro foi o "Recurso de Remapeamento de Memória". Ela foi incluída. A documentação do BIOS diz que a opção permite "sobrepor memória PCI" para mapear acima da memória física compartilhada. Uma pesquisa na Internet indicou que ela deve estar ativada ao inicializar em um sistema operacional de 64 bits. Apenas para experimentar, desliguei e o Windows realmente inicializou! No entanto, ela disse que poderia usar menos de 4 GB de RAM. Mas foi legal: eu consegui entrar no Windows sem precisar remover fisicamente a barra de memória.

Ubuntu é o mesmo. Com o recurso de remapeamento de memória desativado, ele me limitou a menos de 4 GB de RAM. No momento, eu tinha certeza de que havia algum tipo de problema de mapeamento de memória. Decidi estudar o erro ACPI_BIOS_ERROR e suas causas em mais detalhes - e me deparei com este excelente documento para depuração de drivers da Microsoft, que explica a verificação de erros ACPI_BIOS_ERROR.

De acordo com o documento, era necessário encontrar quatro parâmetros de erro que eram exibidos anteriormente em uma tela azul em versões mais antigas do Windows. O Windows 10 oculta todas as informações por padrão, mas você pode reativar a exibição de informações adicionais sobre erros adicionando uma entrada ao registro. Aqui está uma ótima resposta no superuser.com que me apontou na direção certa .

Depois de editar o registro adequadamente, ativei novamente a função de remapeamento de memória no BIOS e inicializei o Windows. O BSOD agora mostra quatro códigos adicionais no canto superior esquerdo:



Ótimo! Portanto, o parâmetro 1 é 0x0000000000000002. A documentação da Microsoft diz que o parâmetro 1, igual a 0x02, significa um problema no processamento da lista de recursos para barramentos raiz PCI. Como os parâmetros 2, 3 e 4 parecem valores loucos, esses provavelmente são indicadores. E se houver apenas indicadores aqui, a Microsoft diz que o problema é que a área de decodificação PCI se sobrepõe à lista de áreas de memória retornadas pelo BIOS do E820.

Ok Há muita informação, mas você pode iniciar a pesquisa com alguma coisa. Encontrei informações sobre como ligar para o BIOS do E820 fornece informações sobre áreas de memória. Depois, ele retornou ao Linux e examinou todas as informações de início do kernel usando o comando dmesg, com atenção especial ao E820 e ACPI. Aqui está o que foi encontrado:

  BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] utilizável
 BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reservado
 BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reservado
 BIOS-e820: [mem 0x0000000000100000-0x00000000cf77ffff] utilizável
 BIOS-e820: [mem 0x00000000cf780000-0x00000000cf78dfff] dados da ACPI
 BIOS-e820: [mem 0x00000000cf78e000-0x00000000cf7cffff] NVPI da ACPI
 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] utilizável 

Mais tarde eu vi isso:

  acpi PNP0A08: 00: ignorando a janela da ponte do host [mem 0x400000000-0xfffffffff
 janela] (entra em conflito com a RAM do sistema [mem 0x100000000-0x42fffffff])
 Ponte do host PCI para o barramento 0000: 00
 pci_bus 0000: 00: recurso de barramento raiz [janela io 0x0000-0x0cf7]
 pci_bus 0000: 00: recurso de barramento raiz [janela io 0x0d00-0xffff]
 pci_bus 0000: 00: recurso de barramento raiz [janela mem 0x000a0000-0x000bffff]
 pci_bus 0000: 00: recurso de barramento raiz [janela mem 0x000d0000-0x000dffff]
 pci_bus 0000: 00: recurso de barramento raiz [janela mem 0xd0000000-0xdfffffff]
 pci_bus 0000: 00: recurso de barramento raiz [janela mem 0xf0000000-0xfed8ffff]
 pci_bus 0000: 00: recurso de barramento raiz [barramento 00-ff] 

Sim! Vê um aviso de conflito? Eu não teria notado, mas depois de instalar a memória, o Linux começou a exibir essa mensagem a cada inicialização. Tentei inicializar no Linux com o recurso de remapeamento de memória desativado no BIOS. Nesse caso, a última região e820 desapareceu de 0x100000000 para 0x42fffffffff e, portanto, a mensagem de conflito também desapareceu, e outro "recurso de barramento raiz" apareceu na lista com a janela principal da ponte de 0x400000000 a 0xfffffffff.

Então o que acontece. O Linux trabalha com 16 GB porque percebe um conflito e ignora o intervalo PCI conflitante que a ACPI fornece, enquanto o Windows levanta as mãos com nojo e cospe uma tela azul: "Seu BIOS está com um problema!" Não posso culpar o Windows. De fato, há sobreposição, para que você possa entender que está confuso.

Neste ponto, eu não tinha certeza se continuaria. Os últimos 768 MB de memória, de 0x400000000 a 0x42fffffffffff, são mapeados para o início da enorme área de espaço de memória que a placa-mãe usa para PCI. Claramente, se a placa-mãe espera PCI lá, algo realmente ruim pode acontecer. Assim, a placa-mãe suporta apenas 15,25 GB de RAM, certo?

Mas ... no Linux, tudo funciona bem, sem o suporte dessa área de mapeamento PCI adicional! E se, de alguma forma, modificarmos as tabelas ACPI para que um grande intervalo PCI comece de 0x430000000 em vez de 0x400000000, ou seja, imediatamente após o final da RAM física. O conflito desapareceria e a maior parte da janela de mapeamento PCI ainda estaria disponível.

A chamada é aceita.

Comecei a pesquisar nas tabelas da ACPI. Felizmente, o Linux facilita muito o dumping. Existem ferramentas especiais para isso, mas as tabelas podem ser facilmente encontradas no sysfs:

  / sys / firmware / acpi / tabelas 

Aqui estão eles. Também fiquei satisfeito por o GRUB ter a oportunidade de substituir suas tabelas ACPI por novas versões. Portanto, se você descobrir qual tabela está envolvida, poderá instalar uma nova versão desta tabela usando o GRUB. Teoricamente, o Windows ficará feliz com isso.

Entre outras ferramentas, usei o iasl para analisar várias tabelas ACPI e encontrar o valor 0x400000000 para substituir. Provavelmente, esse valor está na ordem de bytes reversos (little-endian) e 64 bits, então eu corri o binwalk para pesquisar todos os arquivos de tabela:

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

Houve um resultado na tabela OEMB. A próxima palavra de 64 bits após 0x1000000000, um pouco maior que o endereço final na mensagem de conflito da janela principal da ponte. Pista muito promissora. A tabela OEMB é especial porque não é uma tabela padrão de acordo com as especificações da ACPI. O Linux reclama de uma soma de verificação inválida, mas não acho que isso importe. Suponho que você adivinhe o que eu fiz a seguir.

Fiz uma cópia da tabela OEMB, substituindo o byte 0x00 imediatamente antes do byte 0x04 por 0x30 para alterar o valor para 0x430000000 (lembre-se de que esta é a ordem inversa). Coloquei essa cópia modificada no arquivo /boot/oemb.dat. Em seguida, ele usou o GRUB para substituir a tabela OEMB pela minha cópia, colando temporariamente o seguinte comando na lista de comandos de inicialização (digitando a letra 'e' no GRUB após selecionar o Ubuntu):

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

A idéia é que ele diga ao GRUB para carregar todas as tabelas ACPI, exceto a tabela OEMB, e carregue o conteúdo de /boot/oemb.dat e adicione-o como uma tabela adicional. Isso substituirá efetivamente a tabela OEMB antiga pela nova tabela OEMB.

Ok, eu inicializei o Linux e ...

  acpi PNP0A08: 00: ignorando a janela da ponte do host [mem 0x400000000-0xfffffffff
 janela] (entra em conflito com a RAM do 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/pt449940/


All Articles