Запуск Windows с дефектом оперативной памяти
Можно ли запустить Windows (7, x64) с неисправным модулем памяти? Точнее, есть ли способ сказать Windows не выделять известный неправильный адрес или блок адресов?
Для Linux есть BadRAM. Существует ли существующая реализация для Windows? Это возможно даже с ядром Windows (NT 6.1)? Может быть, драйвер режима ядра?
11 ответов
Боб, на твой вопрос есть три части. Я буду обращаться по одному за раз.
Запуск Windows с плохой памятью
Действительно возможно запустить Windows 7 с неисправным модулем. В зависимости от местоположения поврежденных секторов и расположения модуля в ваших банках DIMM, Windows 7 будет работать так, как будто ничего нет, если она не пытается коснуться плохих участков памяти. Итак, в идеале вы должны переместить неисправный модуль как можно дальше от банка 0. Естественно, если это ваш единственный модуль, вам не повезло.
Блокировка плохих секторов памяти в Windows
В операционных системах x86 (32 и 64 бит) память управляется ядром. Как вы упоминаете, BadMem может блокировать плохие сектора памяти в Linux. Он работает, давая команду ядру заблокировать те адреса памяти, которые вы указали. Это эффективно не дает Linux когда-либо обращаться к этим адресам при выделении (и освобождении) памяти. Но для того, чтобы сделать это, BadMem необходимо исправить ядро. BadMem - это не более чем патч ядра, который вы настраиваете перед применением.
Теперь у вас нет такой возможности в Windows. Вы не можете исправить ядро. Разработка драйвера режима ядра также не принесет вам пользы, поскольку ядро Windows никогда не позволит вашему драйверу иметь приоритет над архитектурой управления памятью (понятно, что так).
По этой причине вы не можете указывать окнам не использовать определенные адреса памяти. Единственным способом для Microsoft было бы специально установить ядро для вашего случая. Навряд ли.
Распространение плохих адресов памяти
Существует не так много причин, по которым модуль памяти может содержать неправильные адреса. В конечном итоге все сводится к ошибке в производственной линии, если предположить, что она не нанесла ущерба, прежде чем попасть в ваш компьютер. В отличие от жестких дисков, в модулях памяти нет подвижных частей, как вы хорошо знаете. Таким образом, плохие сектора не имеют тенденцию распространяться, как в случае с секторами жесткого диска.
Тем не менее, программное обеспечение для тестирования памяти не является надежным. Для него возможно (и обычно) передавать определенные адреса, которые на самом деле плохие. Так что плохая память может создать впечатление "распространения", так как все больше и больше адресов оказываются плохими. По этой причине такие инструменты, как BadMem, показывают свою слабость, потому что, естественно, они могут обрабатывать только те адреса, которые вы им указали.
Маловероятно, что кто-либо может провести тщательное тестирование модуля памяти и определить все неправильные адреса памяти, затем заблокировать их и в итоге получить "хороший" модуль памяти. Самое простое, что нужно сделать, - это рассматривать модуль с плохими адресами как дефектный модуль и, следовательно, не доверять ему.
Это означает, что поскольку BadMem является привлекательным предложением, оно фактически не является решением проблемы плохой памяти. Скорее всего, вы не получите операционную систему, которая пытается прочитать поврежденный сектор и завершается с ошибкой остановки. Плохой модуль - это плохой модуль - это плохой модуль.
Windows BCD (данные конфигурации загрузки) на самом деле имеет {badmemory}
объект. Похоже, что адреса памяти, которые "предсказаны как сбойные" в памяти ECC, будут перечислены здесь и не будут использоваться операционной системой.
{badmemory}
объект принимает BadMemoryList
(Тип BCD 0x1700000a
) элемент, представляющий собой список целых чисел, которые можно ввести как шестнадцатеричные, разделенные пробелами. Я думаю, что было бы возможно вручную вставить плохие адреса памяти, найденные memtest86 к этому элементу - но я не проверял это. По-видимому, он принимает номера кадров страниц, которые являются фактическим адресом, разделенным на 4096. К сожалению, эти адреса /PFN могут не совпадать с теми, о которых сообщает диагностика памяти. Ручное редактирование может быть сделано с помощью Visual BCD Editor.
В любом случае неисправные карты памяти должны быть заменены, как указано другими ответами. Это просто примечание о возможном способе решения проблемы (временно?).
У меня были проблемы с оперативной памятью в планшете с SoC. Память сварена или встроена в SoC и не может быть заменена.
Я нахожусь в Аргентине, а продавец находится в Китае, и стоимость доставки и время, нет смысла отправлять по гарантии.
Мне удалось несколько хитов.
Ключ к передаче поврежденных параметров памяти:
- адреса в memtest86 соответствуют адресам, используемым в Windows.
- должен отмечать полные страницы 4KBytes.
- в памяти
0x10000000
соответствует 0x10000 в Windows - в памяти
0x00001000
соответствует 0x1 в Windows - означает: номер страницы в окнах удаляет последние 3 шестнадцатеричных числа памяти.
- означает, что: Windows устраняет нули слева.
- рассмотрим 5 и 6, чтобы избежать ошибок в номерах страниц.
- правильное утверждение:
bcdedit /set {badmemory} badmemorylist 0xB7 0xB8 0xB9 0xBA
к ошибкам в memtest от 0x000B7000 до 0x000BAFFF. Обратите внимание, что вы не можете поставить диапазон воспоминаний, но все страницы по одной - невозможно добавить страницы, все страницы должны быть помечены одной командой. Если новая страница, добавляет перезаписывает более старую. Мне удалось добавить 4096 страниц в единственную команду. Я не пробовал это больше.
bcdedit /enum {badmemory}
, показывает список отмеченных страниц.bcdedit /set badmemoryaccess no
предотвратить использование помеченных страниц- необходимо перезагрузить компьютер после разметки страниц и удалить доступ.
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
Эх, я бы не чувствовал себя комфортно, используя память, которую я считал плохой, даже если бы ты мог заблокировать плохие части. Я бы купил новую палку для душевного спокойствия.
Посмотрите на эту утилиту: https://github.com/prsyahmi/BadMemory
Он очень прост в использовании и поддерживает блокировку диапазонов адресов. И вы можете использовать полный адрес, полученный от MemTest86, не удаляя последние три цифры.
Насколько я знаю, единственный способ сделать это - использовать команду BurnMem, которая может искусственно ограничить объем используемой памяти.
ВНИМАНИЕ!!! 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;
}
Да. Есть загрузочный параметр, чтобы контролировать объем памяти, который окна могут использовать. Вы можете удалить только из конца памяти. Смотрите эту статью msdn для контроля параметров загрузки. Интересующие параметры truncatememory
а также removememory
,
Вы можете попробовать эту функцию в Windows 7, но я не уверен, на какую микросхему она повлияет, или же она снимает одинаковое количество с каждой. Я должен осмотреться, чтобы узнать это.
Не запускайте Windows на «металле»
Если замена невозможна, если вы запускаете Linux на железе и запускаете паравиртуализированную Windows на виртуальной машине с чем-то вроде VirtualBox, вы можете получить лучшее из обоих миров. Загрузите ядро Xen с аргументом , ядро Linux пометит сектора как плохие и сделает так, что виртуализированный гость не будет иметь к ним доступа,
Указывает количество проходов, которые необходимо выполнить. Каждый проход выбирает другой тестовый шаблон из заданного набора шаблонов. Memtest заполняет память этим шаблоном, проверяет содержимое памяти и резервирует обнаруженные дефектные области памяти.
Он вызывается путем предоставления аргументаmemtest
на ботинке. Вам придется сделать это с любым ядром, работающим в dom0 (гипервизоре).
memtest= [KNL,X86,ARM,PPC] Enable memtest
Format: <integer>
default : 0 <disable>
Вы можете ознакомиться с документацией здесь .