22

Можно ли запустить Windows (7, x64) с неисправным модулем памяти? Точнее, есть ли способ сказать Windows не выделять известный неправильный адрес или блок адресов?

Для Linux есть BadRAM. Существует ли существующая реализация для Windows? Это возможно даже с ядром Windows (NT 6.1)? Может быть, драйвер режима ядра?

10 ответов10

17

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

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

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

15

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

Запуск Windows с плохой памятью

Действительно возможно запустить Windows 7 с неисправным модулем. В зависимости от расположения поврежденных секторов и места расположения модуля в ваших банках DIMM, Windows 7 будет работать так, как будто ничего нет, если она не пытается коснуться плохих участков памяти. Таким образом, в идеале вы должны переместить неисправный модуль как можно дальше от банка 0. Естественно, если это ваш единственный модуль, вам не повезло.

Блокировка плохих секторов памяти в Windows

В операционных системах x86 (32 и 64 бит) память управляется ядром. Как вы упоминаете, BadMem может блокировать плохие сектора памяти в Linux. Он работает, давая команду ядру заблокировать те адреса памяти, которые вы указали. Это эффективно не дает Linux когда-либо обращаться к этим адресам при выделении (и освобождении) памяти. Но для того, чтобы сделать это, BadMem необходимо исправить ядро. BadMem - это не более чем патч ядра, который вы настраиваете перед применением.

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

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

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

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

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

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

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

12

У меня были проблемы с оперативной памятью в планшете с 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. необходимо перезагрузить компьютер после разметки страниц и удалить доступ.
12

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

7

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

3

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

3

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

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

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++, которая получает непрерывный список адресов памяти в файле .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;
}
1

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

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .