Запуск Windows з несправною оперативною пам’яттю


25

Чи можливо запустити Windows (7, x64) з несправним модулем ОЗУ? Точніше, чи є якийсь спосіб сказати Windows не виділяти відому погану адресу або блок адрес?

Для Linux існує BadRAM . Чи існує реалізація для Windows? Це можливо навіть з ядром Windows (NT 6.1)? Може бути драйвер режиму ядра?


4
@ekaj Якщо це був лише тиждень після покупки, можливо, замініть його на гарантію? ;)
Боб

3
Насправді це найрозумніша ідея. Її зламали, примуси їх виправити
Journeyman Geek

Відповіді:


15

Боб, у твоєму питанні є три частини. Я звернусь по одному.

Запуск Windows з поганою пам'яттю

Дійсно запустити Windows 7 з несправним модулем. Залежно від розташування поганих секторів та місця, де модуль сидить у ваших банках DIMM, Windows 7 працюватиме так, ніби нічого немає, доки він не намагатиметься торкнутися поганих ділянок пам'яті. Отже, в ідеалі ви пересунете несправний модуль якомога далі від банку 0. Природно, якщо це ваш єдиний модуль, вам не пощастить.

Блокування поганих секторів пам'яті в Windows

У операційних системах x86 (32 та 64 біт) пам'ять управляється ядром. Як ви вже згадували, BadMem може блокувати сектори поганої пам'яті в Linux. Він працює, доручивши ядру блокувати вказані вами адреси пам'яті. Це ефективно зупиняє Linux ніколи не звертатися до цих адрес під час розподілу (та взаємодії) пам'яті. Але для цього BadMem потребує виправлення ядра. BadMem - це не що інше, як патч ядра, який ви налаштовуєте перед застосуванням.

Тепер у вас немає такої можливості в Windows. Ви не можете виправити ядро. Розробка драйвера режиму ядра теж не принесе вам користі, оскільки ядро ​​Windows ніколи не дозволить вашому драйверу мати перевагу над його архітектурою управління пам’яттю (зрозуміло, що так).

З цієї причини ви жодним чином не можете доручити Windows не використовувати певні адреси пам'яті. Єдиний спосіб - це Майкрософт спеціально закріпити ядро ​​для вашого випадку. Навряд чи.

Поширення поганих адрес пам'яті

Існує не так багато причин, чому модуль пам'яті може містити погані адреси. Зрештою, все зводиться до помилки на виробничій лінії, припускаючи, що вона не зазнала пошкоджень перед тим, як потрапити на ваш комп'ютер. На відміну від жорстких дисків, в модулях пам'яті немає рухомих деталей, як ви добре знаєте. Отже, погані сектори не мають тенденції до поширення, як це стосується секторів жорсткого диска.

Однак програмне забезпечення для тестування пам'яті не є надійним. Можна (і звичайно) передавати певні адреси, які насправді погані. Тож погана пам'ять може створювати враження про "поширення", оскільки все більше і більше адрес виявляються поганими. З цієї причини такі інструменти, як BadMem, виявляють їх слабкість, оскільки, природно, вони можуть обробляти лише ті адреси, які ви їм доручаєте.

Навряд чи хтось зможе провести ретельну перевірку модуля пам'яті та виявити всі погані адреси пам'яті, потім заблокувати їх і закінчити «хорошим» модулем пам'яті. Найпростіше - це розглянути модуль із поганими адресами як несправний модуль на протязі, і, отже, не довіряти йому.

Це означає, що наскільки BadMem є привабливою пропозицією, це насправді не є вирішенням проблеми поганої пам'яті. Швидше за все, ви не все ще отримаєте операційну систему, яка намагається прочитати поганий сектор і виходить з ладу з помилкою зупинки. Поганий модуль - поганий модуль - поганий модуль.


Хороших відповідей є досить багато, але я прийму це за те, щоб дати вагому причину, чому цього не зробити. Ядро Windows може сказати не використовувати минулу певну адресу, як зазначали інші, але коли помилка знаходиться посередині адресного простору, це як використання сокири, коли ви хочете скапел ... бажано більш тонкий контроль, але, мабуть, неможливо. Жаль.
Боб

