Cara memeras 16 GB memori ke motherboard yang tidak mendukung jumlah ini

Beberapa waktu lalu, saya memasang 16 GB memori di salah satu komputer saya. Ini memiliki motherboard Foxconn P55MX dengan Core i5 750 di atasnya. Mungkin untuk mengganti CPU lama ini, tetapi masih berfungsi dengan baik dan melakukan semua yang saya butuhkan.

Inilah yang menarik. Motherboard tidak secara resmi mendukung 16 GB RAM. Spesifikasi pada halaman di atas menunjukkan bahwa maksimum 8 GB didukung. Hanya ada dua slot di papan tulis, jadi saya curiga bahwa 8GB strip hanya langka pada saat motherboard keluar. Saya memutuskan untuk tetap mencoba. Dalam banyak kasus, motherboard mendukung lebih banyak RAM daripada yang diklaim pabrikan.

Saya memastikan bahwa versi BIOS terbaru (versi 946F1P06) telah diinstal dan memasukkan dua dari 8 gigabyte trims saya. Kemudian saya mengunduh Ubuntu 16.04, dan semuanya bekerja dengan baik. Saya memutuskan bahwa teori saya bahwa papan mendukung lebih banyak memori daripada yang dinyatakan dalam dokumentasi ternyata benar, dan saya lupa. Saya suka bekerja dengan RAM tambahan dan saya senang bahwa permainan berhasil.

Tetapi beberapa bulan kemudian saya mencoba mengunduh Windows 10. Pada dasarnya, komputer berjalan di Linux. Hanya kadang-kadang Anda perlu mem-boot Windows untuk memeriksa sesuatu. Saat itulah kesenangan dimulai.

Ketika GRUB muncul, saya memilih Windows 10 dari menu dan tekan Enter. Layar boot Windows muncul sebentar, dan kemudian saya langsung disambut oleh layar biru kematian.



Kode berhenti: ACPI_BIOS_ERROR. Saya sering mencari di Google dan menemukan bahwa intinya ada dalam beberapa masalah dengan tabel ACPI di BIOS. Antara lain, tabel ACPI memberi tahu sistem operasi bagaimana mengkonfigurasi perangkat keras. Mencoba mem-boot dari drive USB instalasi Windows menghasilkan kesalahan yang sama. Jadi, saya pikir Foxconn tidak berbohong. Komputer ini benar-benar tidak mendukung RAM 16 GB. Kembali ke 8 GB menghasilkan unduhan yang berhasil. Tes RAM juga sangat baik, jadi itu bukan bar memori yang buruk.

Saya mencoba menghubungi dukungan Foxconn tentang memperbaiki BIOS, tetapi tidak menerima tanggapan. Alamat email tercantum di situs web mereka, tetapi tidak berfungsi. Mungkin Foxconn tidak lagi berurusan dengan motherboard. Tampaknya mereka juga tidak memberikan dukungan.

Pada titik ini, orang biasa hanya akan menyerah, mengundurkan diri hingga 8 GB memori atau membeli komputer baru. Tetapi saya tidak ingin menyerah begitu saja. Saya tahu bahwa secara teori komputer dapat menggunakan 16 GB karena bekerja dengan baik di Linux. Jadi saya mulai belajar ACPI dan bereksperimen dengan pengaturan BIOS.

Saya menemukan bagian BIOS yang menarik di mana Anda dapat bermain dengan beberapa pengaturan memori. Salah satu parameter adalah "Memory Remap Feature". Dia dimasukkan. Dokumentasi BIOS mengatakan bahwa opsi ini memungkinkan "tumpang tindih memori PCI" untuk pemetaan di atas memori fisik bersama. Pencarian di Internet menunjukkan bahwa itu harus diaktifkan ketika boot ke OS 64-bit. Hanya demi percobaan, saya mematikannya, dan Windows benar-benar di-boot! Namun, dia bilang dia bisa menggunakan kurang dari 4 GB RAM. Tapi itu bagus: Saya punya cara untuk masuk ke Windows tanpa harus menghapus bilah memori secara fisik.

