본문 바로가기

시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리

(155)
[Arm 아키텍처] 메모리 모델과 배리어는 왜 알아야 할까 (Arm 강의) 메모리 모델과 배리어는 시스템 소프트웨어 개발자가 알아야 할 고급 지식입니다. 아래 링크에서는 메모리 모델과 배리어를 왜 알아야 하는지 설명합니다:
[Armv7-A] 익셉션 유발 시: SPSRs 레지스터 업데이트 방식 (동작모드, Arm) User 모드에서 Data abort를 유발하는 동작 코드 리뷰  1. Data abort 익셉션이 유발되면 0xFFFF0010 주소로 프로그램 카운터가 분기합니다.NSR:FFFF0000|EA0003FF   b       0xFFFF1004    ; vector_rst NSR:FFFF0004|EA000465   b       0xFFFF11A0    ; vector_und NSR:FFFF0008|E59FFFF0   ldr     pc,0xFFFF1000 NSR:FFFF000C|EA000443   b       0xFFFF1120    ; vector_pabt >> NSR:FFFF0010|EA000422   b       0xFFFF10A0    ; vector_dabt 이 때 CPSR과 SPSR_abt ..
[Arm][AAPCS] 스택 오염이 발생한 후에는 시스템은 어떻게 동작할까 스택 오염이 발생한 후에는 시스템은 어떻게 동작할까요? Arm 프로세서가 스택 오염을 바로 감지하고 익셉션을 유발하면 좋겠지만, 스택에 저장된 데이터가 오염되는 패턴을 예측할 수 없으니 어떻게 오동작할지 예상하기 어렵습니다. 가장 대표적인 증상은 'Invalid branch'인데, 스택에 저장된 링크 레지스터의 값이 오염됐으므로, 오염된 값으로 프로그램 카운터를 브랜치하다가 메모리 어보트 익셉션이 유발됩니다. 소프트웨어 개발자들이 사용하는 용어로 '크래시가 발생'하게 됩니다. 그림 8.1에서 스택 오염으로 오동작하는 상황을 어셈블리 명령어와 함께 설명하겠습니다.01 NSR:C0BDB698|E92D4800  schedule: push    {r11,r14} ... 02 NSR:C0BDB718|E24BD00..
[Arm][AAPCS] 스택 오염(Stack Corruption)이란 스택에 저장된 레지스터나 변수의 값이 예상치 않은 값으로 변경되는 현상을 스택 오염이라고 합니다. 스택 오염이 발생하는 단계를 설명하기 전에 정상적인 과정으로 스택에 저장된 데이터를 저장하고 로딩하는 단계를 알아보겠습니다. 함수를 호출할 때는 일반적으로 다음과 같은 동작을 수행합니다.   링크 레지스터의 값을 스택 공간에 저장    함수에 위치한 어셈블리 명령어 실행  스택에 저장된 링크 레지스터의 값을 읽어 PC에 다시 로딩 만약 스택 공간에 저장된 링크 레지스터 값이 예상 밖의 다른 값으로 바뀌면 어떻게 동작할까요? 바뀐 다른 값(주소)을 PC에 로딩하게 되며, 정상적으로 서브 루틴으로 분기하는 대신 이상한 주소로 점프를 하게 됩니다. 스택 오염이 발생하는 단계을 세분화하면 다음과 같습니다. ..
[Arm][AAPCS] 스택 오염이나 스택 오버플로우 현상을 만나면 개발자들은 왜 당황해할까? 실전 프로젝트에서 어떤 기능을 구현하는데 50%정도의 노력과 리소스가 들면, 대부분 최소 50% 이상은 버그를 수정하는데 시간을 할애합니다. 이 과정에서 수 많은 버그를 만나는데 잡기 쉬운 버그가 있고 분석을 시작하기 조차 어려운 버그도 있습니다. 처음 겪었을 때 가장 당황하는 버그가 스택 이슈(스택 오버플로우/스택 오염)로 인한 크래시입니다. 주요 증상은 아래와 같습니다. 갑자기 이상한 주소로 프로그램 카운터가 점프를 한다.지역 변수의 값이 이상한 쓰레기 값으로 바뀐다.갑자기 크래시나 폴트가 발생해 실행하던 프로그램이 멈춘다.이런 증상은 대부분 스택이 오염됐을 때 생기는 증상인데 AAPCS의 동작 원리를 모른채, 이런 현상을 겪으면 어디부터 분석을 시작해야 할 지 모릅니다. 그 이유는 무엇일까요? “바..
[Arm프로세서] AAPCS: Armv8: 함수를 호출하기 위한 디자인 AAPCS64 기준으로, 실제 함수를 호출하는 예시 코드와 함께, 함수를 호출하면 SP와 X30 레지스터가 어떻게 바뀌는지 알아보겠습니다. 함수가 호출될 때의 세부 동작 원리 파악하기 여러분이 다음과 같은 함수를 작성했다고 가정하겠습니다. 01 int add_func(int x, int y)02 {03 int result = x + y;04 printf("x:%d, y:%d \n", x, y);05 06 return result;07 } [정보]위에서 든 예시 코드는 6.2 절에서 봤던 코드와 같은데, Armv8 아키텍처 기반의 Arm 코어에서 이 코드를 실행하면 같은 기능을 수행합니다.  Armv7 아키텍처 다룬 함수 디자인 규칙은 Armv8 아키텍처에 거의 그대로 적용됩니다. 공통으로 적용될 수 있는..
[Arm프로세서] AAPCS: Armv8: SP_ELn와 X30 레지스터란 Armv8 아키텍처에서 정의된 레지스터 중 SP_ELn와 X30 레지스터는 AAPCS와 연관된 핵심 레지스터입니다. 먼저 전체 레지스터 목록 중에서 SP_ELn와 X30 레지스터를 보겠습니다. 전체 레지스터 목록 중 SP_ELn와 X30 레지스터 다음 그림을 보면서 Armv8 아키텍처에서 정의된 레지스터 중 AAPCS와 연관된 레지스터를 알아봅시다. 대표사진 삭제사진 설명을 입력하세요.그림 7.1 Armv8 아키텍처의 레지스터 목록 중 AAPCS와 연관된 레지스터(출처: ARMv8-A-Programmer-Guide.pdf) 위 그림은 Armv8 아키텍처에서 정의된 레지스터 목록입니다. 그림에서 빗금으로 표기된 박스를 보겠습니다. SP_EL1는 익셉션 레벨1에서 실행되는 SP 레지스터, SP_EL0은 익셉..
[Arm프로세서] AAPCS: Armv8 아키텍처에서 AAPCS 관련 레지스터 Armv8 아키텍처의 AAPCS를 구성하는 주요 개념은 Armv7 아키텍처와 거의 유사합니다. 6장에서 다룬 내용을 요약하면 다음과 같습니다.  * 서브 루틴을 호출하면 프로세스의 스택 공간에 레지스터를 푸시한다. * 'bl [주소]' 명령어를 실행해 서브 루틴으로 분기하면 Arm 프로세서는 링크 레지스터인 R14에 복귀할 주소를 업데이트한다. * 서브 루틴을 호출할 때 전달되는 인자는 R0-R3 레지스터에 저장된다. * 함수의 리턴값은 R0 레지스터에 저장된다. 위에서 설명한 내용을 Armv8 아키텍처 관점으로 다음과 같이 바꿔서 말할 수 있습니다.  * 서브 루틴을 호출하면 프로세스의 스택 공간에 레지스터를 푸시한다. * 'bl [주소]' 명령어를 실행해 서브 루틴으로 분기하면 Arm 프로세서는 ..