Запуск 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 никогда не позволит вашему драйверу иметь приоритет над архитектурой управления памятью (понятно, что так).

По этой причине вы не можете указывать окнам не использовать определенные адреса памяти. Единственным способом для Microsoft было бы специально установить ядро ​​для вашего случая. Навряд ли.

Распространение плохих адресов памяти

Существует не так много причин, по которым модуль памяти может содержать неправильные адреса. В конечном итоге все сводится к ошибке в производственной линии, если предположить, что она не нанесла ущерба, прежде чем попасть в ваш компьютер. В отличие от жестких дисков, в модулях памяти нет подвижных частей, как вы хорошо знаете. Таким образом, плохие сектора не имеют тенденцию распространяться, как в случае с секторами жесткого диска.

Тем не менее, программное обеспечение для тестирования памяти не является надежным. Для него возможно (и обычно) передавать определенные адреса, которые на самом деле плохие. Так что плохая память может создать впечатление «распространения», так как все больше и больше адресов оказываются плохими. По этой причине такие инструменты, как BadMem, показывают свою слабость, потому что, естественно, они могут обрабатывать только те адреса, которые вы им указали.

Маловероятно, что кто-либо может провести тщательное тестирование модуля памяти и определить все неправильные адреса памяти, затем заблокировать их и в итоге получить «хороший» модуль памяти. Самое простое, что нужно сделать, - это рассматривать модуль с плохими адресами как дефектный модуль и, следовательно, не доверять ему.

Это означает, что поскольку BadMem является привлекательным предложением, оно фактически не является решением проблемы плохой памяти. Скорее всего, вы не получите операционную систему, которая пытается прочитать поврежденный сектор и завершается с ошибкой остановки. Плохой модуль - это плохой модуль - это плохой модуль.

Гном
источник
Есть довольно много хороших ответов, но я приму это за то, что дал вескую причину, почему бы не сделать это. Ядро Windows можно сказать не использовать за определенным адресом, как отмечали другие, но когда ошибка находится в середине адресного пространства, это похоже на использование топора, когда вам нужен скальпель ... более тонкий контроль желателен, но, по-видимому, невозможно. Жаль.
Боб
8
Не совсем правильно; то это можно поручить Windows , чтобы избежать определенных адресов (точнее, некоторые номера страниц кадра). Функциональность предназначена для памяти ECC, с помощью которой Windows может обнаруживать возможные сбои и помечать эти PFN как плохие, но можно вручную добавлять PFN в список: superuser.com/a/490522/117590 - просто не очень практично. Итак, да, замена остается лучшим вариантом: P
Боб
17

Windows BCD (данные конфигурации загрузки) на самом деле имеет {badmemory}объект. Похоже, что адреса памяти, которые «предсказаны как сбойные» в памяти ECC, будут перечислены здесь и не будут использоваться операционной системой.

{badmemory}Объект принимает BadMemoryList(тип BCD - 0x1700000aэлемент), который представляет собой список целых чисел , которые могут быть введены как гекс, разделенные пробелами. Я думаю, что было бы возможно вручную вставить плохие адреса памяти, найденные memtest86 к этому элементу - но я не проверял это. По-видимому, он принимает номера кадров страниц, которые являются фактическим адресом, разделенным на 4096. К сожалению, эти адреса / PFN могут не совпадать с теми, о которых сообщает диагностика памяти. Ручное редактирование может быть сделано с помощью Visual BCD Editor .

В любом случае неисправные карты памяти должны быть заменены, как указано другими ответами. Это просто примечание о возможном способе решения проблемы (временно?).

боб
источник
Лучшее учебное пособие по всему, что вы сказали, доступно здесь . Хорошая работа, несмотря на все же.
Мир
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. означает: номер страницы в окнах удаляет последние 3 шестнадцатеричных числа памяти.
  6. означает, что: Windows устраняет нули слева.
  7. рассмотрим 5 и 6, чтобы избежать ошибок в номерах страниц.
  8. правильное утверждение: bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBAк ошибкам в memtest от 0x000B7000 до 0x000BAFFF. Обратите внимание, что вы не можете поставить диапазон воспоминаний, но все страницы по одной
  9. невозможно добавить страницы, все страницы должны быть помечены одной командой. Если новая страница, добавляет перезаписывает более старую. Мне удалось добавить 4096 страниц в единственную команду. Я не пробовал это больше.
  10. bcdedit /enum {badmemory}, показывает список отмеченных страниц.
  11. bcdedit /set badmemoryaccess no предотвратить использование помеченных страниц
  12. необходимо перезагрузить компьютер после разметки страниц и удалить доступ.
