Arquitetura ARM na prática
Curso técnico baseado em código real: o emulador arm-jitter e seus consumidores (armbox, gbaemu, ndsemu, n3dsemu, virtual-arm-box). Todo conceito vem com assembly que você compila e roda. Do ARMv4T do Game Boy Advance até o AArch64.
21 de 44 lições publicadas · uma nova por dia. Assine o RSS para acompanhar.
- M0
Introdução e ambiente
Por que um emulador é o melhor laboratório de arquitetura, e como montar a bancada.
- M0.1Por que emular ARM (e por que isso ensina arquitetura)O ecossistema arm-jitter + armbox + gbaemu/ndsemu/n3dsemu + virtual-arm-box.ler →
- M0.2Setup do ambiente ARMJDK 25, Maven, toolchain arm-none-eabi e os repositórios.ler →
- M0.3Convenções de assembly da trilhaUnified Assembler Language, GAS e como os listings aparecem aqui.ler →
- M1
Fundamentos da arquitetura
Registradores, CPSR, ARM vs Thumb, anatomia da instrução e o ciclo de execução.
- M1.0Fundamentos da arquitetura ARMPanorama: banco de registradores, modos, conjunto de instruções e endereçamento.ler →
- M1.1Registradores e CPSR: banking, modos e SPSRR0–R15, flags N/Z/C/V, modos de CPU e register banking.ler →
- M1.2Thumb e Thumb-2: instruções de 16/32 bitsDensidade de código, troca de estado com BX/BLX e o bit 0 do PC.ler →
- M1.3Anatomia de uma instrução ARMFormato {cond}{S}, Operand2, barrel shifter e addressing modes.ler →
- M1.4Fetch–decode–execute e o ArmCore.step()O que um núcleo faz por instrução, mapeado para o código real.ler →
- M2
Lendo o binário
Do C ao ELF, decodificação manual de ARM e Thumb, e o decoder do arm-jitter.
- M2.1Do C ao binário ARM: gcc + objdumpCompilando, lendo a desmontagem e entendendo seções e símbolos.ler →
- M2.2Decodificando instruções ARM à mão com o objdumpcond | opcode | S | Rn | Rd | Operand2 — bit a bit.ler →
- M2.3Decodificando Thumb à mãoOs formatos de 16 bits, imediatos e deslocamentos.ler →
- M2.4Flags e desvios condicionais: N/Z/C/VComo o CPSR é formado e por que o bge do laço funciona.ler →
- M2.5Como o decoder do arm-jitter funcionabytes → DecodedInstruction → IR, e por que existe um otimizador.ler →
- M3
Criando e rodando programas
Seu assembly, montado, ligado e executando no arm-box e via API Java.
- M3.1Primeiro programa em assembly ARMFibonacci e máximo de dois números; retorno com BX lr.ler →
- M3.1aCarga e armazenamento: LDR, STR e seu primeiro laçoLer e escrever memória, montar um laço com CMP/BNE, somar um vetor.ler →
- M3.1bSub-rotinas em ARM: BL/BX, pilha e convenção de chamadaBL salva o retorno em LR, PUSH/POP preserva registradores, a AAPCS.ler →
- M3.2Montando e ligando um executável ARMas + ld (ou gcc), linker script, mapa de memória e vetor de reset.ler →
- M3.3Criando um executável ARM e rodando no arm-boxHello world em assembly → ELF real → arm-box.ler →
- M3.4Usando o arm-jitter direto pela API JavaAddressSpace + ArmCore + trace listener para inspecionar registradores.em breve
- M3.5Depurando ARM com GDB no arm-boxStub GDB remoto: breakpoints, watchpoints, step e continue.ler →
- M4
Por dentro de um emulador
Core, memória/MMIO, IR e backends, performance, exceções e interrupções.
- M4.1Dentro do emulador: o CoreArmCore: bancos, CPSR/SPSR, modos e "pular a BIOS".em breve
- M4.2Memória e MMIO no emuladorAddressSpace, PagedAddressSpace, callbacks de MMIO, waitstates e SMC.em breve
- M4.3IR, otimizador e backends do arm-jitterInterpretador-oráculo, JIT em bytecode JVM e harness de equivalência.em breve
- M4.4Performance: cache de blocos e encadeamentoInline cache, chain budget, superblocos de loop e warm-start.em breve
- M4.5Interrupções e exceções no ARMVetores 0x04/0x08/0x18, setInterruptLine e o bit I do CPSR.em breve
- M5
Evolução da arquitetura
A linha do tempo do ARMv4T (GBA) ao AArch64, seguindo os emuladores da coleção.
- M5.1ARMv4T: o ARM7TDMI do Game Boy AdvanceARM/THUMB completo, sem extensões; a base do gbaemu.em breve
- M5.2ARMv5TE: o ARM9 do Nintendo DSBLX, CLZ, multiplicações DSP/saturating, LDRD/STRD.em breve
- M5.3ARMv6K: o ARM11 do 3DSLDREX/STREX/CLREX, SIMD paralelo, PKH/SAT/USAD8, CPS/SETEND/WFI.em breve
- M5.4Thumb-2: as instruções de 32 bitsDecoder 32-bit, IT blocks, TBB/TBH, LDREX.W/STREX.W, PLD/PLI.em breve
- M5.4aInstruções condicionais em Thumb: IT blocksDe "quase tudo é condicional" no ARM aos IT blocks do Thumb-2.ler →
- M5.4bManipulação de bits em Thumb: AND, ORR, EOR, BIC, BFIO kit de ferramentas do embedded para setar, limpar e alternar bits.ler →
- M5.5ARMv7-A e VFPv2MOVW/MOVT, bitfield, SDIV/UDIV, RBIT + banco S/D e FPSCR.em breve
- M5.5bBarreiras de memória: DMB, DSB e ISBReordenação de acessos, MMIO e por que RTOS/drivers precisam disso.em breve
- M5.6Cortex-M: o perfil MMSP/PSP, xPSR, stacking, EXC_RETURN, NVIC/VTOR/SysTick.em breve
- M5.6bSemihosting e syscallsComo o arm-box intercepta e traduz chamadas EABI para o host.em breve
- M5.7AArch64: o modo de 64 bits do ARMX0–X30, SP separado, sem banking por modo, exceções por EL.em breve
- M6
Estudos de caso por console
Onde o núcleo ARM aparece no boot de cada máquina emulada da coleção.
- M6.1Estudo de caso: GBA (ARM7TDMI) no gbaemuComo o gbaemu consome o preset ARMV4T; BIOS, waitstates, exceções.em breve
- M6.2Estudo de caso: NDS dual-core (ARM9 + ARM7) no ndsemuDois cores acoplados, ARMV5TE e o handshake de boot cross-CPU.em breve
- M6.3Estudo de caso: 3DS (ARM11 MPCore) no n3dsemuARM11_MPCORE, HLE de serviços e o kernel Horizon.em breve
- M6.4Estudo de caso: Linux real no virtual-arm-boxsoftmmu, versatilepb e Debian bootando até um shell busybox.em breve
- M7
Tópicos avançados
Extensões que podem ser lidas em qualquer ordem depois do M4.
- M7.1VFP e ponto flutuante no ARMBanco S/D, FPSCR, arredondamento e emulação interpretada vs nativa.em breve
- M7.2Exclusivity monitor: LDREX/STREX/CLREXSincronização sem lock e o monitor compartilhado entre cores.em breve
- M7.3MMU e paginação: CP15/VMSA e aborts precisosTranslatingAddressSpace, tabelas de página e FAR/FSR.em breve
- M7.4Escrevendo seu próprio IR pass / backendAdicionar um IrOp e emiti-lo no backend de código.em breve
Exemplos de código
Os fontes de assembly usados nos artigos, montados e testados com o arm-none-eabi e rodados no arm-box. Cada .s tem o .elf pré-montado no mesmo diretório.
- cpsr.sM1.1Lê o CPSR em três momentos — N e Z mudando.
- anat.sM1.3Dez instruções para ver a codificação no objdump.
- pcoffset.sM1.4Prova que R15 lê como "instrução + 8".
- soma.cM2.1Soma de 1 a n — compilada em -O0 e -O2.
- thumb1.sM2.3Laço Thumb de 16 bits para decodificar à mão.
- fib.sM3.1Fibonacci iterativo; retorno via exit code.
- max.sM3.1Máximo de dois números sem um único desvio.
- user.ldM3.2Linker script mínimo para os exemplos user-mode.
- soma5.sM3.2Soma de vetor; ligado com user.ld, extraído com objcopy.
- java/TraceSoma.javaM3.4Embute o arm-jitter e traça o laço instrução a instrução.
- svc.sM4.1Duas instruções que disparam uma exceção SWI.
- java/ExcecaoSwi.javaM4.1Mostra a entrada no vetor 0x08: troca de modo, SPSR, LR.
- isa-v5te.sM5.2Instruções novas do ARMv5TE (CLZ, BLX, DSP).
- isa-v6k.sM5.3ARMv6K: LDREX/STREX, SIMD paralelo, REV, SETEND.
- isa-thumb2.sM5.4Thumb-2: MOVW/MOVT, IT block, formas .W.
- isa-v7a-vfp.sM5.5ARMv7-A + VFPv2: bitfield, SDIV, RBIT, VADD.F64.
- hello-cortexm.cM5.6Firmware bare-metal Cortex-M com tabela de vetores.
- ldrex.sM7.2Incremento atômico com LDREX/STREX e retry.