[ARMv8] 익셉션 클래스가 구현된 코드 분석하기: 리눅스 커널
By Guillermo Austin Kim | 2020년 9월 23일 |
[ARMv8] 익셉션 클래스가 구현된 코드 분석하기: 리눅스 커널 이번 포스트에서는 ARMv8 에서 소개된 익셉션 클래스가 ARMv8 기반의 리눅스 커널에서 어떤 방식으로 구현됐는지 분석합니다. # 익셉션 클래스 소개 소스를 분석하기 전에 ARMv8의 익셉션 클래스를 Q/A 형식으로 소개합니다. Q: 익셉션 클래스란 무엇인가? 익셉션 클래스는 익셉션이 발생한 세부 원인(Cause)를 나타내며 Synchronous 유형의 익셉션이 발생했을 때 익셉션 클래스를 읽을 수 있습니다. Q: 익셉션 클래스는 언제 어떻게 읽을 수 있나? 익셉션 클래스는 Synchronous 유형의 익셉션이 발생했을 때 익셉션 신드롬 레지스터(Exception Syndrom Register)를 통해 읽습니다.익셉션 클래스는
[ARM] 전원을 키면 처음에 어디서 무엇을 실행할까[1]: PC 레지스터
By Guillermo Austin Kim | 2020년 8월 26일 |
분야를 막론하고 C 언어나 파이썬으로 컴퓨터 프로그래밍을 하다보면 다음과 같은 의문점이 생깁니다. * 바로 컴퓨터의 전원 버튼을 누르면 가장 먼저 무엇을 실행할까? * 이 때 실행되는 어셈블리 명령어는 무엇일까? * 이 명령어는 메모리의 어느 위치에 있을까? 이런 의문을 해소하려면 먼저 ARM 코어 내부에 있는 레지스터 중에 PC라고 부르는 프로그램 카운터 레지스터에 대해 이해할 필요가 있습니다. PC(프로그램 카운터) 레지스터란 PC(프로그램 카운터 레지스터)의 역할은 무엇일까요? 실행할 명령어를 읽을 때 사용되며 PC는 ARM 코어가 실행할 명령어가 있는 위치를 저장합니다. 그런데 이름과 역할이 약간 다른 것 같습니다. PC라는 용어는 프로그램 카운터라고 부른다고 말씀드렸는데, "프
[라즈베리파이] 시스템 콜 - 소프트웨어 인터럽트 벡터(vector_swi) 코드 분석
By Guillermo Austin Kim | 2018년 11월 21일 |
커널 공간에서 시스템 콜 실행 출발점은 vector_swi 레이블입니다. svc 명령어를 실행하면 소프트웨어 인터럽트 벡터인 vector_swi 레이블으로 브랜치하기 때문입니다. vector_swi 레이블 어셈블리 코드 분석으로 ARM 리눅스 커널에서 시스템 콜이 어떻게 동작하는지 살펴봅시다. vector_swi 레이블 어셈블리 코드는 다음과 같습니다.1 80107ee0 <vector_swi>:2 80107ee0: e24dd048 sub sp, sp, #72 ; 0x483 80107ee4: e88d1fff stm sp, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip}4 80107ee8: e28d803c add r8, s
[ARM프로세서] ARMv7: 프리페치 어보트(Prefetch Abort)가 발생할 때 ARM 코어의 세부 동작
By Guillermo Austin Kim | 2020년 11월 30일 |
프리패치 어보트가 발생하는 전체 흐름을 살펴보면서, 세부 동작을 알아봅시다. 그림 8.7 프리페치 어보트 익셉션을 유발할 때 변경되는 레지스터 그림 8.7은 8.2 절에서 봤던 그림과 비슷해 보입니다. 한 가지 차이점은 그림의 가운데 부분과 같이 ARM 프로세서 내부에서 처리되는 동작을 슈도 코드로 표현한 것입니다. 슈도 코드는 하드웨어적으로 처리되는 과정에 대한 이해를 돕기 위해 작성된 것이란 사실을 기억합시다. 이해를 돕기 위해 프리패치 어보트가 발생한 명령어를 실행한 주소가 0xc000d000이라고 가정하겠습니다. 먼저 01번째 줄을 봅시다. 01 R14_abt = 0xc000d000 + 0x4 프리패치 어보트가 발생했으니 ARM 코어는 어보트 모드로 변경할 준비를 하는데, 먼저 어보트