임베디드/[ ARM ]

[ ARM ] 01. 모든 개발자가 ARM 프로세서를 배워야 하는 이유

kim.svadoz 2021. 3. 10. 14:17
728x90
반응형

01. 모든 개발자가 ARM 프로세서를 배워야 하는 이유

이제 조금 더 깊게 들어가서 왜 임베디드개발자 혹은 일반개발자들도 ARM 프로세서를 배워야 하는지 알아보자.

  1. 임베디드 개발자가 ARM 프로세서를 배워야 하는 이유

    • 보드 브링업을 제대로 수행하기 위해

      • 임베디드 개발자들이 진행하는 프로젝트의 단계는 보드 브링업 - 기능안정화 - 유지보수 정도로 분류될 수 있다. 이 중 보드 브링업단계에서는 구체적으로 어떤 일을 할까?
        • 부트로더에서 스타트업 코드를 작성
          • 스타트업코드란 전원이 시스템에 들어오면 가장먼저 실행되는 주소에 코드를 위치시켜서 시스템을 초기화하는 코드이다.
          • 스타트업 코드는 기본적인 메모리 설정을 초기화하고 ARM 모드 별로 스택 사이즈를 지정해야 한다
          • 이 스타트업 코드를 제대로 작성하기 위해선 ARM 어셈블리 명령어를 알아야 한다. ARM 동작 모드 별로 스택 주소를 설정하고, ARM 프로세서를 초기화 하는 코드는 C 언어가 아니라 어셈블리어를 이용해 설정할 수 밖에 없기 때문이다.
        • 메모리와 같은 하드웨어 초기화
          • MMU(Memory Management Unit)과 같은 ARM의 구성요소도 어셈블리 명령어로만 설정할 수 있다.
          • ARM 명령어는 기본으로 알아야 하고 ARM 아키텍쳐를 알고 있어야 한다.
    • RTOS나 리눅스 커널에 대한 깊이있는 이해를 위해

      • 리눅스 커널이나 RTOS를 깊이 있게 배우려면 ARM 프로세서의 동작 원리를 제대로 알아야 한다. 커널을 구성하는 세부 시스템의 핵심 루틴은 ARM 어셈블리 명령어로 구현되어 있기 때문이다. 더 구체적으로는 리눅스 운영체제나 RTOS는 ARM의 익셉션을 활용한 기능들이 많다.
      • 리눅스 커널의 다음 서브 시스템은 어셈블리 명령어로 구현돼 있으며 ARM의 익셉션 기능을 활용해 동작한다.
        • 인터럽트 벡터
        • 컨텍스트 스위칭 루틴
        • Preemption 처리 루틴
        • 시그널을 받아 처리하는 루틴
        • 시스템 콜 핸들러를 처리하는 루틴
    • 디버깅을 잘 해 뛰어난 문제해결을 위해

      • 난이도나 복잡도가 높은 드라이버를 맡으면 커널 패닉이나 심하면 와치독 리셋과 같은 문제를 만날 가능성이 높다. 이런 크래시 문제를 디버깅하기 위해서는 ARM 프로세서를 제대로 알고 있어야 한다.

      • 실전 프로젝트를 진행하다보면 수 많은 버그를 만나게 된다. 이 중에서 개발자들이 가장 어려워하는 버그는 커널 패닉인데, 커널 패닉이 발생하면 커널 로그는 커널 패닉이 발생한 코드의 위치를 ARM 레지스터 세트와 함꼐 출력합니다. 다음은 커널 패닉이 발생할 때의 커널 로그의 한 예이다.

        pc : [<0x0051c760>]    lr : [<0x0051c740>]
        sp : 0x03851c08  ip : 0x2e76278a  fp : 0x03851c2c
        r10: 0x03b57edc  r9 : 0x03b57e94  r8 : 0x03b57e7c
        r7 : 0x03b61d54  r6 : 0x03b57f24  r5 : 0x2e762758
        r4 : 0x00000022  r3 : 0x00000022  r2 : 0x00000000
        r1 : 0x009b4560  r0 : 0x2e762788
      • 보다시피 ARM 코어의 레지스터 세트가 출력되는데 각 레지스터의 역할과 동작 원리를 파악하고 있어야, 커널 크래시가 발생한 원인을 분석할 수 있다.

  2. 그 외의 개발자가 ARM 프로세서를 배워야 하는 이유

    • 사실 예전과 달리 소프트웨어 분야가 다양해졌고, 한 프로젝트에 탑재되는 소프트웨어의 계층 구조도 복잡해졌기 때문에 모든 SW 개발자가 ARM 프로세서를 잘 배울 필요는 없다.
    • 하지만 아래의 안드로이드 시스템 아키텍쳐를 보자.

    image-20210310141219079

    • 그림의 윗 부분부터 보면 "Application" - "Application Framework" - "Libraries" - "Linux Kernel" 이란 계층이 보입니다. "Application" 계층에 있는 코드는 대부분 Java란 언어로 구현되며, 이 계층에서 실행되는 애플리케이션을 개발하는 개발자 분들은 애플리케이션의 시나리오나 안드로이드 프레임워크에서 제공하는 함수의 용법을 파악한다. Java로 애플리케이션을 개발하는 분들은 ARM 프로세서의 동작 원리에 대해서 잘 알 필요는 없다.
    • 하지만 C나 C++언어로 구현된 Application Framework이나 Libraries를 개발하는 개발자들은 ARM 프로세서에 대해 잘 알 필요가 있다.
    • 시스템 소프트웨어 개발자와 마찬가지로 C/C++로 구현된 코드를 작성하거나 다른 라이브러리를 링크해 어떤 기능을 구현하다보면 여러가지 버그를 만날 가능성이 높습니다. 그 중에 대표적인 케이스를 예로 들면 다음과 같다.
      • 크래시가 발생하면 코어 덤프와 같은 메모리 덤프 파일을 받아 디버깅을 수행
      • 특정 시점에서 성능이 안 나오는 문제가 나와 성능을 키우기 위한 코드 작성
    • 이와 같은 실전 문제를 빨리 디버깅하고 최적의 코드를 작성하기 위해서는 ARM 프로세서의 동작 원리를 파악할 필요가 있다.

결론은 코딩을 하는 모든 개발자들은 자신이 작성한 코드를 실제 실행하는 CPU가 어떻게 작동하는지 잘 알아야 더 좋은 코드를 작성할 수 있다.

728x90
반응형