Автор: Пользователь скрыл имя, 10 Марта 2012 в 05:33, курсовая работа
Архитектура ARM (Advanced RISC Machine, Acorn RISC Machine, усовершенствованная RISC-машина) — семейство лицензируемых 32-битных и 64-битных микропроцессорных ядер разработки компании ARM Limited. Компания занимается исключительно разработкой ядер и инструментов для них (компиляторы, средства отладки и т. п.), зарабатывая на лицензировании архитектуры сторонним производителям.
Вступление 2
1. Общие сведения об архитектуре ARM 3
1.1. Краткая история 3
1.2. Главные особенности 7
2. Архитектура ARM 11
2.1. Особенности архитектуры ARM 11
2.2. Набор инструкций Thumb 12
2.3. Технология SIMD 13
2.4. Набор инструкций DSP 13
2.5. Технология Jazelle 14
2.6. Технология интеллектуального управления энергопотреблением 15
3. Семейства ядер и процессоров ARM 16
4. Регистры общего назначения (ARM) 18
4.1. Регистры общего назначения на прикладном уровне 18
4.1.1. Счётчик команд PC (R15) 19
4.1.2. Считывание счётчика команд 19
4.1.3. Запись в счётчик команд 20
4.1.4. Указатель стека SP (R13) 21
4.1.5. Регистр связи LR (R14) 22
4.2. Регистры общего назначения на системном уровне 23
4.2.1. Архитектуры ARMv7-A, ARMv7-R и более ранние 23
4.2.2. Архитектуры ARMv6-M и ARMv7-M 23
4.3. Стандартные соглашения о связях 24
5. Логическая структура памяти (ARM) 26
5.1. Адресное пространство 26
5.2. Порядок следования байтов в многобайтовых величинах 26
5.2.1. Порядок LE 27
5.2.2. Порядок BE-32 27
5.2.3. Порядок BE-8 28
5.3. Доступы по невыровненным адресам 29
5.3.1. Архитектуры, предшествующие ARMv6 29
5.3.2. Архитектура ARMv6 30
При использовании системы команд ARM считанное значение счётчика команд будет на 8 превышать адрес текущей команды (в которой осуществляется это считывание). Два младших бита PC всегда будут равны нулю, поскольку команды ARM всегда выровнены на границу слова.
Исключением из этого правила являются инструкции STR и STM в случае использования их для сохранения текущего значения PC: сохранённое значение будет превышать адрес этих команд либо на 8 (как и для прочих инструкций), либо на 12, что зависит от особенностей конкретного процессорного ядра. Если одна из них сохраняет значение PC, увеличенное на 8 или 12, то и другая будет сохранять значение, увеличенное на такую же величину. Заметим, что использование в команде STR счётчика команд не в качестве сохраняемого регистра, а в роли источника адреса (или части адреса), по которому будет производиться сохранение, подчиняется общему правилу: его содержимое будет на 8 больше адреса самой команды.
При считывании регистра PC в командах набора Thumb возможны два случая. Во-первых, считанное значение может на 4 превышать адрес текущей команды, при этом младший бит всегда будет равен нулю (команды Thumb выровнены на границу полуслова). Во-вторых, после считывания значения, на 4 превышающего адрес текущей команды, у него принудительно может быть сброшен бит 1, что приведёт к выравниванию значения на границу слова, а само итоговое значение будет больше адреса команды либо на 2, либо на 4 в зависимости от адреса команды. Такое поведение имеет PC, используемый в качестве базового регистра в командах LDC, LDR, LDRB, LDRD (с предварительной индексацией без изменения базы),LDRH, LDRSB и LDRSH. Кроме того, подобным образом используется PC в некоторых разновидностях инструкций ADD и SUB, что используется для программного вычислния адресов, зависящих от PC.
Заметим, что в версии ARMv7 использование PC в команде STC набора Thumb объявлено устаревшим.
Считывание PC используется главным образом для позиционно-независимой адресации, включая позиционно-независимые переходы, загрузку констант и вычисление адресов других команд и ячеек памяти, зависящих от PC.
Поскольку счётчик команд содержит адрес выполняемой команды, запись в него вызывает переход на команду по записываемому адресу. В командах, где он может явно указываться в качестве регистра-приёмника, используются следующие общие правила.
В арифметико-логических инструкциях набора ARM использование PC в качестве приёмника вызывает переход на соответствующий адрес. В ранних версиях (все варианты ARMv5 и раньше) записываемое в PC значение должно иметь нули в двух младших разрядах, иначе последствия будут непредсказуемыми. В версии ARMv6 два младших бита записываемого значения игнорируются и принудительно устанавливаются в 0. Наконец, в версии ARMv7 младший бит используется в качестве индикатора системы команд, активизируемой после перехода: если он равен нулю, по-прежнему будет использоваться система команд ARM (при этом бит 1 должен быть равен нулю), а если равен единице — система команд Thumb (тогда бит 1 является частью адреса перехода).
Специальным случаем является использование регистра PC в качестве приёмника в S-разновидностях команд обработки данных: в такой ситуации происходит возврат из прерывания, когда в PC заносится результат операции, а в регистр текущего состояния CPSR — содержимое регистра сохранённого состояния SPSR, при этом система команд устанавливается в соответствии со значением, загружаемым из SPSR. Подробнее об этом говорится в разделе Обработка прерываний.
Инструкции загрузки LDR и LDM также могут использоваться для перехода на заданный адрес. В версии ARMv4 два младших бита загружаемого адреса должны быть равны нулю, в противном случае результат будет непредсказуем. Начиная с версии ARMv5T, младший бит определяет систему команд, а бит 1 должен быть равен нулю, если загружаемый адрес задаёт систему команд ARM.
В системе команд Thumb явная запись в PC возможна в командах ADD и MOV, при этом младший бит записываемого значения игнорируется и принудительно устанавливается в 0.
Загрузка PC из памяти возможна с помощью команды POP. В версии ARMv4 она игнорирует значение младшего бита загружаемого значения, принудительно устанавливая его в 0, а начиная с версии ARMv5, использует его как индикатор системы команд, на которую выполняется переход.
В Thumb-2 возможность загрузки PC появилась и в команде LDR. Младший бит загружаемого значения рассматривается как индикатор системы команды.
Регистр SP предназначен для использования в качестве указателя стека.
Единственной инструкцией набора ARM, использующей SP по прямому назначению, является весьма специфическая команда SRS, доступная только в привилегированных режимах и появившаяся в ARMv6. В остальном же никаких специальных команд для работы со стеком у набора ARM нет; вместо них применяются обычные команды загрузки и записи данных, в которых SP указывается в качестве базового регистра. Благодаря этому возможна организация стека, растущего вверх или вниз, причём SP может указывать как на последнее использованное в стеке слово, так и на первое ещё не использованное. Более того, технически в качестве указателя стека можно использовать любой из регистров общего назначения, кроме PC. Это облегчается тем обстоятельством, что прерывания и вызовы подпрограмм не используют стек, сохраняя адрес возврата в регистре LR.
В системе команд Thumb, напротив, имеются команды POP и PUSH, использующие SP как указатель стека. Стек в них растёт вниз, а значение в SP указывает на последнее помещённое в него слово.
Использование SP в командах обработки данных ограниченно, причём в версии ARMv7 ряд технически допустимых вариантов применения объявлен устаревшими. На практике можно использовать SP в качестве базового регистра (для доступа к информации в стеке), в командах пересылки, сравнения, сложения и вычитания (для формирования адресов операндов в стеке, а также для модификации значения самого SP).
Когда SP используется по прямому назначению, он должен содержать значение, кратное 4, поскольку обращение к стеку выполняется словами. Некоторые версии архитектуры, например, ARMv7-M, могут принудительно обнулять два младших бита, записываемых в SP.
Регистр LR (Link Register) используется в следующих случаях:
Перечисленные выше команды применяются для вызова подпрограмм, при этом в LR помещается адрес инструкции, следующей за командой BL или BLX.
В случае возникновения прерывания в LR заносится значение PC на момент прерывания. Подробнее об этом говорится в разделах Обработка прерываний в архитектурах ARMv7-A, R и более ранних и Обработка прерываний в архитектурах ARMv6-M и ARMv7-M.
Процессоры всех версий архитектуры, за исключением ARMv6-M и ARMv7-M, имеют 7 или 8 режимов работы процессора. Два из них — режимы пользователя и системы — используют один из тот же набор из 16 регистров общего назначения. Все остальные режимы имеют свои собственные регистры SP и LR, а режим быстрого прерывания — ещё и собственные регистры R8—R12.
В целом у процессора имеется 31 или 33 регистра общего назначения. Тем не менее, подавляющее число инструкций может использовать лишь регистры, соответствующие текущему режиму. Лишь специальные варианты инструкций набора ARM LDM и STM позволяют соответственно загрузить или сохранить содержимое регистров режимов пользователя/системы, когда процессор находится в каком-либо другом режиме.
Когда в документации необходимо точно указать, какой регистр имеется в виду, к его названию приписывается обозначение режима, например: LR_svc (регистр связи режима супервизора), SP_usr (указатель стека режимов пользователя и системы) и т.д.
В указанных архитектурах имеется два режима работы процессора. В режиме обработчика всегда используется главный стек, указателем которого является регистр SP_main (другое обозначение — MSP). В режиме потока может использоваться либо главный стек (используется SP_main), либо стек процесса (используется SP_process, он же PSP). Все остальные регистры общего назначения существуют в одном экземпляре и используются в обоих режимах. Таким образом, в этих архитектурах технически имеется 17 регистров общего назначения.
Хотя при создании своей ОС программист волен определять собственные соглашения о связях и правила использования регистров, есть смысл придерживаться правил, разработанных компанией ARM и поддерживаемых всеми популярными трансляторами для этой архитектуры. Вкратце они заключаются в следующем:
В качестве указателя стека всегда используется регистр SP (R13). Стек растёт вниз, SP указывает на последнее используемое слово. Эти правила полностью соответствуют аппаратным требованиям набора команд Thumb.
Для передачи параметров в вызываемую подпрограмму могут использоваться регистры R0—R3. Если параметров слишком много, дополнительные параметры передаются через стек.
Возврат результатов осуществляется через регистры R0—R3.
Вызываемая подпрограмма обязана сохранять значения регистров R4—R11, а также корректно восстанавливать значение указателя стека.
Регистры R0—R3, R12 и LR вызываемой подпрограммой могут свободно изменяться.
Компоновщик при связывании вызовов подпрограмм может использовать регистр R12 в качестве рабочего, поэтому подпрограммы не могут рассчитывать на сохранность его содержимого, если используют вызовы подпрограмм из других модулей.
В ряде систем R7 хранит значение, зависящее от системы (например, адрес локальной памяти потока — TLS). В таких системах изменять этот регистр обычно запрещается.
Указатель стека сам по себе всегда должен быть выровнен на границу слова. Тем не менее, в некоторых случаях требуется его выравнивание на границу двойного слова. Для контроля за соблюдением выравнивания на границу двойного слова объектные модули могут снабжаться специальными атрибутами, которые контролируются компоновщиком. Последний, в частности, не должен допускать вызова подпрограмм, расположенных в модуле, требующем выравнивания стека на границу двойного слова, из подпрограмм, относящихся к модулю, обеспечивающему выравнивание лишь на границу слова. Компиляторы языков высокого уровня обычно снабжают свои файлы соответствующими атрибутами сами; при программировании на языке ассемблера это является задачей программиста. Например, транслятор ассемблера фирмы KEIL имеет для этого ключевые слова PRESERVE8 (модуль обеспечивает выравнивание стека на границу двойного слова) и REQUIRE8 (модуль требует выравнивания стека на границу двойного слова).
Архитектура ARM использует плоское адресное пространство размером 4 Гбайта. Адресами памяти являются беззнаковые целые числа длиной 32 бита. Физически на эти адреса отображается как собственно память (оперативная и постоянная), так и устройства ввода-вывода.
При вычислении адресов операндов, находящихся в памяти, используется 32-разрядная арифметика, а выход за пределы разрядной сетки игнорируется. Таким образом, при последовательном увеличении адресов после адреса FFFF_FFFF следует адрес 0000_0000, а при последовательном уменьшении — наоборот. Однако код программы не должен пересекать границу памяти: если при последовательном продвижении регистра PC произойдёт «свёртка» адреса, результат будет непредсказуем. Непредсказуемым окажется и результат выполнения инструкций, обрабатывающих группу ячеек памяти, если при последовательном увеличении или уменьшении адреса ячеек произойдёт его «свёртка».
Архитектуры до версии ARMv6 предусматривали два порядка следования байтов в полусловах и словах: «младший-старший» (little-endian, LE) и «старший-младший» с постоянным положением слов (big-endian word invariant, BE-32; подробнее эти порядки будут описаны в последующих подразделах). Производители процессоров были вольны сами выбирать, какой из возможных порядков следования байтов поддерживать. Допускалась и поддержка обоих порядков; в этом случае производитель определял, каким образом будет устанавливаться порядок, активный сразу после сброса процессора, и поддерживается ли возможность его программной смены. Теоретически могла возникнуть ситуация, когда процессор после сброса начинал работать с порядком «младший-старший», но был подключен к памяти, поддерживающей порядок «старший-младший»; в таком случае одним из первых действий программы было переключение процессора в режим «старший-младший» (это необходимо было сделать раньше, чем произойдёт первое обращение к байту или полуслову данных или же начнёт выполняться код Thumb).
В версии ARMv6 появилась поддержка смешанного порядка следования байтов (mixed endian), называемого также порядком «старший-младший» с постоянным положением байтов (big-endian byte invariant, BE-8). В отличие от BE-32, порядок BE-8 распространяется только на доступы к данным; при выборке команд при установленном режиме BE-8 используется порядок LE. Все процессоры ARMv6 обязаны поддерживать порядки LE и BE-8; поддержка порядка BE-32 является необязательной.
При порядке LE младший байт полуслова, выровненного по границе полуслова и расположенного по адресу A (он будет кратен 2), находится по адресу A, а старший байт — по адресу A+1. Младший байт слова, выровненного на границу слова и расположенного по адресу A (он будет кратен 4), находится по адресу A, следующий за ним байт — по адресу A+1, третий байт — по адресу A+2 и четвёртый, самый старший байт — по адресу A+3.