이번 포스트에서 ARM 프로세서의 전망에 대해서 살펴보겠습니다.
 
ARM 프로세서의 출하량
 
2000년대 초반까지만 해도 ARM 프로세서는 소형 임베디드 제품군에만 사용된 특화된 CPU 프로세서였습니다. 이제 ARM 프로세서는 고성능 CPU 시장에도 두각을 드러내며 수 많은 IT 기기에 사용되고 있습니다. 현재 ARM 기반 프로세서는 시장에서 얼마나 사용되고 있을까요? ARM 기반 프로세서는 스마트폰 95%, 태블릿 85%, 웨어러블 90%를 점유하고 있습니다. 2016년 기준으로, 750억 개(누적) 이상의 ARM 프로세서가 탑재된 칩이 출하됐습니다.  
 
ARM 프로세서는 절전형이면서 고성능 스팩을 만족하므로 인텔 CPU 대비 배터리 용량과 크기가 핵심인 스마트 기기 시장에서 선전하고 있습니다. 또한 ARM 프로세서는 사물인터넷에서도 탑재될 가능성이 가장 높습니다. ARM 프로세서의 가장 큰 강점은 저전력 고효율이기 때문입니다.  2021년 후 사물인터넷의 확산과 더불어 칩 출하량은 1조 개 이상으로 예측되고 있습니다.
 
ARM 프로세서는 저전력, 고효율과 같은 장점과 더불어 보안, 하이퍼바이저와 같은 다양한 요구 사항을 만족 시킬 수 있는 확장 기능을 제공합니다. ARM에서 제공하는 트러스트 존을 활용해 엄격한 보안이 요구되는 애플리케이션이나 하드웨어를 개발할 수 있습니다. 또한 ARM(ARMv8)는 하이퍼바이저를 개발하는 벤더 업체가 하이퍼바이저를  효율적으로 구현할 수 있는 기능을 제공합니다. 
 
ARM의 생태계
 
ARM 프로세서의 전망이 밝은 마지막 이유는 ARM 프로세서와 관련된 생태계가 매우 넓다는 점입니다. ARM사는 그 동안 자신의 비즈니스와 연관된 생태계를 구축하는데 많은 노력을 기울였습니다. 그 결과, IT 기술을 구성하는 많은 소프트웨어가 ARM 컴파일러로 빌드되어 ARM 머신 코드로 구성된 라이브러리에 포함됐습니다. 다른 관점으로 말씀드리면 ARM이 아니라 다른 CPU 아키텍처로 빌드된 어떤 라이브러리를 사용하거나 소프트웨어를 사용하려면 굉장한 불편함을 느끼는 상황이 됐습니다.
 
또한 ARM 프로세서를 탑재해 SoC(System-on-Chip) 업체가 개발한 칩은 ARM 프로세서가 지원하는 기능을 활용해 자신만의 하드웨어를 구현합니다. 또한 ARM 프로세서를 제조하는 공장(파운더리)의 경우 ARM 프로세서를 제조하고 테스트하기 위한 인프라가 구축된 상태입니다.
 
ARM과 관련된 생태계는 막강합니다. 그래서 ARM 프로세스 이외에 다른 CPU 프로세서를 적용해 제품을 개발하려면 큰 불편함을 느끼는 상황이 됐습니다.
 
앞으로 ARM 프로세서는 더욱 더 생태계를 확장할 것이며 CPU 아키텍처의 사실 상 표준으로 자리를 굳혀갈 것으로 예상합니다.  
 
---
"이 포스팅이 유익하다고 생각되시면 공감 혹은 댓글로 응원해주시면 감사하겠습니다. "혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!"
 
​Thanks,
Guillermo Austin Kim(austindh.kim@gmail.com)
---
 
 
Reference: ARM 프로세서의 주요 기능
 
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개  
ARM 아키텍처를 구성하는 주요 기능
   ● 어셈블리 명령어란  
   ● ARM의 동작 모드와 익셉션 레벨   
 
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
 
ARM사는 ARM 프로세서를 직접 공장(Foundry)에서 제조해 양산하지 않습니다. 자신의 지적 재산권을 다른 회사에게 라이선싱 할 뿐입니다. 대신 SoC의 업체인 인텔, 엔비디아, TI(텍사스 인스트루먼트) 그리고 삼성들은 자신의 요구 사항에 맞게 ARM 프로세서를 제조합니다. SoC업체는 SoC 제품군에 따라 ARM 프로세서의 세부 스팩을 적용해 ARM 프로세서를 탑재합니다.
 
