Guillermo Austin Kim

Sources

Posts

998 posts

[Arm프로세서] Armv7 아키텍처의 Arm 동작 모드 소개

Guillermo Austin Kim|2021년 9월 2일

Arm 아키텍처의 가장 중요한 개념은 Arm 동작 모드입니다. 익셉션, 트러스트존을 비롯한 Arm 아키텍처의 많은 기능은 Arm 동작 모드 기반 위에서 설계 됐습니다. 그래서 Arm 동작 모드를 이해하는 것이 중요합니다. 하지만 Arm의 동작 모드를 배울 때 기계적으로 스팩의 내용을 억지로 이해하고 암기하는 분들이 많습니다. 대신 다음과 같은 질문을 던지고 답을 찾는 과정을 거치면 어떻까요? 더 많은 것을 배울 수 있고, 공부한 내용이 머릿 속에 더 오랫 동안 남을 것입니다. ❑ Arm 동작 모드는 어떻게 바뀔까? ❑ Arm 동작 모드가 바뀌면 이전 Arm의 동작 모드는 어떻게 확인할까? ❑ 이전 Arm 동작 모드로는 어떻게 복귀할까? &#1006

[Arm프로세서] AAPCS: Armv8: C 코드 최적화 - 함수 인자의 갯수는 9개 이하로 제한

Guillermo Austin Kim|2021년 9월 1일

6.4 절에서 Armv7 아키텍처에서 다룬 AAPCS는 실무에 적용할 만한 실용적인 내용이 많다고 설명했습니다. Armv8 아키텍처의 AAPCS도 마찬가지입니다. 이번 절에서는 Armv8 아키텍처의 AAPCS에서 성능 개선을 위해 고려해야 할 2가지 내용을 소개합니다. Armv8 아키텍처의 AAPCS로 관점으로 보면 함수 인자의 갯수는 9개 이하로 제한하는게 좋습니다. 함수의 인자의 갯수가 9개를 넘어가면, 프로세스의 스택 공간에 인자를 저장해 전달하기 때문입니다. 하지만 함수의 인자의 갯수가 4개를 넘어서면 코드의 가독성이 떨어지고, 인자를 연산한 결과를 저장하기 위해 프로세스의 스택 공간에 엑세스하는 명령어가 늘어납니다. 되도록이면 함수에 전달되는 인자는 4개까지 지정하는 것이 좋습니다. 이번에는

[Arm프로세서] AAPCS: Armv8: 함수를 호출할 때 쓰이는 X0-X7 레지스터와 명령어 분석

Guillermo Austin Kim|2021년 8월 30일

SP 레지스터, X30 레지스터와 더불어 눈여겨봐야 할 레지스터가 X0-X7 레지스터입니다.함수를 호출할 때 전달되는 인자는 X0-X7 레지스터에 저장되고, 함수가 반환하는 값은 X0 레지스터로 저장되기 때문입니다. X0-X7 레지스터의 역할: 함수에 전달된 인자 저장 01 0x10000 :02 {03 0x10000: f81e0ffe str x30, [sp, #-32]!04 int res = add_func(x, y);05 0x10004: 52800061 mov w1, #0x3 // #306 0x10008: 52800040 mov w0, #0x2 // #207 0x1000c: 97ffffef bl 20000 0

[Arm프로세서] AAPCS: Armv8: X30 링크 레지스터와 어셈블리 명령어 분석

Guillermo Austin Kim|2021년 8월 30일

SP 레지스터보다 링크 레지스터인 X30은 '함수 호출'에서 가장 중요한 역할을 수행합니다. 함수를 호출한 다음에 복귀할 주소를 X30 레지스터가 저장하기 때문입니다. 우리가 함수를 작성하면 어디선가 함수를 호출할 것이라 예상합니다. 그런데 함수를 호출한 다음, 호출된 함수의 실행이 종료되면 (함수를 호출한 코드 기준으로) 바로 아랫 부분에 있는 코드가 실행됩니다. X30 레지스터와 관련된 예제 코드 분석 이번에는 아래와 같이 main() 함수의 코드(C 코드와 어셈블리 코드로 같이 변환)을 보면서 이 내용에 대해 조금 더 알아봅시다. 01 0x10000 :02 {03 0x10000: f81e0ffe str x30, [sp, #-32]!04 int res =

[Arm프로세서] AAPCS: Armv8: SP(스택 포인터) 레지스터의 세부 동작

Guillermo Austin Kim|2021년 8월 29일

SP는 스택 포인터(Stack Pointer) 레지스터라고 하는데, Armv8 아키텍처에서는 SP_ELn로 표기합니다. SP_ELn 레지스터와 익셉션 레벨 6장에서는 SP은 프로세스의 스택 공간 내에서 업데이트된다고 했는데, Armv8 아키텍처에서 명시된 SP_ELn은 어떤 개념인지 조금 헷갈립니다. SP_ELn은 쉽게 풀어서 다음 표와 같이 설명할 수 있습니다. 표 7.6 SP_ELn 레지스터와 익셉션 레벨 SP_EL0은 유저 프로세스가 유저 공간에서 실행될 때 접근하는 스택 포인터이고, SP_EL1은 프로세스가 커널 공간에서 실행될 때 접근되는 스택 포인터라고 볼 수 있습니다. SP_ELn에 대한 정의를 Arm 아키텍처의 관점으로 알아 봤습니다. 그런데 SP_ELn 레지스터의 내용을 읽으면 읽을