Ubuntu itu sama. Dengan fitur remapping memori dinonaktifkan, itu membatasi saya untuk kurang dari 4 GB RAM. Saat ini, saya yakin ada semacam masalah pemetaan memori. Saya memutuskan untuk mempelajari kesalahan ACPI_BIOS_ERROR dan penyebabnya secara lebih rinci - dan menemukan dokumen yang sangat bagus ini untuk debugging driver Microsoft, yang menjelaskan pengecekan kesalahan ACPI_BIOS_ERROR.

Menurut dokumen itu, perlu untuk menemukan empat parameter kesalahan yang sebelumnya ditampilkan pada layar biru di versi Windows yang lebih lama. Windows 10 menyembunyikan semua informasi secara default, tetapi Anda dapat mengaktifkan kembali tampilan informasi kesalahan tambahan dengan menambahkan entri ke registri. Inilah jawaban yang bagus di superuser.com yang mengarahkan saya ke arah yang benar .

Setelah mengedit registri yang sesuai, saya kembali menyalakan fungsi memetakan memori di BIOS dan boot Windows. BSOD sekarang menunjukkan empat kode tambahan di sudut kiri atas:



Hebat! Dengan demikian, parameter 1 adalah 0x0000000000000002. Dokumentasi Microsoft mengatakan bahwa parameter 1, sama dengan 0x02, berarti masalah dengan pemrosesan daftar sumber daya untuk bus root PCI. Karena parameter 2, 3, dan 4 terlihat seperti nilai gila, ini mungkin adalah pointer. Dan jika hanya ada pointer di sini, Microsoft mengatakan masalahnya adalah area decoding PCI tumpang tindih dengan daftar area memori yang dikembalikan oleh E820 BIOS.

Baiklah Ada banyak informasi, tetapi Anda dapat memulai penelitian dengan sesuatu. Saya menemukan informasi bagaimana memanggil E820 BIOS memberikan informasi tentang area memori. Kemudian dia kembali ke Linux dan melihat semua informasi awal kernel menggunakan perintah dmesg, dengan perhatian khusus pada E820 dan ACPI. Inilah yang ditemukan:

  BIOS-e820: [mem 0x000000000000000000-0x000000000009ebff] dapat digunakan
 BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] dilindungi undang-undang
 BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] dicadangkan
 BIOS-e820: [mem 0x0000000000100100-0x00000000cf77ffff] dapat digunakan
 BIOS-e820: [mem 0x00000000cf780000-0x00000000cf78dfff] data ACPI
 BIOS-e820: [mem 0x00000000cf78e000-0x00000000cf7cffff] ACPI NVS
 BIOS-e820: [mem 0x00000000cf7d0000-0x00000000cf7dffff] dilindungi undang-undang
 BIOS-e820: [mem 0x00000000cf7ed000-0x00000000cfffffff] dicadangkan
 BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] dicadangkan
 BIOS-e820: [mem 0x00000000ffb00000-0x00000000ffffffff] dilindungi undang-undang
 BIOS-e820: [mem 0x0000000100000000-0x000000042fffffff] dapat digunakan 

Kemudian saya melihat ini:

  acpi PNP0A08: 00: abaikan jendela host bridge [mem 0x400000000-0xfffffffff
 window] (konflik dengan System RAM [mem 0x100000000-0x42fffffff])
 PCI host menjembatani ke bus 0000: 00
 pci_bus 0000: 00: sumber daya bus root [io 0x0000-0x0cf7 jendela]
 pci_bus 0000: 00: sumber daya bus root [io 0x0d00-0xffff window]
 pci_bus 0000: 00: sumber daya bus root [mem 0x000a0000-0x000bffff jendela]
 pci_bus 0000: 00: sumber daya bus root [mem 0x000d0000-0x000dffff jendela]
 pci_bus 0000: 00: sumber daya bus root [mem 0xd0000000-0xdfffffff]
 pci_bus 0000: 00: sumber daya bus root [mem 0xf0000000-0xfed8ffff window]
 pci_bus 0000: 00: sumber daya bus root [bus 00-ff] 

Ya! Lihat peringatan konflik? Saya tidak akan menyadarinya, tetapi setelah menginstal memori, Linux mulai menampilkan pesan ini di setiap boot. Saya mencoba untuk boot ke Linux dengan fitur remapping memori dinonaktifkan di BIOS. Dalam hal ini, wilayah e820 terakhir menghilang dari 0x100000000 ke 0x42fffffffff, dan dengan demikian pesan konflik juga menghilang, dan "sumber daya bus root" lain muncul dalam daftar dengan jendela jembatan utama dari 0x400000000 ke 0xfffffffff.

