memmap
このチュートリアルには、「Bad Memory HowTo」というタイトルがあり、カーネルmemmap
への引数を使用してカーネル経由でメモリを無効にする方法を説明しています。使い方によると、次の2つのオプションがありますmemmap
。
- 不良メモリの後にすべてをオフにします-
(mem=###M option)
- 不良メモリの周りのメモリだけをオフにします-
(memmap=#M$###M option)
最初のオプションでは、600Mで不良メモリがあるとmemtestが報告した場合、その時点からRAMの最後までRAMを無効にできます。
mem=595M
802Mと807Mに不良RAMがある場合、次のように800Mから始まる10MのRAMセクションを無効にできます。
memmap=10M$800M
注:これにより、800Mのベースアドレスの後に10Mがブラックリストに登録されます。memtest86+
その後、この引数が正しいことを確認するために実行する必要があります。
BadRAM
Ubuntu用のBadRamと呼ばれるパッチがあります。UbuntuコミュニティサイトのBadRAMというタイトルのこの投稿では、このトピックについて非常に詳しく説明しています。
そのページの詳細を使用してカーネルにパッチを適用した後、Grub2セットアップに変更を加えます。
Grub2のそのサイトからの抜粋
NattyのGRUB2構成ファイルには、カーネルの不良RAM除外を構成するための行があります。したがって、エラーを示しているメモリのセクションをマッピングする好ましい方法であると想定します。私が設定した行は
GRUB_BADRAM = "0x7DDF0000,0xffffc000"
私が見つけたすべてのWebサイトで推奨される方法は、memtest86を実行し、BadRAM設定を表示するように設定することでした。memtest86は、私が入らなければならなかったもののページをくれました。すべてのアドレスが1つの16Kブロックにあることがわかりました。そのため、その16Kブロックをアクションからマッピングしたかっただけです。正しいエントリを生成する方法は次のとおりです。
最初のパラメーターは簡単です。それが不良メモリのベースアドレスです。私の場合、すべての不良アドレスが0x7DDF0000より大きく、0x7DDF4000より小さいことがわかりました。そこで、16Kブロックの先頭を開始アドレスとして使用しました。
2番目のパラメーターはマスクです。必要なアドレス範囲が同じ値を共有する場合は1を、異なる場合は0を配置します。これは、下位ビットのみが異なるようにアドレス範囲を選択する必要があることを意味します。私の住所を見ると、マスクの最初の部分は簡単です。0xffffから始めます。次のニブルでは、ビットマップで説明します。0000から0011の範囲にしたいので、badramのマスクは1100または16進数cです。範囲全体をマッピングするため、最後の3つのニブルはマスク内ですべて0にする必要があります。したがって、合計結果は0xffffc000になります。
/ etc / default / grubにこの行を設定した後、sudo update-grubを実行して再起動したところ、不良メモリは使用されなくなりました。この方法を使用して不良メモリをマップするためのカーネルパッチは必要ありません。
フォローアップ#1
memtest86 +のウィキペディアページを見ると、次のように表示されます。
Memtest86ウィキペディアのページからの抜粋
Memtest86 2.3およびMemtest86 + 1.60以降では、プログラムはLinuxカーネルのBadRAMパッチで予期される形式で不良RAM領域のリストを出力できます。この情報を使用すると、Linuxシステムは、いくつかの不良ビットがある場合でも、RAMモジュールを確実に使用できます。Grub2は、これと同じ情報をパッチが適用されていないカーネルに提供できるため、BadRAMパッチの必要性がなくなります。
また、16進アドレスを使用して指定したこのGentooページに出会ったmemmap=...
ので、次のように指定できます。
memmap=5M$0x2f796c48
5Mは単なる推測です。明らかに、その領域の周囲のRAMの量に応じて、それを低くしたり高くしたりすることができます。
最後に、16進数でサイズを指定することもできます。
memmap=0x10000$0x2f796c48
アドレス0x2f796c48から始まる64KBを無視します。
参照資料