8
Не зовсім коректно; то це можна доручити Windows , щоб уникнути певних адрес (точніше, деякі номери сторінок кадру). Функціонал розроблений для пам’яті ECC, за допомогою якої Windows може виявити можливі несправності та позначити ці ПФН як погані, але можна вручну додати PFN до списку: superuser.com/a/490522/117590 - просто не дуже практично. Отже, так, заміна залишається найкращим варіантом: P
Боб

17

Windows BCD (дані конфігурації завантаження) насправді має {badmemory}об’єкт. Здається, адреси пам'яті, які "прогнозуються з ладу" пам'яттю ECC, будуть перераховані тут, а не використовуються операційною системою.

{badmemory}Об'єкт приймає BadMemoryList(тип BCD - 0x1700000aелемент), який представляє собою список цілих чисел , які можуть бути введені як гекс, розділені пробілами. Я думаю, можна було б вручну вставити погані адреси пам'яті, як знайдено memtest86, до цього елемента, але я цього не перевіряв. Мабуть, він приймає номери кадрів сторінки, що є фактичною адресою, поділеною на 4096. На жаль, ці адреси / PFN можуть не відповідати тим, про які повідомляється в діагностиці пам'яті. Вручну редагування можна здійснити за допомогою редактора Visual BCD .

У будь-якому випадку несправні картки пам'яті слід замінити, як зазначено в інших відповідях. Це лише примітка про можливий спосіб вирішити проблему (тимчасово?).


Краще відформатований підручник із усього, що ви сказали, доступний тут . Хороша робота, хоча.
mirh

13

У Windows BCD є {badmemorylist}і {badmemoryaccess}об'єкти. Ви повинні встановити першу сторінку з поганою пам'яттю, розділену пробілами (наприклад, bcdedit /set badmemorylist 1499543 1434007), а другу - No( bcdedit /set badmemoryaccess No)

Майте на увазі, що розмір сторінки пам'яті у Windows зазвичай 4KB

Тестований у Windows 7, і він працює добре

Ви можете перевірити свої налаштування за допомогою Rammap від Sysinternals

PS Я отримав цю інформацію від "Windows Internals Book" chapter 10


13

У мене виникли проблеми з оперативною пам’яттю в планшеті з SoC. Пам'ять зварена або інтегрована в SoC і не може бути замінена.

Я в Аргентині, а продавець - у Китаї, а вартість доставки та час доставки не має сенсу надсилати гарантію.

Мені вдалося кілька хітів.

Ключовим фактором для передачі пошкоджених параметрів пам'яті є:

  1. адреси у відповідних memtest86 адресах, які використовуються в Windows.
  2. повинні позначати повні сторінки 4KBytes.
  3. в memtest 0x10000000відповідає 0x10000 в Windows
  4. в memtest 0x00001000відповідає 0x1 в Windows
  5. означає: Номер сторінки у вікнах видаляє останні три шість шістнадцяткових цифр.
  6. означає, що: windows усуває нулі зліва.
  7. розгляньте 5 і 6, щоб уникнути помилок у номерах сторінок.
  8. правильне твердження: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAдо помилок у записі від 0x000B7000 до 0x000BAFFF. Зауважте, що ви можете не розміщувати діапазон спогадів, але всі сторінки по черзі
  9. не вдається додати сторінки, усі сторінки повинні бути позначені в одній команді. Якщо нова сторінка, додається перезапис старішої. Мені вдалося додати 4096 сторінок лише командою. Я більше не пробував цього.
  10. bcdedit /enum {badmemory}, показує список позначених сторінок.
  11. bcdedit /set badmemoryaccess no не допускати використання позначених сторінок
  12. необхідно перезавантажити після маркування сторінок і видалити доступ.

1
Мені довелося прибрати білий пробіл між командою /та командою, щоб вона працювала, тому замість bcdedit / enum {badmemory}неї буде те bcdedit /enum {badmemory}саме для інших
flagg19

