# Arquitetura ARM

ARM, originalmente Acorn RISC Machine, e depois Advanced RISC Machine, é uma família de arquiteturas RISC desenvolvida pela empresa britânica ARM Holdings. Tais arquiteturas são licenciadas pela ARM para outras empresas, que implementam-nas em seus próprios produtos. A ARM também desenvolve chips que utilizam tal arquitetura e que são licenciados para uso exclusivo de outras empresas em seus produtos.
A ARM Holdings publica periodicamente atualizações para suas arquiteturas, todas elas com espaço de endereçamento de 32 bits (apenas chips pré-ARMv3, feitos antes da ARM Holdings ser formada, como no Acorn Archimedes, tinham espaços de endereçamento menores) e aritmética de 32 bits; instruções para chips da ARM possui tamanho fixo de 32 bits, mas versões mais recentes também suportam instruções de tamanho variável para melhorar a densidade de código. Alguns cores também providenciam a execução em hardware de bytecode Java. A arquitetura ARMv8-A, anunciada em Outubro de 2011, suporta ainda endereçamento de 64 bits e aritmética de 64 bits, com instruções de tamanho fixo de 32 bits.
Com 230 bilhões de chips produzidos até 2022, a arquitetura ARM é mais popular.

## Histórico

Resultado do projeto inovador de um bem sucedido fabricante britânico de computadores chamado Acorn Computer Group. Inicialmente desenvolvido pela Acorn Computers Limited de Cambridge, Inglaterra, entre outubro de 1983 e abril de 1985, foi o primeiro processador RISC desenvolvido para uso comercial. Projeto baseado no processador Berkeley RISC I. O Núcleo ARM se manteve basicamente com o mesmo tamanho durante sua evolução. ARM2 tinha 30,000 transistores, enquanto o ARM6 evoluiu para apenas 35,000. Em 2009 alguns fabricantes de netbooks utilizaram processadores Arm em seus produtos para concorrer com o Atom da Intel.
Em 1985 surgiram os primeiros exemplares do microprocessador ARM1 (Acorn RISC Machine 1) e, no ano seguinte, a versão comercial ARM2. Esses microprocessadores possuíam um barramento de dados de 32 bits e outro de endereços de 26 bits (que permitiam endereçar até 64MB de memória). Incluíam também um conjunto de 16 registradores de 32 bits, sendo um deles destinado ao contador de programa e bits de estado do processador. As versões iniciais dos microprocessadores ARM (ARM2 e ARM3) foram utilizadas nos primeiros computadores RISC pessoais (Archimedes 300, 400 e 500) fabricados pela Acorn.
Em 1990, a Acorn Computer Group, a Apple Computer e a VLSI Technology uniram-se para formar a ARM Limited (Advanced RISC Machines), e em 1991 foi lançada a primeira versão comercial, o ARM6, juntamente com o primeiro microprocessador da ARM, o ARM610. Os principais conceitos por trás da arquitetura ARM são a simplicidade, baixo custo e baixo consumo.
Atualmente, a ARM Limited não fabrica chips, apenas desenvolve o projeto e licencia o uso de suas CPUs (a sua propriedade intelectual) para que outros fabricantes (como Cirrus Logic, STMicroelectronics, NXP, Texas Instruments, Atmel, Samsung, Sharp, Qualcomm, Nvidia, etc) possam produzir ou alterar as CPUs.
* Outubro/1983, a Acorn Computers LTDA desenvolve o primeiro processador ARM.
* 26 de abril de 1985 protótipos do ARM são fabricados pela VLSI Technilogy e são utilizados pela primeira vez em BBC Micros: primeiro processador RISC a ser comercializado.
* 80's, os ARMs são utilizados nos desktops da Acorn (BBC MAster e Acorn Archimedes).
* 80's, é criada uma versão estática, o ARM2aS.
* Fim 80's, visando uma versão totalmente estática, a Apple junta-se a Acorn para desenvolver novas versões do ARM.
* Novembro/1990, a AdvancedRM LTDA é fundada resultante de uma junção da Acorn com a Apple Computer e a VLSI Technology.
* 1991, são lançados os primeiros do ARM6.
* 1995, DEC e ARM lançam o StrongARM. (Intel compra DEC e ganha o StrongARM de "presente").
* 1998, ARM LTDA é introduzida nas bolsas de Londres e NASDAQ.
* Ao longo dos anos 90, ARM torna-se líder no mercado de processadores embarcados de alto desempenho e baixo consumo de energia.

