Menjalankan Windows dengan RAM yang rusak

25

Apakah mungkin menjalankan Windows (7, x64) dengan modul RAM yang rusak? Lebih tepatnya, apakah ada cara untuk memberitahu Windows untuk tidak mengalokasikan alamat yang dikenal buruk atau blok alamat?

Untuk Linux, ada BadRAM . Apakah ada implementasi yang ada untuk Windows? Apakah itu mungkin dengan kernel Windows (NT 6.1)? Mungkin driver mode kernel?

Bob
sumber
4
@ekaj Jika baru seminggu setelah pembelian, mungkin ganti dengan garansi? ;)
Bob
3
Sebenarnya itu ide yang paling cerdas, rusak, dapatkan mereka untuk memperbaikinya
Journeyman Geek

Jawaban:

15

Bob, ada tiga bagian untuk pertanyaanmu. Saya akan membahas satu per satu.

Menjalankan Windows dengan memori buruk

Memang mungkin untuk menjalankan Windows 7 dengan modul yang rusak. Bergantung pada lokasi bad sector dan di mana modul berada di bank DIMM Anda, Windows 7 akan berjalan seperti tidak ada apa-apa asalkan tidak mencoba menyentuh bagian buruk dari memori. Jadi, idealnya Anda akan memindahkan modul yang rusak sejauh mungkin dari bank 0. Tentu saja, jika ini adalah satu-satunya modul Anda, Anda kurang beruntung.

Memblokir sektor memori buruk di Windows

Pada sistem operasi x86 (32 dan 64 bit), memori dikelola oleh kernel. Seperti yang Anda sebutkan, BadMem mampu memblokir sektor memori buruk di Linux. Ini bekerja dengan menginstruksikan kernel untuk mengunci alamat memori yang Anda tentukan. Ini secara efektif menghentikan Linux dari pernah mengatasi alamat-alamat itu ketika mengalokasikan (dan membatalkan alokasi) memori. Tetapi untuk melakukan ini, BadMem perlu menambal kernel. BadMem tidak lebih dari patch kernel yang Anda konfigurasikan sebelum mendaftar.

Sekarang, Anda tidak memiliki kemampuan itu di Windows. Anda tidak dapat menambal kernel. Mengembangkan driver mode kernel juga tidak akan ada gunanya bagi Anda, karena kernel Windows tidak akan pernah membiarkan driver Anda lebih diutamakan daripada arsitektur manajemen memorinya (dapat dimengerti demikian).

Karena alasan ini, Anda tidak dapat menginstruksikan windows dengan cara apa pun untuk tidak menggunakan alamat memori tertentu. Satu-satunya cara bagi Microsoft untuk menambal kernel untuk kasus Anda secara khusus. Tidak sepertinya.

Penyebaran alamat memori buruk

Tidak banyak alasan mengapa modul memori mungkin berisi alamat yang salah. Pada akhirnya semuanya bermuara pada kesalahan di jalur produksi, dengan asumsi itu tidak mengalami kerusakan sebelum masuk ke komputer Anda. Berlawanan dengan hard drive, tidak ada komponen bergerak dalam modul memori, seperti yang Anda ketahui. Jadi, bad sector tidak cenderung menyebar seperti halnya sektor hard drive.

Namun, perangkat lunak tes memori tidak mudah. Mungkin (dan umum) untuk itu melewati alamat tertentu yang sebenarnya buruk. Jadi memori buruk dapat memberi kesan "menyebar" karena semakin banyak alamat yang dinyatakan buruk. Untuk alasan ini alat-alat seperti BadMem mengungkapkan kelemahan mereka, karena secara alami mereka hanya dapat menangani alamat yang Anda instruksikan.

Tidak mungkin ada orang yang dapat melakukan tes modul memori secara menyeluruh dan mengidentifikasi semua alamat memori yang buruk, kemudian mengunci mereka dan berakhir dengan modul memori "baik". Hal termudah untuk dilakukan adalah menganggap modul dengan alamat yang buruk sebagai modul yang rusak di seluruh dan akibatnya tidak dapat dipercaya.

