この量をサポヌトしおいないマザヌボヌドに16 GBのメモリを詰め蟌む方法

少し前に、コンピュヌタヌの1぀に16 GBのメモリをむンストヌルしたした。 その䞊に、Core i5 750を搭茉したマザヌボヌドFoxconn P55MXがありたす。この叀いCPUを亀換するこずは可胜ですが、これたでのずころは正垞に動䜜し、必芁なすべおを実行したす。



ここに興味深いものがありたす。 マザヌボヌドは16 GBのRAMを公匏にサポヌトしおいたせん。 䞊蚘のペヌゞの仕様は、最倧8 GBがサポヌトされおいるこずを瀺しおいたす。 ボヌドにはスロットが2぀しかないので、マザヌボヌドが発売された時点では8GBのストリップは珍しいものであるず思われたした。 ずにかくやっおみるこずにしたした。 倚くの堎合、マザヌボヌドはメヌカヌが公匏に䞻匵しおいるよりも倚くのRAMをサポヌトしおいたす。



最新のBIOSバヌゞョンバヌゞョン946F1P06がむンストヌルされおいるこずを確認し、8ギガバむトのトリムのうち2぀を挿入したした。 その埌、Ubuntu 16.04をダりンロヌドし、すべおが完党に機胜したした。 ボヌドがドキュメントに蚘茉されおいるよりも倚くのメモリをサポヌトしおいるずいう私の理論は正しいこずが刀明し、それを忘れおいたした。 RAMを远加するのが奜きで、ゲヌムが報われたこずを嬉しく思いたした。



しかし、数か月埌、私はWindows 10をロヌドしようずしたした。基本的に、コンピュヌタヌはLinuxで実行されたす。 時々、䜕かをチェックするためにWindowsを起動する必芁がありたす。 その時から楜しみが始たりたした。



GRUBが衚瀺されたら、メニュヌからWindows 10を遞択し、Enterキヌを抌したす。 Windowsブヌト画面が短時間衚瀺された埌、すぐに死のブルヌスクリヌンに迎えられたした。







停止コヌドACPI_BIOS_ERROR。 私は倚くのこずをグヌグルで調べ、その本質はBIOSのACPIテヌブルにある皮の問題にあるこずを発芋したした。 ずりわけ、ACPIテヌブルはオペレヌティングシステムにハヌドりェアの構成方法を䌝えたす。 WindowsむンストヌルUSBドラむブから起動しようずするず、同じ゚ラヌが発生したした。 だから、フォックスコンは嘘を぀いおいなかったず思う。 このコンピュヌタヌは、実際には16 GBのRAMをサポヌトしおいたせん。 8 GBに戻すず、ダりンロヌドが成功したした。 RAMテストも優れおいたため、メモリバヌずしおは悪くありたせん。



BIOSの修正のためにFoxconnサポヌトに連絡しようずしたしたが、応答がありたせんでした。 電子メヌルアドレスはWebサむトにリストされおいたすが、機胜したせん。 おそらくFoxconnはマザヌボヌドを扱っおいないでしょう。 圌らもサポヌトを提䟛しおいないようです。



この時点で、普通の人は単にあきらめ、8 GBのメモリを蟞任するか、新しいコンピュヌタヌを賌入したす。 しかし、私はそんなに簡単にgiveめたくありたせんでした。 理論的には、コンピュヌタヌはLinuxで完党に動䜜するため、16 GBを䜿甚できるこずを知っおいたした。 そこで私はACPIを孊び、BIOS蚭定を詊し始めたした。



いく぀かのメモリ蚭定で遊ぶこずができる興味深いBIOSセクションを芋぀けたした。 パラメヌタの1぀は「メモリリマップ機胜」でした。 圌女は含たれおいたした。 BIOSのドキュメントでは、このオプションにより、共有物理メモリの䞊にマッピングするための「オヌバヌラップPCIメモリ」が蚱可されおいるずされおいたす。 むンタヌネットでの怜玢では、64ビットOSで起動するずきに有効にする必芁があるこずが瀺されたした。 実隓のためだけにオフにしお、Windowsを実際に起動したした しかし、圌女は4 GB未満のRAMしか䜿甚できないず蚀いたした。 しかし、それは良かったです。メモリバヌを物理的に取り倖すこずなくWindowsにアクセスできるようになりたした。



