ARM Банковский регистр

В ARM есть концепция банковского реестра. При чтении многих вопросов и их ответов, а также различных других ресурсов о том, что означает Banked здесь. Затем я получил это определение: банковское дело с регистрацией означает предоставление нескольких копий регистра по одному и тому же адресу. Не все регистры можно увидеть сразу.

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

2 ответа

Решение

Банковское обслуживание регистра означает предоставление нескольких копий регистра по одному и тому же адресу. Не все регистры можно увидеть сразу.

Это кое-что правильное. Однако в реестре нет "традиционного адреса". Большинство инструкций arm или "двоичных кодировок" регистрируются как аргументы источника или назначения. Существует шестнадцать базовых регистров, поэтому для каждого регистра в двоичной инструкции требуется четыре бита. Типичная инструкция занимает 12 бит (из 32 бит) для описания трех регистров (два источника и один пункт назначения). Эти биты в инструкции являются "адресом" в приведенном выше определении.

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

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

Таким образом, выполнение одного и того же кода в разных режимах может привести к доступу к разным (банковским) регистрам. Таким образом, пользовательский код никогда не влияет на стек IRQ и наоборот. Возможно, еще важнее то, что код IRQ может повредить небанковские реестры пользователей, если в начале и конце IRQ не выполняется тщательное сохранение контекста.

См. Доступ к банковским регистрам в ARM для получения информации о том, как вы можете получить доступ к этим различным регистрам.

Более новая инструкция ARMv7 mrs r2,sp_svc нарушает это правило банковских регистров и предоставляет доступ к банковским регистрам напрямую, без переключения режима. цель состоит в том, чтобы позволить коду переключения контекста легко получить доступ к банковским регистрам для сохранения и восстановления без переключения режима.

Традиционная инструкция ldm rN, {sp,lr}^ позволяет сохранить указатель стека пользователя и регистр связи без переключения режимов. Опять же, это имеет специальную кодировку (или адресацию согласно вашему определению).


Банковское обслуживание также осуществляется с помощью системных регистров CP15 в зоне доверия. Режим мониторинга TrustZone и банковская IFSR... может быть интересен для любого, кто смотрит на тот "банкинг" ARM, который концептуально совпадает с банковским реестром.

Я считаю 31 регистр, необходимый для поддержки традиционной руки. Несколько r13s и r14s - куча для режима FIQ. В первую очередь вы путаете задачи и режимы. На уровне приложения все задачи будут совместно использовать один и тот же набор регистров, там нет банковских операций, когда вы переключаете задачи, вам нужно сохранять регистры, операционная система выделяет для этого память, и для каждого переключателя задач сохраняет старые регистры задач и восстанавливает их. Следующие задачи регистрируются.

Что касается банковского дела в реестре, например, существует несколько R13. Для каждого доступа к регистру имеется больше, чем просто смещение в файле регистра, у него также есть другие входы, например

unsigned int get_r13 ( unsigned int mode )
{
switch(mode)
{
case SYS: return r13_sys;
case SVC: return r13_svc;
case ABT: return r13_abt;
case UND: return r13_und;
case IRQ: return r13_irq;
case FIQ: return r13_fiq;
}
}

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

Один файл регистров не означает, что в файле регистров есть только 16 регистров (r0-r15, не считая cpsr и т. Д.), Их может быть 31 или более в зависимости от того, содержит ли он * регистры PSR.

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