ARM 사에서 제공한 지적 재산권을 활용해 어느 IT 업체나 각자 SoC 스팩에 맞게 ARM 프로세서를 탑재할 수 있는데, 여기서 말하는 지적 재산권은 라이선스입니다. 라이선스는 ARM 프로세서를 설계할 수 있는 툴과 문서를 포함합니다.
 
SoC 업체들은 ARM 에서 제공하는 2가지 방식의 라이선스를 적용해 자신의 칩에 ARM 프로세서를 탑재합니다.
 
소프트 매크로 
 
버스 시스템, 그래픽 로직과 같은 IP의 기능의 구현 방식을 설명하는 라이선스로, 포멧은  RTL (VHDL/Verilog)입니다. 자유롭게 ARM 프로세서의 캐시와 같은 컴포넌트를 설계하려는 SoC 업체가 활용하는 라이선스입니다.
 
하드 매크로 
 
주어진 프로세스에 적합한 IP의 물리적 레이아웃에 대한 정보를 제공하는 라이선스입니다. 
커스터마이즈가 필요 없고 빠른 설계를 한 후 ARM 프로세서를 탑재하려는 SoC 업체가 사용하는 라이선스입니다.
 
---
"이 포스팅이 유익하다고 생각되시면 공감 혹은 댓글로 응원해주시면 감사하겠습니다. "혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!"
 
​Thanks,
Guillermo Austin Kim(austindh.kim@gmail.com)
---
 
Reference: ARM 프로세서의 주요 기능
 
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개  
ARM 아키텍처를 구성하는 주요 기능
   ● 어셈블리 명령어란  
   ● ARM의 동작 모드와 익셉션 레벨   
 
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
 
이제까지 ARM 프로세서를 공부하는 방법의 문제점에 대해 설명했습니다. 이어서 ARM 프로세서를 효율적으로 공부하는 방법에 대해 소개합니다.
 
디버깅을 하면서 ARM 어셈블리 명령어를 익힌다
 
GDB와 같은 프로그램을 통해 실습을 하면서 ARM 어셈블리 명령어를 배울 필요가 있습니다. 어셈블리 명령어 한 줄 한 줄을 실행할 때 결과를 직접 확인하면서 실습을 하면 배운 내용이 더 오랫동안 남습니다. 이 책에서 ARM 어셈블리 명령어의 동작 원리와 함께 명령어를 실습할 수 있는 방법을 소개합니다. 
 
운영체제의 기본 원리와 함께 ARM 아키텍처를 배운다
 
운영체제 커널의 기본 동작 원리를 ARM 프로세서의 내용과 함께 같이 공부해야 합니다. 이를 위해 ARM 프로세서의 주요 기능이 실제 프로젝트의 운영체제에서 어떤 방식으로 구현됐는지 스스로 찾아 보는 노력을 해야 합니다. 하지만 실전 프로젝트를 겪어 보지 못한 입문자는 이런 내용을 파악하기 어렵습니다. 
 
하지만 이 책에서는 ARM의 주요 개념들이 리눅스 운영체제에서 어떤 방식으로 구현됐는지 소개합니다. 실전 프로젝트에서 가장 많이 활용되는 리눅스 운영체제의 기본 개념을 3장 'ARM을 배우기 위해 알아야 할 리눅스의 주요 개념'에서 소개합니다.
 
실전 프로젝트에서 배운 내용이 어떤 방식으로 구현돼 있는지 확인한다
 
ARM 프로세서와 관련된 내용이 실전 프로젝트에 어떤 방식으로 구현돼 있는지 확인할 필요가 있습니다. 그런데 실전 프로젝트를 겪어 보지 못한 입문자는 이를 파악하기 어렵습니다. 
 
이 블로그에서는 입문자들이 효율적으로 ARM 프로세서를 공부할 수 있게 ARM 사의 개발자가 ARM의 주요 기능을 구현한 패치 코드를 설명하고, 실전 프로젝트에서 ARM의 주요 기능이 구현된 사례를 소개합니다. 
 
