Guillermo Austin Kim

Sources

Posts

998 posts

[Arm프로세서] Armv8: 소프트웨어 인터럽트로 Synchronous 익셉션이 처리되는 전체 흐름

Guillermo Austin Kim|2021년 1월 21일

Armv7 아키텍처에서 유저 애플리케이션이 구동되는 User 모드에서 ‘svc’ 명령어를 실행하면 이를 슈퍼바이저 콜(Supervisor Call)로 감지해 지정된 소프트웨어 인터럽트 벡터로 브랜치합니다. 즉, 'svc' 명령어를 실행하면 이를 처리하는 익셉션을 따로 정의돼 있습니다. 그렇다면 Armv8 아키텍처에서도 같은 방식으로 처리될까요? Armv8 아키텍처에서 ‘svc’ 명령어를 실행하면 처리되는 방식이 약간 다른데, 다음과 같은 동작을 수행합니다. ❑ ESR_ELx 레지스터의 [31:26] 비트에 슈퍼바이저 콜이 발생했다는 정보를 나타내는 비트를 저장 ❑ Synchronous 익셉션을 유발 Armv8 아키텍처에서는 'svc' 명령어를 실행하면 Synchronou

[Arm프로세서] Armv8: 메모리 어보트로 Synchronous 익셉션이 처리되는 전체 흐름

Guillermo Austin Kim|2021년 1월 21일

Armv7 아키텍처에서는 메모리 어보트를 유발하는 명령어가 실행되면 데이터 어보트, 프리페치 어보트, Undefined Instruction과 같은 익셉션을 유발합니다. 각각 익셉션 핸들러에서 디버깅 정보를 출력하고 시스템을 리셋시킵니다. 마찬가지로 Armv8 아키텍처는 메모리 어보트를 유발하는 명령어가 실행되면 Synchronous 익셉션을 유발하며 해당 익셉션 핸들러에서는 시스템을 리셋시키는 동작을 수행합니다. 다음 그림을 보면서 메모리 어보트를 유발하는 명령어를 실행했을 때 Synchronous 익셉션이 처리되는 전체 흐름을 알아봅시다. 그림 9.5 메모리 어보트 타입 Synchronous 익셉션이 발생할 때 전체 흐름 그림 9.5와 같이 익셉션의 전체 실행 흐름은 4단계로 분류될 수 있는데,

[리눅스커널] CONFIG_FUNCTION_TRACER를 키는 방법

Guillermo Austin Kim|2021년 1월 20일

defconfig 파일에서 아래 컨피그를 추가하면, CONFIG_IRQSOFF_TRACER=yCONFIG_SCHED_TRACER=yCONFIG_STACK_TRACER=y .config에서 아래 내용을 확인할 수 있다. CONFIG_FTRACE=yCONFIG_FUNCTION_TRACER=yCONFIG_FUNCTION_GRAPH_TRACER=yCONFIG_IRQSOFF_TRACER=y# CONFIG_PREEMPT_TRACER is not setCONFIG_SCHED_TRACER=y

[Arm프로세서] Armv8: Synchronous 익셉션(Exception)의 실행 흐름

Guillermo Austin Kim|2021년 1월 19일

Synchronous 익셉션의 유발 인자는 다음과 같이 분류될 수 있습니다. 표 9.6 Synchronous 익셉션을 유발하는 원인 소프트웨어적으로 치명적인 오류를 유발하는 명령어나 유저 공간에서 svc 명령어를 실행하면 Synchronous 익셉션이 유발됩니다. Armv7 아키텍처의 메모리 어보트 타입 익셉션에 익숙하신 분은 위 표를 보면 조금 당황할 수 있는데요. 이는 메모리 어보트 타입 익셉션을 분류하는 방식이 Armv8 아키텍처와는 다르기 때문입니다. 이 차이점에 대해서 조금 짚어 보겠습니다. 메모리 어보트 익셉션의 차이점: Armv7 vs Armv8 시스템 개발자들에게 "Arm 프로세서의 익셉션이 무엇인가?"라고 질문하면, 대부분 Armv7 아키텍처의 익셉션을 떠올리는 경우가 많습니다

[Arm프로세서] Armv8: 익셉션 핸들러(Exception Handler)

Guillermo Austin Kim|2021년 1월 18일

Arm 코어가 익셉션을 감지하면 익셉션 벡터 주소로 프로그램 카운터를 브랜치합니다. 여기까지가 Arm 코어가 하드웨어적으로 처리하는 부분인데, 그 다음부터 어떻게 동작할까요? Arm 코어의 프로그램 카운터가 특정 주소로 바뀌면, 해당 주소에 위치한 어셈블리 명령어를 페치해 실행합니다. 즉, 익셉션 벡터 주소로 프로그램 카운터를 브랜치하면 이 주소에 위치한 명령어가 실행되는 것입니다. 이 부분부터 소프트웨어적으로 익셉션을 핸들링하는 동작이라고 볼 수 있습니다. 익셉션 벡터에 위치한 명령어가 실행되면 이를 "익셉션 핸들러가 처리된다"라고 합니다. 익셉션 벡터에 위치한 명령어 세트를 보통 익셉션 핸들러라고 하는데, 이해를 돕기 위해 다음과 같이 Armv8 아키텍처에서 빌드된 익셉션 핸들러 코드를 소개합니다.