## Arquitetura 32-bits

A arquitetura ARM 32-bits, como a ARMv7-A, foi a arquitetura mais amplamente utilizada em dispositivos móveis em 2011
Desde 1995, o ARM Architecture Reference Manual tem sido a principal fonte de documentação sobre a arquitetura de processador ARM e conjunto de instruções, distinguindo interfaces que todos os processadores ARM são necessários para suportar (como semântica de instruções) de detalhes de implementação que podem variar. A arquitetura evoluiu ao longo do tempo, e a versão sete da arquitetura, ARMv7, define três "perfis" de arquitetura:
* Perfil-A, o perfil "Aplicativo", implementado por núcleos de 32 bits na série Cortex-A e por alguns núcleos não-ARM
* Perfil-R, o perfil "Real-time", implementado por núcleos da série Cortex-R
* Perfil-M, o perfil "Microcontrolador", implementado pela maioria dos núcleos da série Cortex-M
Embora os perfis de arquitetura tenham sido definidos pela primeira vez para o ARMv7, o ARM definiu posteriormente a arquitetura ARMv6-M (usada pelo Cortex M0 / M0 + / M1) como um subconjunto do perfil do ARMv7-M com menos instruções.

### Modos do CPU

Exceto no perfil-M, a arquitetura ARM de 32 bits especifica vários modos de CPU, dependendo dos recursos de arquitetura implementados. A qualquer momento, a CPU pode estar em apenas um modo, mas pode alternar modos devido a eventos externos (interrupções) ou programaticamente.
* Modo Usuário: O único modo não privilegiado
* Modo FIQ: Um modo privilegiado que é inserido sempre que o processador aceita uma solicitação de interrupção rápida (Fast Interrupt Requests)
* Modo IRQ: Um modo privilegiado que é inserido sempre que o processador aceita uma interrupção.
* Modo Supervisor (SVC): Um modo privilegiado inserido sempre que a CPU é reinicializada ou quando uma instrução SVC é executada.
* Modo de anulação: Um modo privilegiado que é inserido sempre que ocorre uma exceção de anulação automática ou anulação de dados.
* Modo indefinido: Um modo privilegiado que é inserido sempre que ocorre uma exceção de instrução indefinida.
* Modo Sistema (ARMv4 e acima): O único modo privilegiado que não é inserido por uma exceção. Ele só pode ser inserido executando uma instrução que grava explicitamente os bits de modo do CPSR (Current Program Status Register) de outro modo privilegiado (não do modo de usuário).
* Modo monitor (ARMv6 e ARMv7 Security Extensions, ARMv8 EL3): Um modo monitor é introduzido para suportar a extensão TrustZone em núcleos ARM.
* Modo Hyp (ARMv7 Virtualization Extensions, ARMv8 EL2): Um modo de hipervisor que suporta os requisitos de virtualização de Popek e Goldberg para a operação não segura da CPU.
* Modo thread (ARMv6-M, ARMv7-M, ARMv8-M): Um modo que pode ser especificado como privilegiado ou não privilegiado, enquanto o MSP (Main Stack Pointer) ou PSP (Process Stack Pointer) é usado, também pode ser especificado em Registro de controle com acesso privilegiado. Este modo é projetado para tarefas do usuário em ambiente RTOS, mas é tipicamente usado em bare-metal para super loop.
* Modo do manipulador (ARMv6-M, ARMv7-M, ARMv8-M): Um modo dedicado para tratamento de exceções (exceto o RESET que é tratado no modo Thread). O modo manipulador sempre usa o MSP e funciona em nível privilegiado.

### Conjunto de Instruções

