Как настольные, портативные и карманные персональные компьютеры справляются с повреждением данных в оперативной памяти?

Не секрет, что самопроизвольное повреждение хранимых данных (например, переворот) не является частым, но все же довольно вероятным событием в обычной операции SDRAM (включая DDR 1/2/3/4 SDRAM).

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

Но как насчет настольных / портативных ПК и портативных гаджетов, использующих модули памяти не-ECC? Как разработчик может быть уверен, что переменная содержит именно то значение, которое ей записано?

3 ответа

Решение

Я не думаю, что существуют какие-либо механизмы для предотвращения ошибок в системах, не относящихся к ECC, ни на уровне системы, ни на уровне ОС. Я не верю, что Windows регулярно обновляет содержимое оперативной памяти, аппаратное обеспечение должно сохранять значения в памяти.

  • При запуске системы в BIOS выполняется быстрая проверка памяти, поэтому здесь можно обнаружить некоторые серьезные ошибки.

  • Некоторые файлы, такие как установщики, могут выполнять проверки CRC. Но эти ошибки могут исходить от носителя, а не из памяти.

  • При случайной ошибке в ячейке памяти, которая не будет использоваться или будет перезаписана. Нет проблем. Я подозреваю, что в этом месте происходит очень большой процент случайных, неповторяющихся ошибок.

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

Помимо этого, приложения / ОС будут аварийно завершать работу, а записанные файлы будут повреждены.

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

Они вообще не справляются с такой ситуацией. Тест при загрузке обращается к последнему биту памяти, и это все, что делает обычный BIOS. В Linux/FreeBSD и т. Д. Есть исправление, позволяющее исключить адреса памяти из системы. Если вы этого не сделаете, системы, скорее всего, выйдут из строя, когда проверка внутренней целостности ядра обнаружит "переворот в битах" (сигнал 11 в Unix)

Да, как правило, система будет выполнять тест ОЗУ при запуске и пытаться изолировать все плохие страницы.

В противном случае, если плохая страница каким-то образом обнаружена во время работы (не слишком вероятно в большинстве потребительских ящиков, поскольку они обычно не проверяют четность, но возможны на "большом железе"), то, если страница является "виртуальной", и она не была помеченный как "измененный", система, вероятно, "удалит" страницу, пометит физическую страницу как плохую, а затем вернет ее обратно с диска.

Однако, если страница "грязная" (изменена), об ошибке будет сообщено приложению как исключение некоторого рода. Если плохая страница - это какая-то системная страница, то происходит сбой системы.

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

Другие вопросы по тегам