반응형

ARM 9

aarch64 익셉션 핸들링

aarch64의 가장 큰 구조적 특징은 새로운 익셉션 모델을 제공하는 것이다. 익셉션 레벨이 도입되었고, 익셉션 발생과 핸들링, 익셉션 복귀에 대한 규칙이 바뀌었다. 일반적으로 소프트웨어의 실행 흐름을 가로채는 동작을 인터럽트(interrupt)라고 하지만, ARM은 익셉션이라는 용어를 사용한다. 익셉션이 발생하면 이전 실행 흐름에서 벗어나 익셉션 타입에 따른 익셉션 핸들러를 호출한다. 익셉션 핸들러는 익셉션을 처리하고 익셉션 발생 전의 상태에서 실행을 재개한다. 익셉션 타입 익셉션을 발생시키는 상태 및 시스템 이벤트 서비스 호출 인스트럭션 익셉션 abort 익셉션 리셋 익셉션 인터럽트 익셉션 서비스 호출 인스트럭션 익셉션 익셉션을 발생시키는 인스트럭션들이 있다. 소프트웨어에서 좀 더 높은 특권 레벨(p..

리버싱/ARM 2021.02.15

ABI의 레지스터 사용 규칙

아키텍처마다 바이너리들이 상호 동작하기 위한 규칙이 존재한다. 이를 ABI(Application Binary Interface)라고 하는데, ARM도 ABI가 존재한다. C/C++ 같은 프로그래밍 언어나 리눅스의 추가 규칙들이 더해진다. ABI 중에서 함수 호출을 다루는 AAPCS64(Procedure Call Standard for the ARM 64-bit Architecture)는 어셈블리(assembly)와 C함수 사이의 인터페이스, C 함수 호출 등에 관한 내용을 다룬다. 코드를 분석하거나 효율적인 코드를 작성하는데 도움이된다. 64비트 정수 레지스터의 제공으로 프로그래밍 언어에서 사용 가능한 변수의 폭이 다양해졌다. 32비트 데이터 모델인 ILP32와 함께 64비트 리눅스의 기본 데이터 모델인..

리버싱/ARM 2021.02.15

시스템 레지스터

aarch64에서 시스템 설정은 각 시스템 레지스터를 통해 제어되며, MSR 및 MRS 인스트럭션을 사용하여 접근할 수 있다. aarch64는 코프로세서(coprocessor)를 지원하지 않으므로 ARMv7처럼 CP15 연산을 통한 인터페이스를 제공되지 않는다. 시스템 레지스터의 이름 끝에 붙은 숫자는 해당 레지스터에 접근할 수 있는 가장 낮은 익셉션 레벨을 알려준다. 예를 들어, TTBR0_EL1 레지스터의 값은 x0 레지스터로 읽어올 때는 다음과 같이 인스트럭션을 사용한다. MRS x0, TTBR0_EL1 반대로 x0 레지스터의 값을 TTBR0_EL1 레지스터에 쓸 때는 다음과 같은 인스트럭션을 사용한다. MSR TTBR0_EL1, x0

리버싱/ARM 2021.02.09

aarch64 특수 목적 레지스터

aarch64에서 범용 레지스터와 함께 특수 목적 레지스터들이 제공된다. 레지스터 이름 익셉션 레벨별 특수 목적 레지스터 EL0 EL1 EL2 EL3 ZR(Zero Register) XZR / WZR PC (Program Counter) PC SP (Stack Pointer) SP_EL0 SP_EL1 SP_EL2 SP_EL3 ELR (Exception Link Register) ELR_EL1 ELR_EL2 ELR_EL3 SPSR (Saved Process Status Register) SPSR_EL1 SPSR_EL2 SPSR_EL3 PC (Program Counter) PC 레지스터는 다음에 실행할 인스트럭션의 위치를 저장하는 레지스터다. ARMv8에서 PC 레지스터는 프로그래머가 직접 접근하지 못한다...

리버싱/ARM 2021.02.09

프로세서 상태 레지스터(PSTATE)

PSTATE는 프로세서 상태(Processor STATE) 정보를 제공하는데, aarch64 전용, aarch32 전용, aarch64와 aarch32의 공통 속성으로 구성된다. ARMv7에서 현재 프로세스 정보를 나타내는 CPSR과 1:1 대응하지 않는다. aarch64 전용 이름 타입 설명 D(Debug) 익셉션 마스크 이 비트가 설정되면 디버그 익셉션 발생을 막는다. SP(Stack Pointer selector) 실행 살태 제어 사용할 스택 포인터를 선택한다. 0은 SP_EL0사용하고, 1은 SP_ELx를 사용한다. 공통 이름 타입 설명 N(Negative) 조건 플래그 연산 결과가 음수인 경우 설정 Z(Zero) 조건 플래그 연산 결과가 0인 경우 설정 V(Overflow) 조건 플래그 캐리가 ..

리버싱/ARM 2021.02.09

실행 상태

ARMv8 아키텍처에는 aarch64와 aarch32라는 2개의 실행 상태가 정의되어 있다. aarch64 aarch32 특징 64비트 실행 환경 32비트 실행 환경 레지스터 - 64비트 크기의 범용 레지스터 31개 - PC (Program Counter) - SP (Stack Pointer) - ELR (Exception Link Register) - 32비트 크기의 범용 레지스터 13개 - PC (Program Counter) - SP (Stack Pointer) - LR (Link Register) 인스트럭션 세트 A64(32비트 인코딩) A32(ARMv7 지원), T32(Thumb) 주소 방식 64비트 가상 주소 32비트 가상 주소 익셉션 모델 ARMv8 익셉션 모델(EL0 ~ EL3) ARMv7..

리버싱/ARM 2021.02.09

ARM Assembly

ARM CPU의 기본 구성 R0 ~ R15 총 16개의 범용 레지스터를 가지고 있다. 범용 레지스터 R13은 특수 레지스터 SP로 사용된다. SP(Stack Pointer)는 스택의 주소를 저장하는 레지스터이다. 범용 레지스터 R14는 특수 레지스터 LR로 사용된다. LR(Link Register)는 함수 호출 시 되돌아갈 함수의 주소를 저장하는 레지스터이다. 범용 레지스터 R15는 특수 레지스터 PC로 사용된다. PC(Program Counter)는 다음 실행할 프로그램의 주소를 가지고 있는 레지스터이다. 명령어들 MOV ARM에서 레지스터의 데이터 이동을 MOV 명령을 사용한다. ex) MOV R0, R1 (R1의 내용을 R0으로 복사) MOV R0, #1 (상수 1을 R0으로 복사) LDR (Loa..

리버싱/ARM 2021.02.09

ARM 크로스 컴파일러 및 실행

ARM 32Bit sudo apt-get install gcc-arm-linux-gnueabi sudo apt-get install g++-arm-linux-gnueabi ARM 64Bit sudo apt-get install gcc-aarch64-linux-gnu sudo apt-get install g++-aarch64-linux-gnu ARM 크로스 컴파일 하기 arm-linux-gnueabi-gcc -o test test.c (32Bit) aarch64-linux-gnu-gcc -o test test.c (64Bit) ARM 실행 qemu-arm -L /usr/arm-linux-gnueabi ./실행파일 qemu-aarch64 -L /usr/aarch64-linux-gnu ./실행파일 gdb-mu..

리버싱/ARM 2021.02.01
반응형