Ini berarti bahwa, meskipun BadMem adalah proposisi yang menarik, itu sebenarnya bukan solusi untuk masalah memori buruk. Lebih mungkin maka Anda masih akan berakhir dengan sistem operasi yang mencoba membaca sektor yang buruk dan crash dengan stop error. Modul yang buruk adalah modul yang buruk adalah modul yang buruk.

A Dwarf
sumber
Ada beberapa jawaban bagus, tetapi saya akan menerima ini karena memberikan alasan yang bagus mengapa tidak melakukannya. Kernel Windows dapat diberitahu untuk tidak menggunakan melewati alamat tertentu, seperti yang telah dicatat orang lain, tetapi ketika kesalahan ada di tengah ruang alamat itu seperti menggunakan kapak ketika Anda ingin scapel ... kontrol yang lebih baik diinginkan tetapi, rupanya tidak mungkin. Itu sangat disayangkan.
Bob
8
Tidak sepenuhnya benar; itu adalah mungkin untuk menginstruksikan Windows untuk menghindari alamat tertentu (lebih akurat, nomor halaman bingkai tertentu). Fungsionalitas ini dirancang untuk memori ECC, yang Windows dapat mendeteksi kemungkinan kesalahan dan menandai PFN tersebut sebagai buruk, tetapi dimungkinkan untuk menambahkan PFN secara manual ke daftar: superuser.com/a/490522/117590 - hanya saja tidak terlalu praktis. Jadi, ya, penggantian tetap menjadi pilihan terbaik: P
Bob
17

Windows BCD (Boot Configuration Data) sebenarnya memiliki {badmemory}objek. Sepertinya alamat memori yang "diprediksi gagal" oleh memori ECC akan terdaftar di sini, dan tidak digunakan oleh sistem operasi.

The {badmemory}objek menerima BadMemoryList(tipe BCD 0x1700000a) elemen, yang merupakan daftar bilangan bulat yang bisa dimasukkan sebagai hex, dipisahkan dengan spasi. Saya kira akan mungkin untuk memasukkan alamat memori buruk secara manual seperti yang ditemukan oleh memtest86 ke elemen ini - tapi saya belum menguji ini. Tampaknya, ia menerima nomor bingkai halaman, yang merupakan alamat sebenarnya dibagi dengan 4096. Sayangnya, alamat / PFN ini mungkin tidak cocok dengan yang dilaporkan oleh diagnostik memori. Pengeditan manual dapat dilakukan dengan Visual BCD Editor .

Bagaimanapun, memory stick yang rusak harus diganti seperti yang ditunjukkan oleh jawaban lain. Ini hanyalah catatan tentang cara yang mungkin untuk mengatasi masalah ini (sementara?).

Bob
sumber
Tutorial berformat yang lebih baik dari semua yang Anda katakan tersedia di sini . Kerja bagus meskipun.
mirh
13

Windows BCD memiliki {badmemorylist}dan {badmemoryaccess}objek. Anda harus mengatur halaman memori pertama ke buruk dipisahkan oleh spasi (mis. bcdedit /set badmemorylist 1499543 1434007) Dan yang kedua ke No( bcdedit /set badmemoryaccess No)

Ingatlah bahwa ukuran halaman memori di windows biasanya 4KB

Diuji di windows 7 dan berfungsi dengan baik

Anda dapat menguji pengaturan Anda dengan Rammap oleh Sysinternals

PS, saya mendapat info itu "Windows Internals Book" chapter 10

Vyacheslav Dorzhiev
sumber
13

Saya mengalami masalah RAM di tablet dengan SoC. Memori dilas atau diintegrasikan ke dalam SoC dan tidak dapat diganti.

