Windows arızalı RAM ile çalıştırma


25

Arızalı bir RAM modülü ile Windows'u (7, x64) çalıştırmak mümkün mü? Daha doğrusu, Windows'a bilinen bir kötü adres veya adres bloğu tahsis etmemesini söylemenin bir yolu var mı?

Linux için BadRAM var . Windows için mevcut bir uygulama var mı? Windows çekirdeği ile bile mümkün mü (NT 6.1)? Belki bir çekirdek modu sürücüsü?


4
@ekaj Satın aldıktan sonra sadece bir hafta olsaydı, garanti kapsamında değiştirilsin mi? ;)
Bob

3
Aslında en zekice olan fikir, Kırık, düzeltmek için onları almak
Journeyman Geek

Yanıtlar:


15

Bob, sorunuzun üç bölümü var. Bir seferde bir tane ele alacağım.

Windows'u hatalı bellek ile çalıştırma

Windows 7'yi arızalı bir modülle çalıştırmak gerçekten mümkün. Bozuk sektörlerin konumuna ve modülün DIMM bankanızın neresinde oturduğuna bağlı olarak, Windows 7 belleğin kötü kısımlarına dokunmaya çalışmadığı sürece hiçbir şey olmayacak gibi çalışacaktır. Bu nedenle, ideal olarak arızalı modülü banka 0'dan mümkün olduğunca uzağa taşıyacaksınız. Doğal olarak, tek modülünüz bu ise, şansınız kalmadı.

Windows'ta kötü bellek sektörlerini engelleme

X86 (32 ve 64 bit) işletim sistemlerinde, bellek çekirdek tarafından yönetilir. Bahsettiğiniz gibi, BadMem Linux'ta kötü bellek sektörlerini engelleyebilir. Çekirdeğe, belirttiğiniz bellek adreslerini kilitlemesini bildirerek çalışır. Bu, Linux’un bellek ayırırken (ve yeniden dağıtırken) hiç bir zaman bu adresleri adreslemesini engeller. Fakat bunu yapabilmek için BadMem'in çekirdeğe yama yapması gerekiyor. BadMem, uygulamadan önce yapılandırdığınız bir çekirdek yamasından başka bir şey değildir.

Şimdi, Windows'ta bu yeteneğe sahip değilsiniz. Çekirdeğe yama yapamazsınız. Bir çekirdek modu sürücüsü geliştirmek, Windows çekirdeği sürücünüzün bellek yönetimi mimarisinden öncelikli olmasına asla izin vermeyeceğinden (anlaşılır şekilde öyle) asla yarar sağlamaz.

Bu nedenle, pencerelere belirli bellek adreslerini kullanmama talimatını veremezsiniz. Microsoft'un tek yolu, sizin durumunuza özel olarak çekirdeği düzeltme ekinin kullanılması olacaktır. Olası olmayan.

Kötü bellek adreslerinin yayılması

Bir bellek modülünün hatalı adresler içermesinin birçok nedeni yoktur. Sonuçta hepsi, bilgisayarınıza girmeden önce zarar görmeyeceği varsayımıyla üretim hattında bir hataya yol açar. Sabit sürücülerin aksine, bellek modüllerinde bildiğiniz gibi hareketli parçalar yoktur. Dolayısıyla, kötü sektörler, sabit disk sektörlerinde olduğu gibi yayılma eğiliminde değildir.

Ancak, hafıza testi yazılımı kusursuz değildir. Aslında kötü olan bazı adresleri geçmesi mümkündür (ve yaygındır). Öyleyse kötü bellek, gittikçe daha fazla adresin kötü olduğu ortaya çıktıkça “yayılma” izlenimi verebilir. Bu nedenle BadMem gibi araçlar zayıflıklarını ortaya koyuyor, çünkü doğal olarak yalnızca talimat verdiğiniz adresleri idare edebiliyorlar.

Herkesin bir bellek modülünü kapsamlı bir şekilde test edebilmesi ve tüm hatalı bellek adreslerini tanımlaması, daha sonra bunları kilitlemesi ve "iyi" bir bellek modülü ile bitmesi olası değildir. Yapılması en kolay şey, hatalı adresleri olan bir modülü hatalı bir modül olarak düşünmek ve sonuçta güvenilmemektir.

Bunun anlamı, BadMem çekici bir teklif olduğu kadar, aslında kötü bellek sorununa bir çözüm değildir. Daha büyük olasılıkla, kötü bir sektörü okumaya çalışan ve durma hatasıyla çöken bir işletim sistemine sahip olmayacaksınız. Kötü bir modül kötü bir modül kötü bir modül.