---
"이 포스팅이 유익하다고 생각되시면 공감 혹은 댓글로 응원해주시면 감사하겠습니다. "혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!"
 
​Thanks,
Guillermo Austin Kim(austindh.kim@gmail.com)
---
 
Reference: ARM 프로세서의 주요 기능
 
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개  
ARM 아키텍처를 구성하는 주요 기능
   ● 어셈블리 명령어란  
   ● ARM의 동작 모드와 익셉션 레벨   
 
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
 
ARM 사는 용도에 따라 제품군을 나눴는데, 현재 ARM의 최신 라인업인 Cortex 시리즈로 세분화돼 있습니다. 먼저 Cortex-A 제품군부터 알아봅시다.
 
Cortex-A 시리즈
 
컴퓨터 제품을 위한 제품군입니다. 모바일에서 서버용 컴퓨터까지 다양한 플랫폼에서 개발되는 제품을 위한 ARM의 주력 상품군입니다. 스마트폰, TV 등과 같이 어느 정도 성능을 만족해야 하는 멀티미디어 기기나 많은 양의 데이터나 리소스를 처리해야 하는 임베디드 기기에서 주로 사용됩니다. 대부분 범용 운영체제인 리눅스와 윈도우 운영체제를 지원합니다. 
 
Cortex-R 시리즈
 
RTOS 기반 제품을 위한 라인업인데, R은 말 그대로 Real-time의 약자입니다. RTOS에서 MPU(메모리보호유닛)이나 TCM(Tight-Coupled memory)와 같이 신뢰성을 보장하는 장치와 부품을 포함하는데, Cortex-A보다 대체로 낮은 성능의 제품군입니다. 주로 RTOS 기반의 스탠드-얼론 시스템 혹은 DSP 용도의 제품에 사용됩니다.
 
Cortex-M 시리즈
 
이름 그대로 MCU를 위한 라인업입니다. 2010년도까지는 8비트/16비트급 MCU 시장에서 ARM 프로세서는 그리 두각을 드러내지 못합니다. 가격 경쟁력이 떨어져 매출이나 생산 규모에서 뒤쳐졌습니다. Cortex-M 계열 시리즈 제품군을 개발하면서 가격 경쟁력과 성능을 갖추게 됐고, 결국 32비트급 MCU 코어가 주력인 ARM의 Cortex-M이 MCU 시장에서 주도적 위치를 차지합니다.
 
---
"이 포스팅이 유익하다고 생각되시면 공감 혹은 댓글로 응원해주시면 감사하겠습니다. "혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!"
 
​Thanks,
Guillermo Austin Kim(austindh.kim@gmail.com)
---
 
Reference: ARM 프로세서의 주요 기능
 
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개  
ARM 아키텍처를 구성하는 주요 기능
   ● 어셈블리 명령어란  
   ● ARM의 동작 모드와 익셉션 레벨   
 
 
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
 
ARM은 회사 이름이기도 하고 x86와 같은 CPU 아키텍처의 이름입니다.
 
이번 절에서는 ARM의 역사에 대해 소개합니다. ARM사는 에이콘에서 유래됐는데요. 아래 순서로 ARM의 역사에 대해서 살펴보겠습니다.
 
   ● 에이콘의 설립
   ● 조인트 벤처로 ARM사의 탄생
   ● 2010년 모바일 시장 석권
 
에이콘의 설립
 
1978년 영국 캠브리지에서 크리스 커리와 헤르만 하우저가 에이콘 컴퓨터라는 회사를 세웁니다. 마이크로프로세서 기반의 시스템을 개발하는 것이 주된 미션인데 6502 프로세서를 탑재해 컴퓨터 시스템을 개발합니다.
 
'에이콘'사는 컴퓨터 제품을 꾸준히 개발했는데, 1983년 'BBC 마이크로'란 프로젝트로 '에이콘'은 입지를 다지게 됩니다. 'BBC 마이크로'는 프로젝트 닉네임으로 컴퓨터 제품인데 영국의 방송 공사인 BBC가 컴퓨터 문맹 퇴치 프로그램으로 시작된 프로젝트에 채택됐습니다. 1984년 에이콘은 'BBC 마이크로'를 통해 영국 학교에 80%에 육박하는 컴퓨터를 보급하게 됩니다.
 