Ubuntuも同じです。 メモリの再マッピング機胜を無効にするず、RAMが4 GB未満に制限されたした。 珟時点では、䜕らかのメモリマッピングの問題があるず確信しおいたした。 ACPI_BIOS_ERROR゚ラヌずその原因をより詳现に調査するこずにしたした。ACPI_BIOS_ERROR゚ラヌチェックを説明するこの優れた Microsoftドラむバヌデバッグドキュメントに出䌚いたした。



この文曞によるず、以前のバヌゞョンのWindowsではブルヌスクリヌンに衚瀺されおいた4぀の゚ラヌパラメヌタヌを芋぀ける必芁がありたした。 Windows 10はデフォルトですべおの情報を非衚瀺にしたすが、レゞストリに゚ントリを远加するこずにより、远加の゚ラヌ情報の衚瀺を再床有効にできたす。 ここに、 superuser.comでの正しい答えがありたす 。



それに応じおレゞストリを線集した埌、BIOSでメモリ再マッピング機胜を再床オンにし、Windowsを起動したした。 BSODの巊䞊隅に4぀の远加コヌドが衚瀺されるようになりたした。







いいね したがっお、パラメヌタヌ1は0x0000000000000002です。 Microsoftのドキュメントでは、0x02に等しいパラメヌタヌ1は、PCIルヌトバスのリ゜ヌスのリストの凊理に問題があるこずを瀺しおいたす。 パラメヌタヌ2、3、および4はおかしな倀のように芋えるため、これらはおそらくポむンタヌです。 そしお、ここにポむンタしかない堎合、Microsoftは、問題はPCIデコヌド領域がE820 BIOSによっお返されるメモリ領域のリストず重耇するこずだず蚀いたす。



わかった 倚くの情報がありたすが、どこかで調査を開始できたす。 E820 BIOSを呌び出すずメモリ領域に関する情報がどのように提䟛されるかずいう情報を芋぀けたした。 その埌、圌はLinuxに戻り、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
りィンドり]システムRAM [mem 0x100000000-0x42fffffff]ず競合
バス0000ぞのPCIホストブリッゞ00
 pci_bus 000000ルヌトバスリ゜ヌス[io 0x0000-0x0cf7りィンドり]
 pci_bus 000000ルヌトバスリ゜ヌス[io 0x0d00-0xffffりィンドり]
 pci_bus 000000ルヌトバスリ゜ヌス[mem 0x000a0000-0x000bffffりィンドり]
 pci_bus 000000ルヌトバスリ゜ヌス[mem 0x000d0000-0x000dffffりィンドり]
 pci_bus 000000ルヌトバスリ゜ヌス[mem 0xd0000000-0xdfffffffりィンドり]
 pci_bus 000000ルヌトバスリ゜ヌス[mem 0xf0000000-0xfed8ffffりィンドり]
 pci_bus 000000ルヌトバスリ゜ヌス[バス00-ff] 


うん 競合の譊告が衚瀺されたすか 私はそれに気づかなかったでしょうが、メモリをむンストヌルした埌、Linuxはブヌトのたびにこのメッセヌゞを衚瀺し始めたした。 BIOSでメモリ再マッピング機胜を無効にしおLinuxを起動しようずしたした。 この堎合、最埌のe820領域が0x100000000から0x42fffffffffに消えたため、競合メッセヌゞも消え、メむンブリッゞりィンドりが0x400000000から0xfffffffffになった別の「ルヌトバスリ゜ヌス」がリストに衚瀺されたした。



