MemTestin ja kernelin yhteispeli

October 17th, 2023

Eräässä projektipöntössä ilmeni 2×8 gigan DDR3-kalikoilla MemTest86:lla satunnaista yhden (1) bitin virhettä tietyssä kiinteässä osoitteessa. Yhtäältä en oikein viitsisi tuollaisen takia ostaa uusia, mutta toisaalta ei tilannetta voi jättää sikseenkään, koska sen yhden bitin muuttuminen voi olla liikaa sopivassa tilanteessa. MemTest kertoo auliisti, että osoite on 4191A9978, mutta mitäs tällä tiedolla sitten tehdään?

Linuxin kernelille on mahdollista kertoa käynnistyksessä, että tiettyjä alueita ei käytetä. Tämän pystyy tekemään joko GRUB_BADRAM-asetuksella tai sitten suoraan kernelin parametrilla memmap. Netistä löytyy vanhoja ohjeita 32-bittisille ytimille, mutta tänä päivänä 64 bittiä on arkipäivää, joten vinkit eivät välttämättä päde sinältään. Tekee säädön kumpaa kautta hyvänsä, täytyy kertoa mikä alue ohitetaan, joko maskilla tai sitten tavumäärä. Koska peeseellä muistisivu on 4096 tavua, seuraava säätö /etc/default/grub-tiedostoon tuottaa halutun tuloksen:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash memmap=4K\\\$0x00000004191a9000"

Alkuun lisätään heksaluvun tunnus 0x ja seitsemän nollaa, jotta saadaan oikea 64-bittinen (16 numeroa) osoite, minkä lisäksi kolme alinta numeroa nollataan, jotta saadaan sivun osoite. Vielä pitää ajaa sudo update-grub sekä buutata kone, minkä jälkeen alue 4191A9000–4191A9FFF ei ole enää käytössä, ja ongelmainen muistiosoite suljetaan tylysti pois karkeloista. Neljän kilotavun haaskaaminen ei nykykoneilla merkitse mitään, etenkin kun toisessa vaakakupissa on vakaasti toimiva kone. Dmesg-komennon tulostus varmistaa säädön menneen perille:

[    0.000000] user: [mem 0x00000004191a9000-0x00000004191a9fff] reserved

Tällaiselle kikkailulle voi tulla tarvetta etenkin, jos kyseessä on emolle kiinteästi juotettu tai erityisen harvinainen/kallis muisti. Jos muistivirheet tulevat satunnaisista osoitteista tai niitä on tolkuttoman paljon, niin peli on toki menetetty.


MemTest errors and Linux command line

And a short summary in English. If there’s an isolate memory issue revealed by MemTest86, it might still be possible to use the memory modules with the help of Linux kernel’s memmap setting – also GRUB_BADRAM does the same, but uses a slightly different format. This might be particularly useful with integrated or rare/expensive RAM. In this example the unstable bit was found at address 4191A9978. Do not follow old instructions meant for 32-bit kernels, but put this in /etc/default/grub instead:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash memmap=4K\\\$0x00000004191a9000"

0x (i.e. hex) at the beginning, then seven zeroes to make it 64-bit (16 numbers) and finally the address with the lowest three numbers zeroed. This is because the page size is 4096 bytes on today’s PCs. Then run sudo update-grub and reboot, after which the offending address will not be used by the kernel. To make sure that is the case, check that dmesg agrees:

[    0.000000] user: [mem 0x00000004191a9000-0x00000004191a9fff] reserved

Losing 4 kilobytes of memory isn’t really any concern today, especially if you get a stable system back that way. If there’s a lot of errors or they appear at random locations, then there’s of course little you can do.

Filed under: linux,softat

Kommentin kirjoitus

You must be logged in to post a comment.

RSS feed for comments on this post.


Kommenttien virta

Aiheet