BBC 마이크로 프로젝트까지 에이콘은 6502 프로세서를 활용했는데, 1980년 중반에 이르러 에이콘사는 한계에 직면합니다. 컴퓨터 시장에는 그래픽 기반 환경 기반의 제품이 출시됐는데 에이콘 사는 6502 프로세서로 컴퓨터의 그래픽 환경을 지원하기 어려운 상황이었습니다. 그래서 아예 새로운 프로세서를 설계하기로 결심하고 개발에 착수했는데, 1985년에 RISC 기반 프로세서인 ARM1 프로세서가 탄생됩니다. 
 
ARM 사의 설립
 
1990년 초반, 에이콘의 파트너인 VLSI는 ARM 프로세서를 위한 새로운 시스템을 찾고 있었고, 애플의 첨단 기술 그룹(ATG)는 에이콘과 접촉해 뉴턴 프로젝트를 위해 ARM 프로세서를 연구하기 시작했습니다. 
 
에이콘 사는 뉴턴 프로젝트에 탑재될 마이크로프로세서를 개발하기 위해 애플과 VLSI Technology와의 조인트 벤처를 설립합니다. 회사의 이름은 ARM(Advanced RISC Machine)으로 지었는데 주로 적절한 전력을 소모하는 저전력 위주의 SoC(System-on-chip) 타입의 CPU 설계에 집중하게 됩니다.
 
ARM이 설립된 시점에 마이크로프로세서 시장의 강자는 인텔의 x86인데, x86 프로세서를 성능을 키우기 위한 방식으로 발전시켜 나갔습니다. 대신 ARM사는 x86과는 달리 적은 양의 트렌지스터로 설계된 아키텍처를 개발했는데 저전력 마이크로컨트롤러 시장에서 ARM 사는 두각을 나타냅니다. 
 
ARM사는 지속적으로 ARM9, ARM10, ARM11 프로세서를 설계해 CPU 구조를 계속 발전시키면서 시장 영역을 소형 임베디드 디바이스인 모바일 단말, PDA로 확대시켜 나갑니다. 2000년대 초반부터 두각을 나타낸 임베디드 리눅스의 열풍을 타고 SoC 계열의 제품이 시장에서 ARM 프로세서가 시장을 석권하게 됐습니다.  
 
2010년 이후 모바일 시장 석권
 
소형 임베디드 시장에서 자리를 잡던 ARM 프로세서는 2010년 아이폰과 안드로이드와 함께 열린 모바일 시장에서 확고한 위치로 자리잡게 됩니다. 2021년 현재 아이폰과 안드로이드와 같은 모바일 디바이스의 95% 이상 제품에 ARM 프로세서가 탑재된 상황입니다.
 
이처럼 모바일 시장의 ARM 사가 강자로 우뚝선 이유는 무엇일까요? 먼저 2005년 ARM 프로세서를 3개의 제품군으로 나누고, 각 제품군의 특성에 맞게 발전시킨 것이 가장 큰 이유입니다. ARM 프로세서가 성능을 뛰어나지 않지만 소형 기기에 적은 전력을 소모하는 프로세서로 인식됐던 것이 사실입니다. 그런데 2005년 Cortex-A 시리즈 제품군을 개발하기로 결정하면서 저전력이지만 고성능을 지원하는 프로세서를 개발하기 시작했습니다. 꾸준히 고성능을 지원하는 Cortex-A 시리즈 제품군의 성능과 관련 기능을 개선시켰습니다. 2010년 안드로이드와 아이폰과 같이 범용 운영체제를 지원하는 모바일 폰 시대가 열렸는데, Cortex-A 프로세서가 모바일 시장에서 최적의 성능을 내는 프로세서로 채택됩니다. 
 
2011년에 64비트 명령어를 지원하는 ARMv8 아키텍처를 공개했고, 이어서 고성능 운영체제에서의 전력 소모를 개선하기 위해 ARM은 big.LITTLE 솔루션을 제시하게 됐습니다.
 
ARM사는 시장의 니즈(Needs)를 충족시키는 기술력을 키우면서 관련 업계의 생태계를 키우는데도 많은 노력을 기울입니다. 즉, ARM 프로세서를 사용할 관련 IT 업체들이 ARM 프로세서를 쉽고 용이하게 쓰도록 환경을 구축했습니다. 
 