Orada epeyce iyi cevaplar vardır, ama iyi bir neden vermek için bunu kabul edeceğiz neden bunu değil. Windows çekirdeğinin, başkalarının da belirttiği gibi, belirli bir adresi geçmemesi söylenebilir, ancak hata adres alanının ortasındayken, bir scapel istediğinizde bir balta kullanmak gibidir ... görünüşte imkansız. Çok yazık.
Bob,

8
Tam olarak doğru değil; o ise belli adresler (daha doğrusu belirli sayfa kare sayıları) önlemek için Windows'u talimat vermek mümkün. İşlevsellik, Windows'un olası hataları algılayabildiği ve bu PFN'leri kötü olarak işaretleyebileceği ECC belleği için tasarlanmıştır, ancak PFN'leri listeye manuel olarak eklemek mümkündür: superuser.com/a/490522/117590 - çok pratik değil. Bu nedenle, evet, değişim en iyi seçenek olmaya devam ediyor: P
Bob

17

Windows BCD (Önyükleme Yapılandırma Verileri) aslında bir {badmemory}nesneye sahiptir. ECC hafızasının "başarısız olacağı tahmin edilen" adresleri burada listelenecek ve işletim sistemi tarafından kullanılmayacak gibi görünüyor.

{badmemory}Nesne bir kabul BadMemoryList(BCD tipi 0x1700000aboşluklarla ayrılmış, hex olarak girilebilir bir tamsayı listesi) elemanı. Memtest86 tarafından bulunan hatalı bellek adreslerini bu elemana el ile eklemek mümkün olabilir, ancak bunu sınamadım. Görünüşe göre, 4096'ya bölünen asıl adres olan sayfa çerçeve numaralarını kabul eder. Ne yazık ki, bu adresler / PFN'ler bellek tanılama tarafından bildirilenlerle eşleşmeyebilir. El ile düzenleme Visual BCD Editor ile yapılabilir .

Her durumda, hatalı bellek çubukları diğer cevaplarda belirtildiği gibi değiştirilmelidir. Bu sadece, bu soruna geçici bir çözüm bulmak için olası bir yoldur (geçici olarak?).


Söylediğiniz her şeyin daha iyi biçimlendirilmiş bir öğretici burada mevcuttur . Olsa da, iyi iş.
mirh

13

, Windows BCD sahiptir {badmemorylist}ve {badmemoryaccess}nesneler. İlki, boşluklarla (ör. bcdedit /set badmemorylist 1499543 1434007) Ayıran kötü bellek sayfalarına , ikincisini No( bcdedit /set badmemoryaccess No) ayarlamalısınız.

Genellikle Windows’taki bellek sayfa boyutunun 4KB

Windows 7'de test edildi ve iyi çalışıyor

Ayarlarınızı Rammap tarafından Sysinternals

PS bu bilgiyi aldım "Windows Internals Book" chapter 10


13

SoC ile bir tablette RAM sorun vardı. Bellek kaynaklanmış veya SoC içine entegre edilmiştir ve değiştirilemez.

Arjantin’deyim ve satıcı Çin’de ve nakliye masrafları ve zamanı, garantiyi göndermenin bir anlamı yok.

Birkaç vuruş başardım.

Hasar görmüş hafıza parametrelerini geçmenin anahtarı:

  1. memtest86'daki adresler, Windows'ta kullanılan adreslerle eşleşir.
  2. 4KByte'lık tam sayfaları işaretlemelisiniz.
  3. memtest 0x10000000Windows'ta 0x10000’e tekabül eder
  4. memtest 0x00001000, Windows'ta 0x1’e tekabül eder
  5. anlamına gelir: Pencerelerdeki sayfa numarası son 3 en küçük onaltılık sayıları kaldırır.
  6. şu anlama gelir: pencereler soldaki sıfırları ortadan kaldırır.
  7. sayfa numaralarındaki hataları önlemek için 5 ve 6'yı düşünün.
  8. Doğru ifade şudur: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA0x000B7000 ile 0x000BAFFF arasındaki memtest hataları. Bir dizi hatıra koyamayacağınızı, ancak tüm sayfaların birer birer olabileceğini unutmayın.
  9. sayfa ekleyemezsiniz, tüm sayfalar aynı komutla işaretlenmelidir. Yeni bir sayfa ise, üzerine eski yazıyor ekler. Sadece bir komutla 4096 sayfa eklemeyi başardım. Daha fazla denemedim.
  10. bcdedit /enum {badmemory}, işaretli sayfaların listesini gösterir.
  11. bcdedit /set badmemoryaccess no işaretli sayfaların kullanılmasını engelle
  12. Sayfaları işaretledikten sonra yeniden başlatmak ve erişimi kaldırmak gerekir.