Saya di Argentina dan penjualnya di Cina, dan biaya pengiriman dan waktunya, tidak masuk akal untuk mengirimkan garansi.

Saya berhasil beberapa hit.

Kunci untuk melewatkan parameter memori yang rusak adalah:

  1. alamat di memtest86 cocok dengan alamat yang digunakan di Windows.
  2. harus menandai halaman penuh 4KBytes.
  3. dalam memtest 0x10000000sesuai dengan 0x10000 di Windows
  4. dalam memtest 0x00001000sesuai dengan 0x1 di Windows
  5. berarti: Nomor halaman di windows menghapus 3 angka heksadesimal memtest terakhir.
  6. berarti: windows menghilangkan nol di sebelah kiri.
  7. pertimbangkan 5 dan 6, untuk menghindari kesalahan dalam nomor halaman.
  8. pernyataan yang benar adalah: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAuntuk kesalahan dalam memtest dari 0x000B7000 hingga 0x000BAFFF. Perhatikan bahwa Anda tidak dapat menempatkan serangkaian memori, tetapi semua halaman satu per satu
  9. tidak dapat menambahkan halaman, semua halaman harus ditandai dalam perintah yang sama. Jika halaman baru, tambahkan timpa lebih lama. Saya berhasil menambahkan 4096 halaman dalam satu-satunya perintah. Saya belum mencobanya lagi.
  10. bcdedit /enum {badmemory}, menunjukkan daftar halaman yang ditandai.
  11. bcdedit /set badmemoryaccess no mencegah halaman yang ditandai digunakan
  12. perlu me-reboot setelah menandai halaman dan menghapus akses.
