분야를 막론하고 새로운 IT 기술을 배울 때 공부하는 방법은 중요합니다. 가끔은 "무식하게, 시행착오를 많이 겪는 게 최고의 공부 방법이라"라고 말하는 분도 있지만, ARM 프로세서를 학습할 때는 적용할 만한 조언은 아닌 것 같습니다. 왜냐면 저의 수년간의 실전 프로젝트를 통해 다음과 같은 사실을 절감했기 때문입니다.
● ARM 프로세서는 정말로 공부하는 방법이 중요하다!
ARM 프로세서를 공부하는 방법이 중요한 이유는 무엇일까요? 잘못된 방법으로 ARM 프로세서를 공부하면 배운 내용이 오랫동안 머릿 속에 남지 않기 때문입니다. 빨리 지루해집니다. 무엇보다 배운 내용을 실전 프로젝트에 활용하지 못합니다. 그래서 ARM 프로세서를 공부하다가 포기하거나 ARM 프로세서가 정말 어려운 주제라고 믿게 됩니다.
이처럼 많은 개발자들이 ARM 프로세서를 배우기 어려워하는 이유는 ARM 프로세서가 어렵기 보다는 ARM 프로세서를 공부하는 방법을 잘 모르기 때문이라고 생각합니다.
이번 포스트에서는 ARM 프로세서를 공부하는 방법의 문제점을 소개하고 이어지는 포스트에서는 효율적으로 ARM 프로세서를 공부하는 방법을 소개합니다.
ARM 어셈블리 명령어를 무리하게 암기한다
ARM 프로세서를 처음 접할 때 ARM 어셈블리 명령어를 만나게 됩니다. 잘못된 방식으로 ARM 어셈블리 명령어를 공부하는 경우가 많습니다.
대부분 ARM 프로세서를 처음 접할 때 먼저 어셈블리 명령어를 배우기 시작합니다. ARM 어셈블리 명령어는 ARM 프로세서와 대화하는 언어이므로 ARM 어셈블리 명령어를 통해 ARM 프로세서를 제어할 수 있기 때문입니다. 또한 ARM 어셈블리 명령어를 잘 알면 컴퓨터의 구조까지 파악할 수 있습니다. 그런데 문제는 ARM 어셈블리 명령어를 다음과 같은 방식으로 배운다는 사실입니다.
● ARM 어셈블리 명령어를 영어 단어와 같이 암기한다.
ARM 어셈블리 명령어를 암기하면 뭔가 ARM 프로세서를 알게 됐다는 느낌이 들어 뿌듯해 합니다. 하지만 이런 방식으로 ARM 어셈블리 명령어를 외우면 배운 내용이 보름 이상 머릿 속에 남기 어렵습니다. 가장 큰 이유는 다음과 같습니다.
● 어셈블리 명령어의 동작 원리를 실습하지 않았기 때문입니다.
1달 정도 지난 후, 암기한 ARM 어셈블리 명령어가 기억 속에 희미해지면 다시 반복해 ARM 어셈블리 명령어를 외웁니다. 잘 외워 지지 않으면 자신의 노력이 부족하다고 자책합니다. 이 과정을 반복하면 ARM 프로세서를 어렵다고 느낄 가능성이 높습니다.
어셈블리 명령어를 실습해보지 않고 각각 명령어가 실제 어떻게 활용되는지 알지 못한 채 반복해서 암기하는 것은 좋은 학습 방법이 아닙니다.
ARM 프로세서의 내용만 따로 배운다
ARM 프로세서를 실전 프로젝트에서 어떻게 활용되는지 파악한 소프트웨어 개발자들은 대부분 다음과 같은 사실을 느낄 것입니다.
● ARM 프로세서는 리눅스와 같은 운영체제에서 맞물려 구동된다.
리눅스 운영체제 관점으로는 ARM 프로세서의 주요 기능을 활용해 커널의 주요 동작을 구현합니다. 운영체제의 커널과 ARM 프로세서의 동작을 분리해서 분석하기 어려울 정도로 밀접하게 연관돼 있습니다.
조금 더 구체적으로 예를 들어 설명해 보겠습니다. ARMv7 아키텍처에서 익셉션 벡터를 다음과 같이 정의합니다.
그림 1.2 ARMv7 아키텍처의 익셉션 벡터 테이블
위 그림을 보면 Hyp, Monitor, Secure, Non-secure 모드 별로 익셉션 벡터 테이블의 종류를 알 수 있습니다. 이와 관련된 ARM 스팩 문서를 읽으면 “익셉션이 발생하면 익셉션의 종류 별로 지정된 주소로 프로그램 카운터가 변경된다”라는 사실을 알 수 있습니다.
그런데 이 사실만 파악한 채 실전 프로젝트에 투입되면 안타깝지만 개발자는 아무 것도 할 수 없습니다. ARM 프로세서의 동작 원리만 파악했기 때문입니다. ARM 프로세스의 익셉션 벡터가 운영체제의 커널에서 익셉션 벡터가 어떤 방식으로 구현됐는지 알아야 시스템의 작동 원리를 파악하거나 개선할 수 있는 코드를 입력할 수 있습니다.
다음은 운영체제의 커널에서 익셉션 벡터가 구현된 실제 어셈블리 코드입니다.
01 NSR:FFFF0000|EA0003FF b 0xFFFF1004 ; vector_rst
02 NSR:FFFF0004|EA000465 b 0xFFFF11A0 ; vector_und
03 NSR:FFFF0008|E59FFFF0 ldr pc,0xFFFF1000
04 NSR:FFFF000C|EA000443 b 0xFFFF1120 ; vector_pabt
05 NSR:FFFF0010|EA000422 b 0xFFFF10A0 ; vector_dabt
06 NSR:FFFF0014|EA000481 b 0xFFFF1220 ; vector_addrexcptn
07 NSR:FFFF0018|EA000400 b 0xFFFF1020 ; vector_irq
08 NSR:FFFF001C|EA000487 b 0xFFFF1240 ; vector_fiq
어셈블리 코드를 보면 FFFF0000 주소부터 0x4 바이트 단위로 어셈블리 코드가 보입니다. ARM 아키텍처의 스팩 문서의 내용을 참고해 구현됐다는 사실을 알 수 있습니다.
두 번째 예시를 들겠습니다. ARM 아키텍처에서 함수 호출 규약(Calling Convention)를 중요한 개념으로 배웁니다.
다음은 ARM 사에서 배포한 "Procedure Call Standard for the Arm Architecture" 문서에서 발췌한 부분입니다.
---
6.2 Processes, Memory and the Stack
The AAPCS applies to a single thread of execution or process (hereafter referred to as a process). A
process has a program state defined by the underlying machine registers and the contents of the memory
it can access.
출처: Procedure Call Standard for the Arm Architecture
---
함수 호출 규약의 핵심은 함수를 호출하면 프로세스의 스택 공간에 지역 변수나 링크 레지스터를 푸시(저장)하고 팝(로딩)하는 동작입니다. 그런데 위 문서에서 언급된 프로세스란 무엇일까요? 스택 공간은 공학적으로 어떤 의미일까요?
ARM 프로세서의 함수 호출 규약을 설명할 때 프로세스의 기본 개념, 프로세스 스택의 기본 구성 요소를 제외하고 ARM 프로세서의 입장에서만 이 내용을 다룹니다. 운영체제의 기본 개념을 제외한 ARM 프로세서의 함수 호출 규약을 이론적으로 이해하면, 배운 내용이 실제 어떻게 구현되고 활용되는지 파악하기 어렵습니다.
배운 내용이 실전 프로젝트에서 어떻게 활용되는지 파악하지 않는다
실습을 통해 ARM 프로세서의 주요 개념을 파악해도 배운 내용을 그나마 오랫동안 기억할 수 있습니다. 하지만 ARM 프로세서의 주요 개념들이 실전 프로젝트에서 어떤 방식으로 구현됐는지 파악하지 않으면 배운 내용을 진정 자신의 것으로 만들지는 못할 가능성이 높습니다.
예를 들어 여러분이 피아노란 악기를 배운다고 가정해 봅시다. 피아노 학원에서 열심히 바이엘과 하농만 연습하고 아름다운 다른 피아노 작품을 연주하지 않습니다. 피아노를 열심히 쳐도 실력이 느는 것 같지 않고 지루해집니다. 그 이유는 피아노를 치는 기본 스킬을 키우는 연습곡만 연주했기 때문입니다.
ARM 프로세서도 마찬가지입니다. ARM 프로세서의 동작 원리를 제대로 파악해도 배운 내용을 실전 프로젝트에서 활용하지 못하면 배운 내용은 시간이 지나면 결국 잊어 먹기 쉽습니다. 이런 사실은 공부하는 방법의 문제점이라기 보다는, ARM 프로세서가 실전 프로젝트에 어떻게 활용되는지 잘 알려주는 자료(책, 블로그)가 부족하기 때문이라고 볼 수 있습니다.
Reference: ARM 프로세서의 주요 기능
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개
ARM 아키텍처를 구성하는 주요 기능
● 어셈블리 명령어란
● ARM의 동작 모드와 익셉션 레벨
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 > 1장: Arm 프로세서 소개' 카테고리의 다른 글
[ARM프로세서] ARM 프로세서의 패밀리 (0) | 2023.06.10 |
---|---|
[ARM프로세서] ARM 프로세서의 역사 (0) | 2023.06.10 |
[ARM프로세서] ARM 프로세서를 일반 SW 개발자도 배워야 하는 이유 (0) | 2023.06.10 |
[ARM프로세서] 소프트웨어 개발자가 ARM 프로세서를 배워야 하는 이유 (0) | 2023.06.10 |
[ARM] 레지스터란(ARMv7, ARMv8) (0) | 2023.06.10 |