A implementação original (e subsequente) do ARM foi programada sem microcódigo, como o muito mais simples processador de 8 bits 6502 usado nos microcomputadores Acorn anteriores.
A arquitetura ARM de 32 bits (e a arquitetura de 64 bits em sua maior parte) inclui os seguintes recursos do RISC:
* Arquitetura Load/Store
* Não há suporte para acessos de memória não alinhados na versão original da arquitetura. O ARMv6 e posterior, exceto algumas versões de microcontroladores, suportam acessos desalinhados para instruções de load/store de meia palavra e única palavra com algumas limitações, sem nenhuma atomicidade garantida.
* Arquivo de registro uniforme de 16 × 32 bits [incluindo o contador de programa (Program counter), ponteiro de pilha (Stack pointer) e o registro de link (Link register)].
* Largura fixa de instruções de 32 bits para facilitar a decodificação e o pipelining, ao custo da redução da densidade do código. Mais tarde, o conjunto de instruções Thumb adicionou instruções de 16 bits e aumentou a densidade do código.
* Principalmente execuções em um único ciclo de clock.
Para compensar o design mais simples, comparado com processadores como o Intel 80286 e o Motorola 68020, alguns recursos de design adicionais foram usados:
* A execução condicional da maioria das instruções reduz a sobrecarga de ramificação e compensa a falta de um branch predictor.
* As instruções aritméticas alteram os códigos de condição apenas quando desejado.
* 32-bit barrel shifter pode ser usado sem penalidade de desempenho com a maioria das instruções aritméticas e cálculos de endereço.
* Tem poderosos modos de endereçamento indexados.
* Um registrador de link suporta chamadas de função de folha rápida.
* Um subsistema de interrupção simples, mas rápido, de 2 níveis de prioridades, trocou os bancos de registradores.

#### Instruções aritméticas

O ARM inclui operações aritméticas inteiras para adicionar, subtrair e multiplicar; Algumas versões da arquitetura também suportam operações de divisão.
O ARM suporta multiplicações de 32 bits × 32 bits com resultado de 32 bits ou resultado de 64 bits, embora os núcleos Cortex-M0 / M0 + / M1 não suportem resultados de 64 bits. Alguns núcleos ARM também suportam multiplicações de 16 bits × 16 bits e 32 bits × 16 bits.
As instruções de divisão são incluídas apenas nas seguintes arquiteturas ARM:
* As arquiteturas ARMv7-M e ARMv7E-M sempre incluem instruções de divisão.
* A arquitetura ARMv7-R sempre inclui instruções de divisão no conjunto de instruções Thumb, mas opcionalmente em seu conjunto de instruções de 32 bits.
* A arquitetura ARMv7-A inclui opcionalmente as instruções de divisão. As instruções podem não ser implementadas ou implementadas apenas no conjunto de instruções Thumb, ou implementadas nos conjuntos de instruções Thumb e ARM, ou implementadas se as Extensões de Virtualização estiverem incluídas. (Link para a refêrencia quebrado)

#### Registradores

Registradores nos modos do CPU :
| usr | sys | svc | abt | und | irq | fiq |
| R0 |||||||
| R1 |||||||
| R2 |||||||
| R3 |||||||
| R4 |||||||
| R5 |||||||
| R6 |||||||
| R7 |||||||
| R8 | R8 | R8 | R8 | R8 | R8 | R8_fiq |
| R9 | R9 | R9 | R9 | R9 | R9 | R9_fiq |
| R10 | R10 | R10 | R10 | R10 | R10 | R10_fiq |
| R11 | R11 | R11 | R11 | R11 | R11 | R11_fiq |
| R12 | R12 | R12 | R12 | R12 | R12 | R12_fiq |
| R13 | R13 | R13_svc | R13_abt | R13_und | R13_irq | R13_fiq |
| R14 | R14 | R14_svc | R14_abt | R14_und | R14_irq | R14_fiq |
| R15 |||||||
| CPSR |||||||
| | | SPSR_svc | SPSR_abt | SPSR_und | SPSR_irq | SPSR_fiq |
Registradores R0 a R7 são os mesmos em todos os modos de CPU; eles nunca são acumulados.
Registradores R8 a R12 são os mesmos em todos os modos de CPU, exceto no modo FIQ. O modo FIQ possui seus próprios registros R8 a R12.
R13 e R14 são colocados em todos os modos de CPU privilegiados, exceto o modo de sistema. Ou seja, cada modo que pode ser inserido devido a uma exceção tem seu próprio R13 e R14. Esses registradores geralmente contêm o ponteiro da pilha e o endereço de retorno das chamadas de função, respectivamente.
Pseudônimo:
* R13 também é conhecido como SP, o Stack Pointer.
* R14 também é conhecido como LR, o registro de links.
* R15 também é referido como PC, o contador de programas.
O Registro de Status do Programa Atual (CPSR) possui os seguintes 32 bits.
* M (bits 0–4) são os bits do modo do processador.
* T (bit 5) é o bit de estado do Thumb.
* F (bit 6) é o bit de desabilitação do FIQ.
* I (bit 7) é o bit de desativação do IRQ.
* A (bit 8) é o bit de desativação de anulação de dados imprecisos.
* E (bit 9) é o bit de endianidade de dados.
* IT (bits 10–15 e 25–26) são os bits de estado if-then.
* GE (bits 16-19) é o maior que ou igual a bits.
* DNM (bits 20–23) são os não modifique bits.
* J (bit 24) é o bit de estado Java.
* Q (bit 27) é o bit de overflow pegajoso.
* V (bit 28) é o bit de overflow.
* C (bit 29) é o bit transportar / emprestar / estender.
* Z (bit 30) é o bit zero.
* N (bit 31) é o negativo / menor que bit.