더 많은 개발자들이 쉽게 ARM 프로세서를 쉽게 배울 수 있도록 다양한 문서와 교육 자료를 배포했습니다. 또한 ARM 프로세서에서 실행될 수 있는 다양한 코드(최신 기능/최적화 코드)를 리눅스 운영제체와 RTOS에 꾸준히 기여했습니다. SoC(System-on-Chip) 업체를 포함해 일반 개발자들도 ARM 컴파일 옵션에 맞게 운영체제의 코드를 빌드만 하면 ARM 프로세서 위에서 잘 실행됐습니다.
 
Reference: ARM 프로세서의 주요 기능
 
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개  
ARM 아키텍처를 구성하는 주요 기능
   ● 어셈블리 명령어란  
   ● ARM의 동작 모드와 익셉션 레벨   
 
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
 
분야를 막론하고 새로운 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 프로세서를 잘 배워야 한다고 말씀 드렸습니다. 그렇다면 다른 분야의 소프트웨어 개발자들도 ARM 프로세서들을 잘 알아야 할까요? 솔직히 말해, 모든 소프트웨어 개발자가 ARM 프로세서를 잘 배울 필요는 없습니다. 
 
예전과 달리 소프트웨어 분야가 다양해졌고, 한 프로젝트에 탑재되는 소프트웨어의 계층 구조도 복잡해졌기 때문입니다.
 
다음은 안드로이드의 시스템 아키텍처 구성도인데, 이 그림을 보면서 설명을 더 하겠습니다.
 

 
그림: 안드로이드 소프트웨어 계층
 
그림의 윗 부분부터 보면 "Application" - "Application Framework" - "Libraries" - "Linux Kernel" 이란 계층이 보입니다. "Application" 계층에 있는 코드는 대부분 Java란 언어로 구현되며, 이 계층에서 실행되는 애플리케이션을 개발하는 개발자 분들은 애플리케이션의 시나리오나 안드로이드 프레임워크에서 제공하는 함수의 용법을 파악합니다. Java로 애플리케이션을 개발하는 분들은 ARM 프로세서의 동작 원리에 대해서 잘 알 필요는 없습니다.
 
하지만 C나 C++언어로 구현된 Application Framework이나 Libraries를 개발하는 개발자들은 ARM 프로세서에 대해 잘 알 필요가 있습니다. 
 
시스템 소프트웨어 개발자와 마찬가지로 C/C++로 구현된 코드를 작성하거나 다른 라이브러리를 링크해 어떤 기능을 구현하다보면 여러가지 버그를 만날 가능성이 높습니다. 그 중에 대표적인 케이스를 예로 들면 다음과 같습니다.
 
   ● 크래시가 발생하면 코어 덤프와 같은 메모리 덤프 파일을 받아 디버깅을 수행
   ● 특정 시점에서 성능이 안 나오는 문제가 나와 성능을 키우기 위한 코드 작성
 
이와 같은 실전 문제를 빨리 디버깅하고 최적의 코드를 작성하기 위해서는 ARM 프로세서의 동작 원리를 파악할 필요가 있습니다.
 
이번 포스트에서는 소프트웨어 개발자들이 ARM 프로세서를 배워야 하는 이유에 대해 설명했습니다. 사실 이미 다양한 분야의 고수 소프트에어 개발자들이 이미 다음과 같은 조언을 했습니다.
 
   ● 코딩을 하는 모든 개발자들은 자신이 작성한 코드를 실제 실행하는 
       CPU가 어떻게 작동하는지 잘 알아야 더 좋은 코드를 작성할 수 있다.
 
저는 "최근 가장 대중적으로 많이 사용되는 CPU 아키텍처인 ARM 프로세서를 잘 배워야 더 좋은 코드를 작성할 수 있다"라고 말씀드리고 싶습니다.
 
이어지는 포스트에서는 ARM 프로세서를 공부하는 방법의 문제점과 효율적으로 공부하는 방법을 소개합니다.
 
 
Reference: ARM 프로세서의 주요 기능
 
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개  
ARM 아키텍처를 구성하는 주요 기능
   ● 어셈블리 명령어란  
   ● ARM의 동작 모드와 익셉션 레벨   
 
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
 