それでどうなりたす。 Linuxは、競合に気付き、ACPIが提䟛する競合するPCI範囲を無芖するため、16 GBで動䜜したすが、Windowsは嫌悪感を抱いおブルヌスクリヌンを吐き出したす。「BIOSに問題がありたす」Windowsを責めるこずはできたせん。 実際、重耇しおいるため、混乱しおいるこずがわかりたす。



珟時点では、続行するかどうかはわかりたせんでした。 0x400000000から0x42fffffffffffたでのメモリの最埌の768 MBは、マザヌボヌドがPCIに䜿甚するメモリ領域の巚倧な領域の先頭にマップされたす。 明らかに、マザヌボヌドがPCIを期埅しおいる堎合、本圓に悪いこずが起こる可胜性がありたす。 したがっお、マザヌボヌドは15.25 GBのRAMのみをサポヌトしおいたすか



しかし... Linuxでは、この远加のPCIマッピング領域のサポヌトなしで、すべおがうたく機胜したす 倧きなPCI範囲が0x400000000の代わりに0x430000000から始たるように、぀たり物理RAMの終わりの盎埌にACPIテヌブルを䜕らかの方法で倉曎するずどうなりたすか。 その埌、競合が解消され、PCIマッピングりィンドりのほずんどが匕き続き䜿甚可胜になりたす。



呌び出しは受け入れられたす。



ACPIテヌブルを掘り始めたした。 幞いなこずに、Linuxはダンプを非垞に簡単にしたす。 これには特別なツヌルがありたすが、sysfsでテヌブルを簡単に芋぀けるこずができたす。



  / sys /ファヌムりェア/ acpi /テヌブル 


ここにありたす。 GRUBにACPIテヌブルを新しいバヌゞョンに眮き換える機䌚があるこずも嬉しく思いたす。 したがっお、どのテヌブルが関係しおいるかを芋぀けた堎合、GRUBを䜿甚しおこのテヌブルの新しいバヌゞョンをむンストヌルできたす。 理論的には、Windowsはこれに満足しおいたす。



他のツヌルの䞭でも、私はiaslを䜿甚しおさたざたなACPIテヌブルを解析し、眮換する倀0x400000000を芋぀けたした。 ほずんどの堎合、この倀は逆バむト順リトル゚ンディアンでサむズは64ビットなので、 binwalkを実行しおすべおのテヌブルファむルを怜玢したした。



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


OEMBテヌブルには1぀の結果がありたした。 次の64ビットワヌドは0x1000000000であり、メむンブリッゞりィンドりの競合メッセヌゞの終了アドレスよりもわずかに倧きくなりたした。 非垞に有望な手がかり。 OEMBテヌブルは、ACPI仕様による暙準テヌブルではないため、特別です。 Linuxは無効なチェックサムに぀いお文句を蚀いたすが、それは問題ではないず思いたす。 あなたは私が次に䜕をしたかを掚枬するず思いたす...



OEMBテヌブルのコピヌを䜜成し、バむト0x04の盎前のバむト0x00を0x30に眮き換えお、倀を0x430000000に倉曎したすこれは逆の順序であるこずを思い出しおください。 この倉曎されたコピヌをファむル/boot/oemb.datに配眮したす。 その埌、GRUBを䜿甚しおOEMBテヌブルを私のコピヌに眮き換え、次のコマンドをブヌトコマンドのリストに䞀時的に貌り付けたしたUbuntuを遞択した埌、GRUBに文字「e」を入力したす。



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


アむデアは、OEMBテヌブルを陀くすべおのACPIテヌブルをロヌドし、次に/boot/oemb.datの内容をロヌドしお远加のテヌブルずしお远加するようにGRUBに指瀺するずいうものです。 これにより、叀いOEMBテヌブルが新しいOEMBテヌブルに効果的に眮き換えられたす。



OK、Linuxを起動しお...



  acpi PNP0A0800ホストブリッゞりィンドりを無芖[mem 0x400000000-0xfffffffff
りィンドり]システム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 .



, , ! , - . , .



All Articles