## Características da arquitetura

O padrão RISC do processador permite que estes processadores tenham menos transístores que processadores CISC (x86). Essa abordagem reduz custos, liberação de calor e consumo de energia. Essas são características desejáveis para dispositivos portáteis, como smartphones, laptops, tablets e outros dispositivos embarcados. Uma estrutura mais simples facilita a criação de multi-core CPUs, o que impacta na redução de custos de produção. Os processadores ARM são 90% dos processadores embarcados RISC de 32 bits.
O processador ARM possui sete modos de operação que podem ser intercambiados através do software, interrupções externas e processamento de execuções. Normalmente as aplicações são executadas a nível de usuário. Enquanto o processador esta no modo usuário o programa sendo executado é incapaz de acessar alguns recursos protegidos do sistema ou mudar de modo. Os outros modos além do modo usuário são denominados modos privilegiados. Eles tem acesso completo aos recursos do sistema e podem mudar de modo livremente.

### Principais Características

* Arquitetura Load-Store: as instruções somente processarão (soma, subtração, etc) valores que estiverem nos registradores e sempre armazenarão os resultados em algum registrador.
* Instruções fixas de 32 bits de largura (com exceção das instruções Thumb compactas de 16 bits) alinhadas em 4 bytes consecutivos da memória, com execução condicional, com poderosas instruções de carga e armazenamento de múltiplos registradores, capacidade de executar operações de deslocamento e na ULA com uma única instrução executada em um ciclo de clock.
* Formato de instruções de 3 endereços (isto é, os dois registradores operandos e o registrador de resultado são independentemente especificados)
* 16 registradores de 32 bits para uso geral
* Manipulação de periféricos de I/O como dispositivos mapeados na memória com suporte à interrupções.
* Conjunto de instruções aberto a extensões através de coprocessador, incluindo a adição de novos registradores e tipos de dados ao mInodelo do programador.
* Pipelines de 3 a 15 estágios.
* Baixo Consumo de energia;
* Tamanho do núcleo reduzido;
Interrupções são definidas por configurações programáveis. FIQ: Fast Interrupt Request, maior prioridade. IRQ: Vectorred Interupt Request, intermediária (0 à 15). Não - Vectored Interupt Request, menor prioridade. As prioridades das interrupções dos diversos dispositivos são ajustadas dinamicamente
Bloco de conexão de pinos, este bloco permite selecionar pinos do microcontrolador que possuem mais que uma função. registros de configuração controlam os multiplexadores para permitir a conexão entre os pinos e os periféricos no chip. Periféricos devem ser conectados a pinos apropriados antes de serem habilitados e antes de qualquer interrupção relacionada seja ativada. Ativação de qualquer função periférica que não é mapeada para um pino relacionado devem ser consideradas indefinidas.
Propósitos gerais Paralell I/O e Fast I/O: pinos que não são conectados a específicas funções periféricas são controlados pelos registros do GPIO. Pinos podem ser configurados dinamicamente como entrada ou saída. Separar os registros permite configurar ou limpar qualquer número de saídas simultaneamente, o valor do registro de saída pode ser lido novamente, bem como os estados atuais das portas. No paralell e Fast I/O há controle de direção individual dos bits e todas as I/O viram input no reset.
Registradores: Os registradores podem ser utilizados para manipular dados de um byte, de meia palavra (16 bits) ou de uma palavra completa (32 bits). Quando instruções de um byte são utilizadas somente o byte menos significativo é utilizado. Quando instruções de meia palavra são utilizadas somente a palavra menos significativa é utilizada. Ao fazer referência a algum destes registros de propósito específico deve-se sempre levar em consideração qual o modo de operação corrente. Um outro registrador importante é o CPSR (Current Processor Status Register), que carrega informações sobre o estado corrente do processador, inclusive o modo de execução atual.

### Organização da Arquitetura ARM

