переназначение векторов прерываний и загрузочного блока

Я не могу понять концепцию переназначения векторов прерываний или загрузочного блока. Какая польза от переназначения векторной таблицы? Как работает с ремап и без ремап? Есть ссылки на хорошие статьи по этому поводу? Я гуглил для этого, но не смог получить хороший ответ. В чем преимущество сопоставления ОЗУ с 0x0000 и сопоставления всего, что находится в 0x0000, с другим местом? Дело в том, что выполнение выполняется быстрее, если выполняется с 0x0000?


person Mahesha Padyana    schedule 15.04.2015    source источник
comment
возможный дубликат Почему два адреса векторных таблиц на ARM?   -  person artless noise    schedule 15.04.2015


Ответы (1)


Это простой вопрос практичности. Вектор сброса находится по адресу 0x0*, и при первом включении системы ядро ​​​​начнет получать оттуда инструкции. Таким образом, у вас должен быть какой-то код, доступный сразу после включения - это должно быть какое-то ПЗУ, поскольку ОЗУ в этот момент будет неинициализировано. Теперь, когда вы завершили начальный процесс загрузки и правильно запустили приложение, у вас возникла проблема — ваши векторы исключений и код для их обработки находятся в ПЗУ! Что делать, если вы хотите установить другой обработчик прерываний? Что делать, если вы хотите переключить вектор сброса для обработчика теплого сброса? Имея переназначаемую область векторов, приложение может свободно переключать загрузочную прошивку ПЗУ для области ОЗУ, в которой оно установило свои собственные векторы и код обработчика.

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

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

В то время как большинство типов ядер ARM имеют некоторые средства для изменения собственного векторного базового адреса, некоторые (например, Cortex-M0) не чтобы упомянуть множество ядер, отличных от ARM, не надо, что требует такого рода функций переназначения на системном уровне, не зависящих от архитектуры, для достижения того же результата. В случае микроконтроллеров, построенных на более старых ядрах, таких как ARM7TDMI, вполне вероятно, что за фиксированным альтернативным адресом «высоких векторов» (более подходящим для использования с MMU) не будет ОЗУ, что делает этот вариант бесполезным.

* Да, хорошо, 0x4, если мы говорим о Cortex-M, но вы понимаете, о чем я... ;)

person Notlikethat    schedule 15.04.2015
comment
Любые ссылки, чтобы понять больше? Не удалось полностью понять процесс загрузки. Я думаю, сначала мне нужно понять процесс загрузки и посмотреть, что выполняется из ОЗУ, а что из ПЗУ в случае встроенных систем. - person Mahesha Padyana; 22.04.2015