Jadi apa yang terjadi? Linux bekerja dengan 16 GB karena memperhatikan konflik dan mengabaikan rentang PCI yang saling bertentangan yang disediakan ACPI, sementara Windows mengangkat tangannya dengan jijik dan meludahkan layar biru: "BIOS Anda memiliki masalah!" Saya tidak bisa menyalahkan Windows. Memang ada tumpang tindih, sehingga Anda bisa mengerti bahwa itu membingungkan.

Pada titik ini, saya tidak yakin apakah akan melanjutkan. Memori 768 MB terakhir, dari 0x400000000 hingga 0x42fffffffffff, dipetakan ke awal area besar ruang memori yang digunakan motherboard untuk PCI. Jelas, jika motherboard mengharapkan PCI di sana, sesuatu yang sangat buruk dapat terjadi. Jadi, motherboard hanya mendukung RAM 15,25 GB, kan?

Tapi ... di Linux, semuanya bekerja dengan baik, tanpa dukungan area pemetaan PCI tambahan ini! Bagaimana jika kita entah bagaimana memodifikasi tabel ACPI sehingga rentang PCI yang besar dimulai dari 0x430000000 bukannya 0x400000000, yaitu, segera setelah akhir RAM fisik. Maka konflik akan hilang, dan sebagian besar jendela pemetaan PCI masih akan tersedia.

Panggilan itu diterima.

Saya mulai menggali tabel ACPI. Untungnya, Linux membuat dumping sangat mudah. Ada alat khusus untuk ini, tetapi tabel dapat dengan mudah ditemukan di sysfs:

  / sys / firmware / acpi / tables 

Inilah mereka. Saya juga senang bahwa GRUB memiliki kesempatan untuk mengganti tabel ACPI Anda dengan versi baru. Oleh karena itu, jika Anda mengetahui tabel mana yang terlibat, Anda dapat menginstal versi baru dari tabel ini menggunakan GRUB. Secara teoritis, Windows akan senang dengan ini.

Di antara alat-alat lain, saya menggunakan iasl untuk mem-parsing berbagai tabel ACPI dan menemukan nilai 0x400000000 untuk diganti. Kemungkinan besar, nilai ini berada dalam urutan byte terbalik (little-endian) dan berukuran 64 bit, jadi saya menjalankan binwalk untuk mencari semua file tabel:

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

Ada satu hasil dalam tabel OEMB. Kata 64-bit berikutnya setelah itu adalah 0x1000000000, sedikit lebih besar dari alamat akhir di pesan konflik jendela jembatan utama. Petunjuk yang sangat menjanjikan. Tabel OEMB khusus karena bukan tabel standar sesuai dengan spesifikasi ACPI. Linux mengeluh tentang checksum yang tidak valid, tapi saya tidak berpikir itu penting. Saya kira Anda menebak apa yang saya lakukan selanjutnya ...

Saya membuat salinan tabel OEMB, mengganti byte 0x00 segera sebelum byte 0x04 dengan 0x30 untuk mengubah nilai menjadi 0x430000000 (ingat ini adalah urutan terbalik). Saya menempatkan salinan yang dimodifikasi ini di file / boot / oemb.dat. Kemudian dia menggunakan GRUB untuk mengganti tabel OEMB dengan salinan saya, sementara menempelkan perintah berikut ke dalam daftar perintah boot (memasukkan huruf 'e' di GRUB setelah memilih Ubuntu):

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

Idenya adalah bahwa ia memberitahu GRUB untuk memuat semua tabel ACPI kecuali tabel OEMB, dan kemudian memuat konten / boot / oemb.dat dan menambahkannya sebagai tabel tambahan. Ini secara efektif akan mengganti tabel OEMB lama dengan tabel OEMB baru.

Ok, saya boot Linux dan ...

  acpi PNP0A08: 00: abaikan jendela host bridge [mem 0x400000000-0xfffffffff
 window] (konflik dengan 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/id449940/


All Articles