1
/Çalıştırılması için komut ile arasındaki boşluğu kaldırmak zorunda kaldım , bunun yerine diğerleri bcdedit / enum {badmemory}için bcdedit /enum {badmemory}aynı olacak
Çalıştırılması flagg19

Çalışıyor, ancak ne yazık ki Windows'taki cmd sınırı 8191 ile sınırlı ve tüm hatalı bellek sayfalarını engelleyemedim. Bunu çözmek için iyi bir geçici çözüm bulamadım. Sayfa aralığını kaydetmenin bir yolu var mı? 0x714bc8'den 0x71cbd0'a kadar tüm sayfaları engellemeliyim ki bu çok fazla sayfa! Ne yaptım ben? En basit testi yaptım (# 0 ve # 1) ve daha sınırlı bir bellek hatası aralığına sahip oldum. Şimdiye kadar iyi çalışıyor, mavi ekran yok. Ama biliyorum ki gerekli olan her şeyi engellemedim.
Felipe

3

Bildiğim kadarıyla, bunu yapmanın tek yolu, yapay olarak RAM pencerelerinin kullanım miktarını sınırlandırabilen BurnMem komutunu kullanmak.


2
Hmm .. bu ilginç bir seçenek. Belki de maxmem, görünüşe göre burnmemen fazla fiziksel adresi sınırlamadığı maxmemsürece. Vista ve 7 eşdeğeri olurdu truncatememory. Bu olası bir çözüm olmakla birlikte, hatalı hafızanın adres alanının ortasında veya başında olduğu ve istenmediğinde her şeyi bloke ettiği durumlar için daha kesin bir yöntem var mı?
Bob,

@Bob - Sadece basit modüler hafızayı değiştirememenizin nedeni modual değil mi?
Ramhound

@Ramhound istersem yapabilirdim. Ama bu zaman alacaktı. Şu anda orijinal belleğimin yarısı ile çalışıyorum, VM'lerim için iyi değil. İşe yarayacak yeni bir ya da değiştirme modülünün alınması birkaç hafta sürebilir. Bir yazılım çözümü bunu iki saat veya daha kısa sürede yapmama izin verirse, iyi harcanan zamanı ve yeni bir şey öğrenirim. Bu cevabı kabul ediyorum (hafızam adres alanının hemen sonunda başarısız oldu), ancak eğer birisi daha çok yönlü bir çözüme sahipse, gelecekteki refference için bunu tercih ederim.
Bob,

@Bob - Bunu oldukça kapsamlı bir şekilde okuduktan sonra mümkün olmadığı anlaşılıyor. Bunun nedeni, BadRam'ın çekirdeğe, kötü adresleri önyükleyiciden çıkarması talimatını vermek için memtest kullanması nedeniyle, Windows bunu yapamaz çünkü şu anda BadRam yamalı bir çekirdeğin yapabileceği şekilde hangi kötü adresleri hariç tutabileceğini bulması mümkün değildir. .
Oliver G


2

DİKKAT!!! Windows önyükleme başarısız olabilir, BCD'yi yeniden oluşturmaya hazır olun. Bu durumda, Gelişmiş Başlangıç ​​Seçeneklerinde Komut Promt kullanın. Neden artık önyükleme yapmayacağını bilmiyorum, rastgele oluyormuş gibi görünüyor veya çok fazla adres koymuşsanız badmemorylist'e.

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

Heres bir C ++ komut istemi Programına hazır bir .txt dosyasında sürekli bir bellek adres listesi alan bcdedit /set badmemorylistveya bcdedit /set {badmemory} badmemorylistbenim için (Win7'de işe yaramadı).

bcdedit /set badmemoryaccess 0Erişimi reddetmek için kullanın .

Görünüm Ayarları -> Ayrıntılı bölümünden EasyBCD ile kontrol edebilirsiniz. Yeniden başlattıktan sonra, Fiziksel Adres Alanı kayboldu mu Rammap ile kontrol edin.

#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;
}

1

Evet. Pencerelerin kullanabileceği bellek miktarını kontrol etmek için boot parametresi vardır. Ancak, yalnızca bellek alanının sonundan kaldırabilirsiniz. Önyükleme parametrelerini kontrol etmek için bu msdn makalesine bakın . İlgilenilen parametreler truncatememoryve removememory.


Belleği kesmek ve çıkarmak sadece RAM erişimini kesmek gibi gözüküyor (verilen bir üçlekten başlayarak veya uçtan geriye doğru çalışıyor). Bu soru aralıkları sağlama hakkında daha fazla oldu.
mirh

0

Bunu deneyebilirsin Windows 7'de özelliğini, ama emin o etkileyecek olan çip ya da her birinin kapalı aynı miktarda tarayan eğer değilim. Bunu bulmak için etrafa bakmam gerekecek.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.