Apakah memtest86 + menguji memori yang digunakan untuk menjalankannya sendiri?

65

Salah satu skenario kegagalan server yang umum adalah DRAM buruk, kadang-kadang bahkan ketika memori ECC digunakan.

memtest86+adalah salah satu alat yang paling berguna untuk mendiagnosis masalah DRAM. Saat memuat sendiri di awal memori, saya sudah bertanya-tanya apakah memtest86+memeriksa bagian dari memori yang memtest86+dimuat ke.

Apakah memori dialokasikan memtest86+sedemikian kecil sehingga tidak masalah, atau mungkinkah ada yang memtest86+kehilangan DRAM karena tidak dapat menguji lokasi memori tempat ia berada?

Robin
sumber
8
Meskipun pertanyaan ini relevan untuk server, namun juga relevan untuk PC biasa, jadi saya memilih untuk memindahkan pertanyaan ini ke Super User di mana ia dapat menjangkau lebih banyak orang.
Cristian Ciupitu

Jawaban:

78

Jelas, memtest86 + tidak dapat menguji wilayah memori yang saat ini berisi kode yang dapat dieksekusi memtest86 + (tetapi jika ada kesalahan memori di wilayah itu, sangat mungkin bahwa tes itu sendiri akan crash). Namun, memtest86 + dapat memindahkan kode sendiri ke alamat yang berbeda saat runtime, dan dengan menggunakan trik ini, ia dapat menguji semua memori yang diizinkan untuk digunakan oleh firmware (BIOS) - tidak semuanya sekaligus.

Relokasi kode ini dijelaskan dalam README.background di dalam arsip kode sumber memtest86 + (file sedikit kedaluwarsa - misalnya, menyatakan bahwa alamat yang digunakan untuk kode memtest86 + adalah 0x2000 dan 0x200000, tetapi alamat rendah seperti yang didefinisikan dalam sumber adalah sebenarnya 0x10000, dan alamat tingginya adalah 0x2000000 atau 0x300000 tergantung pada jumlah memori di mesin).

Tetapi bahkan dengan trik relokasi ini memtest86 + tidak dapat menguji semua memori karena alasan berikut:

  • Biasanya firmware (BIOS) cadangan beberapa daerah RAM untuk penggunaannya sendiri (misalnya, tabel ACPI). Sementara wilayah RAM ini dapat diakses oleh CPU, menulis apa pun ke dalamnya dapat mengakibatkan perilaku yang tidak terduga.

  • Beberapa bagian dari RAM digunakan untuk Mode Manajemen Sistem dan bahkan tidak dapat diakses dari CPU di luar kode SMM istimewa.

  • Kisaran alamat RAM antara 640K dan 1M tidak dapat diakses karena kebiasaan tata letak memori PC lama (sebagian RAM ini dapat digunakan sebagai bayangan untuk ROM BIOS dan untuk SMM, bagian lain mungkin sepenuhnya tidak dapat diakses).

Sergey Vlasov
sumber
1
Menarik, saya melewatkan kemampuan relokasi. Jelas SMM dan sejenisnya berada di luar jangkauan (selain dukungan BIOS khusus).
shodanshok
Wilayah-wilayah yang dipetakan umumnya mengecualikan DRAM sebagai sesuatu yang lain "off module" sedang ditangani? ROM dan perangkat periferal mengatakan.
mckenzm
3
jika Anda memiliki beberapa modul ram, lakukan tes kedua setelah menukarnya ...
JFL
Mungkinkah ada memori yang gagal dengan cara yang benar untuk memtest secara salah melaporkan keberhasilan karena instruksinya ditulis ulang? Atau lebih tepatnya, berapa banyak kesalahan yang terjadi?
John Dvorak
3
@ JanDvorak: Secara teori, itu mungkin, tentu saja. Dalam praktiknya, saya akan mengatakan itu hanya sedikit lebih mungkin daripada membenturkan kepala Anda pada keyboard dan secara acak mengetik soneta Shakespeare.
Ilmari Karonen
5

Tidak, memtest tidak dapat menguji ingatannya sendiri. Namun, ini sangat kecil (hanya beberapa KB) sehingga sulit. EDIT: pernyataan ini salah karena, sebagaimana dinyatakan dalam jawaban yang dipilih, memtest dapat secara dinamis memindahkan dirinya untuk menguji semua memori yang dapat dialamatkan pengguna.

-

Secara teori, prosesor modern dapat, pada saat boot, mengkonfigurasi sebagian dari cache mereka sebagai memori yang dapat diprogram, dari dalam program yang sangat kecil (seperti memtest) dapat dijalankan tanpa menyentuh DRAM sama sekali.

Namun, ini adalah fitur khusus model (yang memerlukan dukungan BIOS) dan saya tidak berpikir memtest menggunakannya.

shodanshok
sumber
Terima kasih atas jawaban Anda. memtestsedang menguji cache CPU juga. Jadi jika memtestakan dimuat ke dalam cache ini, maka apakah ini bagian dari cache tidak dapat diuji, yang lebih bermasalah, karena jauh lebih kecil daripada memori?
Robin
2
Diambil pada dokumentasi memtest86 itu tidak menguji cache prosesor, setidaknya secara langsung. Selain itu, prosesor modern memiliki instruksi dan cache data yang terpisah (I $ dan D $). Kode yang dapat dieksekusi dimasukkan ke dalam cache instruksi dan tidak dapat secara langsung dimodifikasi / ditimpa
shodanshok
1
memtest86 + pasti menguji cache data CPU, tetapi itu tidak masalah untuk pertanyaan ini. Sekali lagi terima kasih atas jawaban Anda.
Robin
3
Apa kau yakin tentang ini? Saya pikir itu disalin sendiri di tempat lain saat menguji memori yang biasanya hidup. Itu sebabnya setiap tes memiliki bagian yang lambat (sebagian besar memori) dan bagian yang sangat cepat (bagian kecil di mana kode / data disimpan).
Peter Cordes
1
@DmitryGrigoryev: Ah oke .. jadi saya sudah belajar lebih banyak :-) Keren terima kasih!
Robin