Це працює, але, на жаль, обмеження cmd у Windows обмежено 8191, і я не зміг заблокувати всі сторінки поганої пам'яті. Я не міг знайти хорошого вирішення цього питання. Чи є спосіб записати діапазон сторінок? Я повинен заблокувати всі сторінки від 0x714bc8 до 0x71cbd0, що занадто багато сторінок! Що я зробив, так? Я провів найпростіший тест (№ 0 і №1), і він отримав більш обмежений діапазон помилок пам'яті. Поки що він працює добре, синіх екранів більше немає. Але я знаю, що не заблокував усе необхідне.
Феліпе

3

Наскільки мені відомо, єдиний спосіб зробити це - скористатися командою BurnMem, яка може штучно обмежити кількість використовуваних вікон ОЗУ.


2
Хм .. це цікавий варіант. Можливо maxmem, оскільки, мабуть burnmem, не обмежує максимальну фізичну адресу при цьому maxmem. Еквівалент Vista і 7 був би truncatememory. Хоча це можливе рішення, чи існує більш точний метод для випадків, коли несправна пам'ять знаходиться в середині або на початку адресного простору і блокує все після того, як це не бажано?
Боб

@Bob - З цієї причини ви не можете просто замінити погану пам'ять модальною, чому?
Рамхаунд

@Ramhound я міг би, якби хотів. Але на це знадобився б час. Зараз я біжу з половиною своєї оригінальної пам’яті, не дуже підходить для моїх віртуальних машин. Отримання нового або замінного модуля, який би фактично працював, може зайняти кілька тижнів. Якщо програмне рішення дозволить мені зробити це за дві години або менше, я вважаю б це добре витраченим часом і щось новим навчився. Я би прийняв цю відповідь (моя пам'ять вийшла з ладу в кінці адресного простору), але якщо у когось є більш універсальне рішення, я вважаю за краще це для подальшої референції.
Боб

@Bob - Щойно прочитавши це досить широко, виявляється, що це неможливо. Це тому, що BadRam використовує memtest для вказівки ядра виключати погані адреси з завантажувача, Windows не може цього зробити, оскільки в даний час немає можливості розробити, які погані адреси виключити так само, як може зафіксовано ядро ​​BadRam, яке виправлено .
Олівер Г

3

Подивіться на цю утиліту: https://github.com/prsyahmi/BadMemory

Це дуже просто у використанні та підтримує блокування діапазонів адрес. І ви можете використовувати повну адресу, отриману від MemTest86, не видаляючи останні три цифри.


2

ОБЕРЕЖНО !!! Windows може не завантажитися, будьте готові до відновлення BCD. У цьому випадку використовуйте командний рядок у розширених параметрах запуску. Я не знаю, чому він більше не завантажується, здається, відбувається випадковим чином, або якщо ти помістиш занадто багато Адреси в список негідностей.

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

Ось програма C ++ командного рядка, яка отримує нескінченний список адрес пам'яті у файлі .txt, готовому bcdedit /set badmemorylistабо bcdedit /set {badmemory} badmemorylist(не працював на Win7 для мене)

Використовувати bcdedit /set badmemoryaccess 0для заборони доступу.

Перевірити це можна за допомогою EasyBCD у Налаштуваннях перегляду -> Детально. Після перезапуску перевірити за допомогою Rammap, якщо фізичний простір адрес зник.

#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

Так. Існує параметр завантаження, щоб контролювати об'єм пам'яті, який Windows може використовувати. Однак ви можете видалити лише з кінця місця пам'яті. Дивіться цю статтю msdn для керування параметрами завантаження. Цікаві параметри є truncatememoryі removememory.


Скорочення та вилучення пам’яті, здається, просто скоротить доступ до оперативної пам’яті (починаючи з заданого тиражу або працює назад від кінця). Це питання стосувалося більше діапазону.
mirh

0

Ви можете спробувати цю функцію в Windows 7, але я не впевнений, на який мікросхемі вона вплине, або якщо вона зніме однакову суму від кожної. Мені доведеться озирнутися, щоб дізнатися це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.