Нам с другом было любопытно, можно ли определить уровень ионизирующего излучения, глядя на количество однобитовых ошибок в памяти. Я провел небольшое исследование и думаю, что большинство ошибок обнаруживаются и исправляются на аппаратном уровне. Есть ли способ обнаружить ошибки в программном обеспечении (скажем, в коде C на ПК)?
Возможно ли обнаружить битовые ошибки в памяти в программном обеспечении?
Ответы (3)
Я уверен, что это зависит от архитектуры, на которой вы работаете, но я почти уверен, что в ближайшее время вы не обнаружите в своей памяти ни одной битовой ошибки. Большинство, если не все контроллеры оперативной памяти, должны были реализовать некоторую форму защиты ECC для защиты от редких проблем с битами, которые имеют микросхемы ОЗУ. Память DDR, например, ОЧЕНЬ надежна по сравнению с дерьмовыми носителями, такими как флэш-память, для которых требуется ТРЕБУЕТСЯ количество битов защиты ECC (где-то от 8 до 16 или около того), прежде чем они гарантируют функциональность. Пока у вас есть определенное количество битовых ошибок, плохие биты будут исправлены и, вероятно, не будут зарегистрированы еще до того, как они достигнут уровня программного обеспечения ЦП.
Неявное (незарегистрированное) повреждение данных из-за чего-то такого простого, как ошибка в одном бите, считается огромным «нет-нет» в индустрии хранения, поэтому производитель вашей памяти, вероятно, сделал все возможное, чтобы ваше приложение не увидело это, не говоря уже о том, чтобы заставить вас Смирись с этим!
В любом случае, одним из распространенных способов обнаружения проблем с памятью любого типа является запуск простых циклов сравнения записи в адресном пространстве. Запишите 0 во всю свою память и прочитайте ее обратно, чтобы обнаружить застрявшие строки данных «1», запишите-прочитайте-сравните F с памятью, чтобы обнаружить застрявшие строки данных «0», и запустите рампу данных, чтобы помочь обнаружить проблемы с адресацией. Ширина полосы данных должна регулироваться в соответствии с размером адреса. (например, 0x00, 0x01, 0x02... или 0x0000, 0x0001, 0x0002 и т. д.). Вы можете легко делать такие вещи, используя инструменты для тестирования производительности хранилища, такие как Iometer или аналогичные, хотя это может быть так же легко написать самостоятельно.
На самом деле, если вы не собираетесь посвящать много времени решению проблемы, вы вполне можете уйти, не начав. Даже если вы обнаружите ошибку, скорее всего, это связано с чем-то вроде проблемы с питанием, а не с ионизирующим излучением (и обычно у вас нет никакого способа определить, с чем вы столкнулись).
Если вы все же решите продолжить, то очевидный способ проверки — выделить часть памяти, записать в нее значения и прочитать их обратно. Вы хотите следовать достаточно предсказуемым шаблонам, чтобы можно было определить ожидаемое значение без чтения из другой памяти (по крайней мере, если вы хотите изолировать ошибку, а не просто определить, что произошло что-то плохое).
Если вы действительно хотите отличить ионизирующее излучение от других ошибок, это должно быть, по крайней мере, теоретически возможно. Запустите тест на нескольких компьютерах на разных высотах одновременно и посмотрите, увидите ли вы более высокую скорость на большей высоте.
Если ошибки настолько часты, что у вас есть шанс их обнаружить, у вас уже будут большие проблемы - ничего не сработает. Или, по крайней мере, вы бы чувствовали, что снова используете Win95. Я подозреваю, что вам понадобится целый центр обработки данных, чтобы иметь возможность измерить такую ошибку.