Os processadores e microcontroladores construídos com a arquitetura ARM são identificados conforme a versão da arquitetura adotada, o perfil e suas variantes.
Até o momento já foram definidas 9 versões de arquitetura ARM, sendo atualmente em uso apenas 4, identificadas pelo Prefixo ARMv, sendo elas ARMv6, ARMv7, ARMv8 e ARMv9.
Considerando a mais atual a ARMv9, temos 3 perfis de uso definidos, ARMv9-A, ARMv9-R e ARMv9-M sendo respectivamente usadas para, processadores de aplicação geral, processadores e microcontroladores para aplicações de uso critico e resposta em tempo real, e finalmente o perfil para uso em microcontroladores de uso geral.
As variantes são identificadas por letras adicionados as versões. No momento existem as seguintes:
* ARMv4,
uma variante que inclui apenas o conjunto padrão de instruções ARM.
* ARMv4T,
nesta variante é adicionado o conjunto de instruções Thumb.
* ARMv5T
melhorias em relação a interworking e instruções ARM. adicionado "Count Leading Zeros" (CLZ) e instruções para "Software Breakpoint"(BKPT).
* ARMv5TE
Melhorias no suporte aritmético relativo a algoritmos de processamento de sinal (DSP), adicionado "Preload Data" (PLD), "Load Register Dual" (LDRD), Store Register Dual (STRD), e adicionado instruçòes para transferencias de 64-bits para registradores de coprocessador (MCRR, MRRC).
* ARMv5TEJ
Adicionada a instrução BXJ e outros suportes para extensão arquitetural Jazelle®.
* ARMv6
Adicionadas novas instruções para o conjunto padrão ARM, formalizado e revisado o modelo de memória, e a arquitetura de Depuração.
* ARMv6K
Adicionadas instruções para suporte a multiprocessamento ao conjunto padrão de instruções e alguns recursos extras para o modelo de memória.
* ARMv6T2
Introduz a tecnologia Thumb-2, que dá suporte a um maior desenvolvimento de instruções fornecendo um nível de funcionalidade similar ao conjunto de instruções padrão ARM.  Há também as extensões que são opcionais que podem ser adicionadas conforme o fabricante, as extensões são dividas em grupos, algumas delas estão listadas abaixo:
* Extensões relativas ao conjunto de Instruções
** Jazelle, é uma extensão que dá poder a variante arquitetural ARMv5TE como ARMv5TEJ.
** Extensão para Virtualização.
** ThumbEE é uma extensão que fornece um conjunto de instruções ampliado do conjunto Thumb padrão e que permite código dinamicamente gerado, sendo obrigatório no perfil ARMv7-A e é opcional no perfil ARMv7-R, para a versão arquitetural ARMv7.
** Extensões de ponto flutuante é uma extensão para comprocessador de ponto flutuante. Esta extensão é historicamente chamada de Extensão VFP.
** Advanced SIMD, é uma extensão do conjunto de instruções que adiciona instruções do tipo "Simgle Instruction Multiple Data" (SIND), para operação com vetores com os tipos de dados Inteiros e ponto flutuante de precisão simples, sobre registradores doubleword e quadword.
* Extensões arquiteturais
** Extensões de segurança.
** Extensões para Multiprocessamento.
** Extensões para Endereçamento Físico de Maior Largura.
** Extensões para Virtualização.

### Tipos de Núcleos

* Processadores para aplicativos;
* Processadores para sistemas embarcados;
* Processadores SecurCore;

### Família

* ARM7 Thumb
* ARM9 Thumb
* ARM9E
* ARM10E
* ARM11
* ARM15
* SecurCore
* OptimoDE Data Engine
* Cortex Family
** Cortex-A
** Cortex-R
** Cortex-M

## Sistemas Operacionais
### Sistemas Acorn

* RISC OS- Primeiro Sistema Operacional ARM

### Sistemas Operacionais Embarcados

* RTOS
* Symbian OS
* Bada OS
* eCos
* Integrity
* Nucleus PLUS
* QNX
* ThreadX
* VxWorks
* Windows CE

### Unix

* Linux
** Android
** Arch Linux
** Chrome OS
** Debian
** Fedora
** Gentoo
** GoboLinux
** MeeGo
** Motomagx
** Slackware
** Ubuntu
* BSD
** RISC iX(Apenas em Sistemas ARM2/ARM3)
** FreeBSD
** NetBSD
** OpenBSD
** iOS
* Plan 9
* Inferno (sistema operacional)
* Solaris
** OpenSolaris
* WebOS
* Android

### Microsoft Windows

* Windows 8
* Windows 10
* Windows 11