Как проверить согласованность памяти Heap и Stack во встроенной системе - PullRequest
3 голосов
/ 11 июля 2011

Я работаю над проектом с использованием процессора LEON2 (Sparc V8). Процессор использует 8 Мбайт оперативной памяти, которые должны быть проверены во время Самотестирования моей загрузки. Моя проблема заключается в том, что мой Boot, очевидно, использует небольшую часть оперативной памяти для своей Heap / BSS / Stack, которую я не могу изменить без сбоя моего приложения. Мой тест ОЗУ очень прост, записать определенное значение во все адреса ОЗУ, а затем прочитать их обратно, чтобы убедиться, что чип ОЗУ может быть адресован.

Этот метод можно использовать для большей части доступной оперативной памяти, но как можно безопасно проверить согласованность оставшейся оперативной памяти?

Ответы [ 3 ]

5 голосов
/ 11 июля 2011

Как правило, проверка ОЗУ, которая должна проверять каждый байт, будет выполняться в качестве одной из первых вещей, которая происходит при запуске процессора.Часто единственное, что делается до того, как должна произойти аппаратная инициализация, чтобы тест оперативной памяти имел доступ к оперативной памяти.

Обычно это делается на языке ассемблера с отключенными прерываниями по одной причинепотому что это единственный способ гарантировать, что ОЗУ не используется.

Если вы хотите выполнить тест ОЗУ после этого момента, вам все равно нужно сделать это довольно рано при запуске системы.Возможно, вы могли бы сделать это в два этапа - когда любые переменные / стек / все, что нужно тесту для собственных целей, находятся в нехватке ОЗУ, и этот тест проверяет высокий объем ОЗУ.Затем снова запустите тест с данными в высоком ОЗУ, в то время как он тестирует низкий ОЗУ.

Еще одно замечание: проверка того, что вы прочитали определенное записанное значение, является простым тестом, который может быть лучше, чем ничего, но он может пропуститьнекоторые типы общих сбоев (в частности, для внешней ОЗУ: отсутствующие или перекрестно спаянные адресные линии.

Более подробную информацию об основных тестах ОЗУ можно найти здесь:

1 голос
/ 05 августа 2011

, поскольку я программирую устройство, относящееся к безопасности, я должен выполнить полный тест ОЗУ во время работы. Я разделил тест на два теста:

  1. Проверка адресации

вы записываете уникальные значения в адреса, достигнутые каждой адресной строкой, и после того, как все значения записаны, значения считываются и сравниваются с ожидаемыми значениями. Этот тест обнаруживает короткое замыкание (или заклинивание @ low / high) адресных линий (то есть вы хотите записать 0x55 по адресу 0xFF40, но из-за короткого замыкания значение сохраняется в 0xFF80, вы не можете обнаружить это с помощью теста 2:

  1. Образец теста:

Вы экономите, например, первые 4 байта ОЗУ в регистрах ЦП, после чего вы сначала очищаете ячейки, записываете 0x55, проверяете, записываете 0xAA, проверяете и восстанавливаете сохраненный контент (вы, конечно, можете использовать другие шаблоны) и так далее. Причина, по которой вы должны использовать регистры, состоит в том, что при использовании переменной эта переменная будет уничтожена этим тестом. Вы даже можете проверить свой стек с помощью этого теста. В нашем проекте мы тестируем 4 ячейки за раз, и мы должны выполнять этот тест, пока не будет проверена вся ОЗУ.

Надеюсь, это немного помогло.

1 голос
/ 11 июля 2011

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

Нет простых способов сделать это после того, как вы вошли в среду выполнения.

...