2005년도에 제가 처음 개발을 시작한 프로젝트는 ARM7 프로세서 기반의 시스템이었습니다. 프로젝트에 투입된 소프트웨어 개발자들은 모두 ARM 프로세서 교육을 들었습니다. ARM 프로세서를 왜 배워야 하는지 의문을 품었던 개발자는 거의 없었던 것 같은데요. 2021년인 지금 가끔 ARM 프로세서 학습의 필요성에 대해 의문을 품는 분들이 종종 있는 것 같습니다. 
 
이번 포스트에서 임베디드 개발자가 ARM 프로세서를 왜 배워야 하는지 살펴보겠습니다. 
 
브링업을 제대로 하기 위해서
 
임베디드 개발자들이 진행하는 프로젝트의 단계는 '보드 브링업 - 기능 안정화 - 유지 보수'로 분류될 수 있습니다. 3단계 중 보드 브링업 단계에서 구체적으로 어떤 일을 할까요? 과제에 따라 다르지만 개발 업무의 내용을 요약하면 다음과 같습니다.
 
    ● 부트로더에서 스타트 업 코드를 작성
    ● 메모리와 같은 하드웨어를 초기화
  
먼저 스타트업 코드가 무엇인지 알아볼까요?
전원이 시스템에 들어오면 가장 먼저 실행되는 주소에 코드를 위치시켜서 시스템을 초기화하는 코드를 “스타트 업 코드”라고 부릅니다. 스타트 업 코드는 기본적인 메모리를 설정을 초기화하고 ARM 모드 별로 스택 사이즈를 지정해야 합니다. 
 
그런데 스타트 업 코드를 제대로 작성하려면 ARM 어셈블리 명령어를 알아야 됩니다. ARM 동작 모드 별로 스택 주소를 설정하고, ARM 프로세서를 초기화하는 코드는 C 언어가 아니라 어셈블리를 이용해 설정할 수 밖에 없기 때문입니다. 또한 MMU(Memory Management Unit)과 같은 ARM의 구성 요소도 어셈블리 명령어로만 설정할 수 있습니다. 
 
ARM 어셈블리 명령어뿐만 아니라 ARM의 동작 모드와 MMU의 동작 원리도 알아야 합니다. ARM 명령어는 기본으로 알아야 하고 ARM 아키텍처를 제대로 이해하고 있어야 합니다.
디바이스 드라이버 개발을 잘 하기 위해서
 
리눅스 디바이스 드라이버 개발자들은 ARM 프로세서를 잘 알면 다양한 방식으로 디바이스를 제어할 수 있습니다. 특히 많은 하드웨어 디바이스가 인터럽트를 통해 드라이버와 커뮤니케이션을 합니다. 그런데 GIC(Generic Interrupt Controller)와 같이 ARM 프로세서가 인터럽트를 처리하는 하드웨어의 처리 방식을 잘 알면 인터럽트의 우선순위와 세부 속성을 세밀하게 제어할 수 있습니다.
 
또한 멀티미디어와 관련된 드라이버를 작성할 때는 성능이 중요합니다. CPU 코어의 성능을 최대한 올리는 코드를 작성할 필요가 있습니다. ARM 프로세서의 내부에서 구현된 코드가 어떤 방식으로 처리되는 지 알면 성능을 더 올리는 코드를 작성할 수 있습니다. 
 
RTOS나 리눅스 커널에 대한 깊이있는 이해를 위해서
 
리눅스 커널이나 RTOS를 깊이 있게 배우려면 ARM 프로세서의 동작 원리를 제대로 알아야 합니다. 커널을 구성하는 세부 시스템의 핵심 루틴은 ARM 어셈블리 명령어로 구현되어 있기 때문입니다. 더 구체적으로는 리눅스 운영체제나 RTOS는 ARM의 익셉션을 활용한 기능들이 많습니다.
 
리눅스 커널의 다음 서브 시스템은 어셈블리 명령어로 구현돼 있으며 ARM의 익셉션 기능을 활용해 동작합니다.
 
    ● 인터럽트 벡터
    ● 컨텍스트 스위칭 루틴
    ● Preemption 처리 루틴
    ● 시그널을 받아 처리하는 루틴
    ● 시스템 콜 핸들러를 처리하는 루틴
 