jgustavo
источник
1
Я должен был удалить пробел между /и командой, чтобы он работал, поэтому вместо bcdedit / enum {badmemory}него будет то bcdedit /enum {badmemory}же самое для остальных
flagg19
Это работает, но, к сожалению, ограничение cmd в Windows ограничено 8191, и я не смог заблокировать все плохие страницы памяти. Я не мог найти хороший обходной путь для решения этой проблемы. Есть ли способ записи диапазона страниц? Я должен заблокировать все страницы от 0x714bc8 до 0x71cbd0, что слишком много страниц! Что я сделал, так? Я запустил самый простой тест (# 0 и # 1), и он получил более ограниченный диапазон ошибок памяти. Пока все работает хорошо, синих экранов больше нет. Но я знаю, что не блокировал все, что было бы необходимо.
Фелипе
3

Насколько я знаю, единственный способ сделать это - использовать команду BurnMem, которая может искусственно ограничить объем используемой памяти.

Оливер Г
источник
2
Хм .. это интересный вариант. Возможно maxmem, так как, по-видимому burnmem, не ограничивает максимальный физический адрес, а maxmemделает. Виста и 7 эквивалент будут truncatememory. Хотя это и является возможным решением, существует ли более точный метод для случаев, когда дефектная память находится в середине или начале адресного пространства и блокирует все после того, как это нежелательно?
Боб
@Bob - Почему вы не можете просто заменить плохую память на модальную?
Ramhound
@ Я бы мог, если бы захотел. Но это займет время. Прямо сейчас я работаю с половиной своей исходной памяти, не очень хорошо для моих виртуальных машин. Получение нового или замены модуля, который действительно работал бы, может занять несколько недель. Если программное решение позволяет мне сделать это за два часа или меньше, я бы посчитал, что это хорошо проведенное время и что-то новое для изучения. Я бы принял этот ответ (моя память случайно перестала работать в конце адресного пространства), но если у кого-то есть более универсальное решение, я бы предпочел это для дальнейшего использования.
Боб
@Bob - только что прочитав это довольно подробно, кажется, что это невозможно. Это связано с тем, что BadRam использует memtest для указания ядру исключать неправильные адреса из загрузчика, Windows не может этого сделать, так как в настоящее время нет способа определить, какие неправильные адреса следует исключить так же, как исправленное ядро ​​BadRam. ,
Оливер Дж
3

Посмотрите на эту утилиту: https://github.com/prsyahmi/BadMemory

Он очень прост в использовании и поддерживает блокировку диапазонов адресов. И вы можете использовать полный адрес, полученный от MemTest86, не удаляя последние три цифры.

osipxd
источник
2

ВНИМАНИЕ !!! Windows может не загрузиться, будьте готовы восстановить BCD. Для этого используйте командную строку в дополнительных параметрах запуска. Я не знаю, почему это больше не загружается, кажется, происходит случайно или если вы добавили слишком много адресов в badmemorylist.

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

Вот командная строка C ++ Programm, которая получает список адресов непрерывной памяти в файле .txt, готовом для bcdedit /set badmemorylistили bcdedit /set {badmemory} badmemorylist(не работал на Win7 для меня)

Используйте, bcdedit /set badmemoryaccess 0чтобы запретить доступ.

Вы можете проверить с EasyBCD в View Settings -> Detail. После перезагрузки проверьте 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;
}
Birnd
источник
1

Да. Есть загрузочный параметр, чтобы контролировать объем памяти, который окна могут использовать. Вы можете удалить только из конца памяти. Смотрите эту статью msdn для контроля параметров загрузки. Интересующие параметры truncatememoryи removememory.

Ник Уэйли
источник
Усечение и удаление памяти, по- видимому, просто отключают доступ к ОЗУ (начиная с заданного порога или работая в обратном направлении от конца). Этот вопрос был больше о предоставлении диапазонов.
Мир
0

Вы можете попробовать эту функцию в Windows 7, но я не уверен, на какую микросхему она повлияет, или же она снимает одинаковое количество с каждой. Я должен осмотреться, чтобы узнать это.

cutrightjm
источник