jgustavo
sumber
1
Saya harus menghapus ruang putih antara /dan perintah untuk itu berfungsi, jadi alih-alih bcdedit / enum {badmemory}itu akan bcdedit /enum {badmemory}sama untuk yang lain
flagg19
Ini berfungsi, tetapi sayangnya batas cmd pada Windows terbatas pada 8191 dan saya tidak dapat memblokir semua halaman memori buruk. Saya tidak dapat menemukan solusi yang baik untuk menyelesaikan ini. Apakah ada cara untuk merekam rentang halaman? Saya harus memblokir semua halaman dari 0x714bc8 hingga 0x71cbd0 yang terlalu banyak halaman! Apa yang saya buat, jadi? Saya menjalankan tes yang paling sederhana (# 0 dan # 1) dan mendapat kesalahan memori yang lebih terbatas. Ini berjalan dengan baik sejauh ini, tidak ada lagi layar biru. Tapi saya tahu saya tidak memblokir semua yang diperlukan.
Felipe
3

Sejauh yang saya ketahui, satu-satunya cara untuk melakukan ini adalah menggunakan perintah BurnMem yang secara artifisial dapat membatasi jumlah penggunaan RAM windows.

Oliver G
sumber
2
Hmm .. itu opsi yang menarik. Mungkin maxmem, karena tampaknya burnmemtidak membatasi alamat fisik maks maxmem. Vista dan 7 akan setara truncatememory. Meskipun ini merupakan solusi yang memungkinkan, apakah ada metode yang lebih tepat untuk kasus di mana memori yang rusak berada di tengah atau awal ruang alamat dan memblokir semuanya setelah itu tidak diinginkan?
Bob
@ Bob - Alasan Anda tidak bisa begitu saja mengganti memori buruk adalah mengapa?
Ramhound
@ Rudhound aku bisa, jika aku mau. Tapi itu butuh waktu. Saat ini, saya menjalankan dengan setengah memori asli saya, tidak bagus untuk VM saya. Mendapatkan modul baru atau pengganti yang benar-benar berfungsi bisa memakan waktu beberapa minggu. Jika solusi perangkat lunak memungkinkan saya melakukan ini dalam dua jam atau kurang, saya akan menganggapnya menghabiskan waktu dengan baik dan sesuatu yang baru dipelajari. Saya akan menerima jawaban ini (ingatan saya gagal tepat di akhir ruang alamat) tetapi jika seseorang memiliki solusi yang lebih fleksibel, saya lebih suka itu untuk referensi di masa mendatang.
Bob
@ Bob - Baru saja membaca ini secara luas, tampaknya itu tidak mungkin. Ini karena BadRam menggunakan memtest untuk menginstruksikan kernel untuk mengecualikan alamat buruk dari bootloader, Windows tidak dapat melakukan ini karena saat ini tidak ada cara untuk itu untuk mengetahui alamat buruk mana yang harus dikecualikan dengan cara yang sama seperti kernel yang ditambal BadRam dapat .
Oliver G
3

Lihatlah util ini: https://github.com/prsyahmi/BadMemory

Sangat mudah digunakan dan mendukung pemblokiran rentang alamat. Dan Anda dapat menggunakan alamat lengkap yang diterima dari MemTest86 tanpa menghapus tiga digit terakhir.

osipxd
sumber
2

PERINGATAN!!! Windows mungkin gagal untuk boot, siap untuk membangun kembali BCD. Untuk itu gunakan Command Promt di Advanced Startup Options. Saya tidak tahu mengapa itu tidak bisa boot lagi, tampaknya terjadi secara acak atau jika Anda memasukkan terlalu banyak Alamat ke dalam badmemorylist.

bootrec /rebuild bcd
bcdedit /export c:\bcdbackup
attrib c:\boot\bcd -h -r -s
ren c:\boot\bcd bcd.old
bootrec /rebuild bcd

Inilah program prompt perintah C ++ yang mendapatkan daftar alamat memori terus-menerus dalam file .txt yang siap untuk bcdedit /set badmemorylistatau bcdedit /set {badmemory} badmemorylist(tidak berfungsi pada Win7 untuk saya)

Gunakan bcdedit /set badmemoryaccess 0untuk menolak akses.

Anda dapat memeriksa dengan EasyBCD di View Settings -> Detail. Setelah restart dengan cek dengan Rammap jika Space Alamat Fisik lenyap.

#include <cstdlib>
#include <iostream>
#include <fstream>

//converts hex into base10
unsigned long convertHexToIntBase10(char* inputHex)
{
    unsigned long hexValue = std::strtoul(inputHex, 0, 16);
    return hexValue;
}

int main(int argc, char* argv[])
{
    if(argc < 3){
        std::cerr << "Usage: MemoryPageListHex [Low Memory Adress] [High Memory Adress] in 4k Pages i.e. MemoryPageListHex 1bae50 1bb0e7 for 0x1bae50148 to 0x1bb0e7fe8" << std::endl;
        return 0;
    }
    auto lowAdr = convertHexToIntBase10(argv[1]);
    auto highAdr = convertHexToIntBase10(argv[2]);
    std::ofstream myfile;
    myfile.open ("MemoryAdress4k.txt");
    for (auto i=lowAdr; i<highAdr; i++){
        myfile << std::hex << "0x" << i << " ";
    }
    myfile.close();
    return 0;
}
Birnd
sumber
1

Iya nih. Ada parameter boot untuk mengontrol jumlah memori yang dapat digunakan windows. Anda hanya dapat menghapus dari ujung ruang memori. Lihat artikel msdn ini untuk mengontrol parameter boot. Parameter yang menarik adalah truncatememorydan removememory.

Nick Whaley
sumber
Memotong dan menghapus memori tampaknya hanya untuk memotong akses RAM (mulai dari yang diberikan sebelumnya, atau bekerja mundur dari ujung). Pertanyaan ini lebih tentang menyediakan rentang.
mirh
0

Anda dapat mencoba fitur ini di Windows 7, tetapi saya tidak yakin chip mana yang akan berpengaruh, atau jika memotong jumlah yang sama dari masing-masing. Saya harus melihat sekeliling untuk mencari tahu.

cutrightjm
sumber