많은 분들이 리눅스 커널의 고수들은 리눅스 커널만 잘 알고 있다고 생각할 수 있는데요. 실제 대부분 리눅스 커널의 고수들은 ARM 아키텍처에 대해서 정말 깊이 있게 알고 있습니다. 
 
디버깅을 잘 해 문제를 잘 해결하기 위해서
 
난이도나 복잡도가 높은 드라이버를 맡으면 커널 패닉이나 심하면 와치독 리셋과 같은 문제를 만날 가능성이 높습니다. 이런 크래시 문제를 디버깅하기 위해서는 ARM 프로세서를 제대로 알고 있어야 합니다.
 
실전 프로젝트를 진행하다보면 수 많은 버그를 만나게 됩니다. 이 중에서 개발자들이 가장 어려워하는 버그는 커널 패닉인데, 커널 패닉이 발생하면 커널 로그는 커널 패닉이 발생한 코드의 위치를 ARM 레지스터 세트와 함꼐 출력합니다. 다음은 커널 패닉이 발생할 때의 커널 로그입니다.
 
 
[  262.401303] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[  262.401365] pgd = dbdc4000
[  262.401389] [00000000] *pgd=00000000
[  262.401433] Internal error: Oops: 80000005 [#1] PREEMPT SMP ARM
[  262.401459] Modules linked in:
[  262.401495] CPU: 0 PID: 7107 Comm: Framework Tainted: G        W    3.10.49-g356bd9f-00007-gadca646 #1
[  262.401522] task: da6b0540 ti: d9412000 task.ti: d9412000
[  262.401549] PC is at 0x0
[  262.401590] LR is at xfrm_local_error+0x4c/0x58
[  262.401619] pc : [<00000000>]    lr : [<c0adc274>]    psr: a00f0013
[  262.401619] sp : d9413c68  ip : c0ac6c20  fp : 0000dd86
[  262.401654] r10: 0000010e  r9 : 0000010a  r8 : de0ddc20
[  262.401678] r7 : c13ddf00  r6 : 00000500  r5 : d9094540  r4 : c13e3780
[  262.401703] r3 : 00000000  r2 : 00000001  r1 : 00000500  r0 : d9094540
 
보다시피 ARM 코어의 레지스터 세트가 출력되는데 각 레지스터의 역할과 동작 원리를 파악하고 있어야, 커널 크래시가 발생한 원인을 분석할 수 있습니다. 
 
Reference: ARM 프로세서의 주요 기능
 
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개  
ARM 아키텍처를 구성하는 주요 기능
   ● 어셈블리 명령어란  
   ● ARM의 동작 모드와 익셉션 레벨   
 
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
 
 
여러분이 어셈블리 명령어를 작성하거나 C 프로그래밍을 하면 컴파일러는 ARM 코어가 실행할 수 있는 어셈블리 명령어로 변환합니다.
그런데 대부분 ARM 어셈블리 명령어는 레지스터와 함께 구성돼 있어, 레지스터에 친숙해질 필요가 있습니다.
 
그렇다면 레지스터란 무엇일까요? 레지스터는 ARM 코어가 어떤 연산을 수행할 때 데이터를 저장하는 임시 저장 공간입니다. 
이를 쉽게 CPU 공간의 메모리라고도 설명하기도 합니다. 이제 ARM 사에서 배포한 문서에서 레지스터를 설명한 부분을 보면서 레지스터에 대해 조금 더 알아봅시다. 
 
ARMv7 아키텍처의 레지스터
 
---
출처: DDI0406C_arm_architecture_reference_manual.pdf
A2.3 ARM core registers
 
In the application-level view, an ARM processor has:
•  thirteen general-purpose 32-bit registers, R0 to R12
•  three 32-bit registers with special uses, SP, LR, and PC, that can be described as R13 to R15.
---
 
위 내용은 "R0~R12 레지스터는 범용 용도로 사용되며 SP, LR, PC와 같이 (R13~R15) 레지스터는 
특별한 용도로 사용된다"라고 해석할 수 있습니다.
 
범용 레지스터는 어셈블리 명령어를 실행할 때 연산에 주로 사용되며, 주로 데이터를 저장합니다.
대신 스페셜 레지스터는 프로세스의 실행 흐름을 나타내는 역할을 수행합니다. 
SP, LR, PC 레지스터를 알면 프로세스가 어느 코드까지 실행됐는지 파악할 수 있습니다.
 
 
ARMv8 아키텍처의 레지스터
 
이번에는 ARMv8 아키텍처의 64비트 명령어 기준으로 레지스터 세트에 대해 알아봅시다.
 
---
출처: DDI0487A_g_armv8_arm.pdf
B1.2.1 Registers in AArch64 state
 
In the AArch64 application level view, an ARM processing element has:
R0-R30 31 general-purpose registers, R0 to R30. Each register can be accessed as:
  • A 64-bit general-purpose register named X0 to X30.
  • A 32-bit general-purpose register named W0 to W30.
 
See the register name mapping in Figure B1-1.
---
 
R0~R30 레지스터는 범용 레지스터로 사용된다는 이야기인데, 레지스터 저장하는 데이터의 크기에 따라
다음과 같은 방식으로 표기합니다.
 
    * 64비트 크기 데이터를 저장하는 레지스터는 X0~X30로 표기
    * 32비트의 데이터를 저장하는 경우 W0~W30으로 표기
 
대신 프로세스의 실행 흐름을 나타내는 스페셜 기능 레지스터는 PC와 SP입니다.
 
Reference: ARM 프로세서의 주요 기능
 
ARM 프로세서는 왜 배워야 할까
ARM 프로세서 학습하는 방법의 문제점
ARM 프로세서 소개  
ARM 아키텍처를 구성하는 주요 기능
   ● 어셈블리 명령어란  
   ● ARM의 동작 모드와 익셉션 레벨   
 
Written by <디버깅을 통해 배우는 리눅스 커널의 구조와 원리> 저자
 
프로젝트를 진행하다보면 소프트웨어적으로 도저히 그 원인을 분석할 수 있는 버그를 만날 때가 있습니다.
어떤 어셈블리 명령어를 실행한 다음에 갑자기 리셋이 되거나, 특정 CPU가 핫 플러그인 동작 후에 못 깨어나는 문제들이죠.
 
이럴 때 보통 하드웨어적으로 문제가 있는 지 의심을 하며, 보통 전원이 제대로 공급되는지, 혹은 메모리 비트 플립은 아닌 지 체크를 하죠.
그런데 문제가 해결이 안되면 종종 듣는 말이 있습니다. 그것은 ARM Errata입니다.
 
이번엔 ARM Errata가 무엇인지 소개합니다.
 
ARM Errata
 
ARM Errata는 용어 그대로 ARM 프로세서에 오류가 있을 때 이를 알리는 통지 번호를 의미합니다.
예를 들면, 'ARM Errata 1234567'과 같은 방식으로 전달되는데 보통 어셈블리 코드 포멧의 패치가 공유됩니다.
 
그렇다면 ARM Errata는 어떻게 전달이 될까요?
ARM 사에서 라이센싱을 한 업체에게 ARM Errata를 배포한다고 알려져 있습니다. 
 
반드시 수정해야 할 ARM Errata가 배포되면 리눅스 시스템 개발자나 커뮤니티에 공유가 되기도 합니다.
 
ARM Errata 패치 코드
 
이번에는 리눅스 커널 커뮤니티에 배포된 ARM Errata 패치 코드를 소개합니다. 
 
링크는 아래와 같은데요.
 
제목: ARM: 7345/1: errata: update workaround for A9 erratum #743622
author: Will Deacon <will.deacon@arm.com>
 
ARM 사의 개발자가 직접 리눅스 커널 소스 트리에 커밋을 생성한 것으로 보입니다. 
커미터를 보니 ARM-리눅스 커널 커뮤니티에서 가장 영향력이 있는 러셀 킹(Russell King)이 보이네요.
 
개발자 인터뷰
 
'A9 erratum #743622'과 관련된 개발자를 인터뷰 했는데요. 그 분께 다음과 같은 질문을 했습니다.
 
    * A9 erratum #743622를 반영하지 않았을 때 어떤 현상을 겪었나?
 
일단 한 달동안 개고생을 했는데, 어쩌구, 저쩌구...
메모리가 깨지고 갑자기 시스템이 리셋되는 현상을 겪었다고 합니다.

 

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

 
 

+ Recent posts