ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 임베디드 OS 개발프로젝트 [4장]
    Share/OS 2021. 3. 3. 22:01

    *이만우 님의 임베디드 OS 개발프로젝트 책을 보고 실습한 과정입니다. 개인적으로 느낀점과 요약을 중점으로 작성하였습니다. 

     

    저자분께 감사의 말씀을 드립니다. 

    www.aladin.co.kr/shop/wproduct.aspx?ItemId=221593471

     

    임베디드 OS 개발 프로젝트

    펌웨어 개발 과정을 실시간 운영체제(RTOS)를 만들어 가며 설명한다. 임베디드 운영체제를 개발 환경 구성에서 시작해 최종적으로 RTOS를 만드는 과정(부트로더 제작, 하드웨어 제어, 태스크 간 동

    www.aladin.co.kr

     

     

     

     

    4장. 부팅하기 

     

    서론

     부팅한다는 것이 무엇일까. 그냥 컴퓨터 전원 켜듯이, 전자제품의 전원을 넣으면 시간이 조금 흐르면 원하는 화면이 뜨는 것 ?! 이라고 생각 할 수 있다. 그러면 조금더 깊이 기술적으로는 무엇일까. 전원 버튼을 누르고 OS와 커널은 스타트업 코드를 통해 필요한(?) 기능/명령 및 초기화과정 이라고 생각했다. 

    본 책을 읽어가며 그 깊이를 더 할 수 있어서 좋았다. 

     

    "시스템에 전원이 들어가서 모든 초기화 작업을 마치고 펌웨어가 대기(Idle) 상태 가 될때까지 " 

    " 시스템에 전원이 들어가고 ARM 코어가 리셋 익셉션 핸들러를 모두 처리한 다음에 본격적으로 C 언어 코드로 넘어가기 직전" 

     

    이라고 표현 되어있다. 

     

    본 챕터에서는 다음을 다룬다. 

     

    • 임베디드 장치의 메모리 설계 
    • 익셉션 벡터 테이블 만들기 
    • 익셉션 핸들러 만들기 
    • 스택 만들기 
    • 만든 스택 확인하기 
    • 메인으로 진입하기 

    한줄 서론 요약 

    " QEMU로 임베디드 장치의 메모리 설계를 하고 익셉션 벡터 테이블을 만들어서 스택변화를 확인하자.

    (스택포인터변수를 통해 이를 확인), 궁극적으로 main.c 로 진입하는 것을 목적으로 하고 일련의 과정들을 세팅한다.  

     

    본론

     

    메모리 설계 

     

    메모리는 크게 3가지로 나뉘며(text, data, BSS), 각 영역을  "속도"와 "기능" 에 따라서 배치를 고려한다. 

    구글링 해보자. arm 레지스터 메모리 구조 

     

    오래전 학교에서나 어디선가 문득 많이 보던 그림인데, 이 개념이 여기서 호환?된다는게 신기하다. 

     

    QEMU를 활용하여 만들어가고 있는 임베디드 OS는 ARM 계열이라 여기고 있다. 따라서 ARM 레지스터나 메모리 구조,즉 ARM 아케텍쳐에 대한 기초지식이 필요하다.

    (흰쌀을 가지고 떡을 만들기 때문에, 흰쌀에 대해서 어느정도 알아야겠지?최소 흰색 떡을 만들고 싶다면...)

     

    ARM에 대한 개념이 부족한상태에서 본론을 들어가면 SVC, IRQ,FIQ 모드 스택......에 대한 근거를 모르니, 한번이라도 ARM 구조를 훑어 넘어가는게 좋을 듯하다. 

     

     

    1. 메모리맵은 MemoryMap.h 파일로 저장하여 include 디렉터리를 만들고 그 안에 넣는다. 

     

    2. 익셉션 핸들러에서 가~~장 먼저 만들어야 하는 것은 "리셋 익셉션 핸들러" 이다. 이때 리셋익셉션 핸들러에서 메모리 맵을 설정/세팅 해주는 것이다. 

     

    3. 또한 ARM의 cpsr에 값을 설정하여 동작모드를 바꿀 수 있는 코드를 "ARMv7AR.h"로 작성한다.

     

    1,2,3 과정을 요약하면, 

    ARM 동작모드를 바꿀 수 있는 값을 가지고 있는 파일을 작성하고,

     

    가장 먼저 작성해야될 리셋 익셉션 핸들러를 작성하고

     

     

     

     

    Entry.S 에서 작업 

     

     

     

    Entry 파일에서 코드로 직감적으로 유추 할 수 있는것은

    - text 섹션을 정의했고,

    - vector_start ~ vector_end 레이블 작업을 한다. 

    - 아직 리셋 익셉션 핸들러는 작성하지 않은 상태

     

    위의 결과로 

    make  debug

    make gbd 

    를 하여 i r 을 통해 결과를 보면서 레지스터에(R1)값의 변화를 확인하는 것으로 

    " 내가 타겟으로 하는 h/w에 entry 파일을 작성함으로서, 리제스터에 접근을 하였다" 

    는것을 알수있다. 

     

     

    본격적으로 익셉션핸들러를 작성하고, 스택을 만들자. 

     

    MemoryMap.h 

    : 파일은 각 동작모드의 스택시작 메모리주소스택 크기스택 꼭대기 메모리 주소를 정의 

     

    include 폴더에 넣어주고, 

    이를 반영하여 동작모드 스택을 초기화 해주는 리셋 익셉션 핸들러를 Entry.S에 추가한다. 

    (코드 생략) 

     

    여기서 중요한 것 두가지. 

     

    1. Makefile 작성 

     

    어떠한 코드를 구동 하기위해서는 사람의 코드 --> 기계의 코드로 전환해야 한다.

    사람의 코드는 .c 와 같은 파일일테지만, 기계는 바이너리 기계어를 이해한다. 

     

    make 명령을 통해 나의 특정 타겟 source code를  "build" 할 수 있고 , 

    build를 마친 그 코드는 binary 코드 혹은 .o (Object 파일) 로 변환 된다. 

     

    물롼 더 자세한 과정은 여러 파일을 서로 엮어주는? 링킹과 같은 작업들이 있겠지만, 여기서는 생략한다. 

     

    어쨋든, build를 하기위해서 마구마구 make를 떄리다? 보면, 에러가 와장창 났는데, 그 에러하나하나 다 올리기가 어려워 요약하자면, 

    - 줄바꿈 에러, 화면상 줄을 바꿨다고 바뀐게 아님  ( \처리 ) 

    -  Makefile에서 o파일 빌드 명령어는 책을 전적으로 믿고 갈수밖에없었음.

     

     

    2. 지금 하는 개발과정에 대한 흐름 

     

    메모리 맵을 작성하였고 --> include 폴더에 두었고, --> Entry.S 에 적용해서, 

    부팅되는 과정에서 익셉션 핸들러가 적용 되게끔 하였음. 

    그렇다면, 부팅되는 과정에서 파일을 하나씩 읽을 것이고, 

    메모리에 스택은 높은 주소에서 낮은 순서대로 자라는? 특징이 있기에, gdb로 연결해서 S(step)을 진행할때, 

    sp (StackPointer : Entry.S에서 메모리의 스택변화를 알기위해 열어둔 변수) 의 메모리 주소가 변화되는 것을 확인하는 것이 이번챕터의 핵심 내용이다 

     

     

     

     

     

    결론

     

    느낀점 

     

    - 파일을 생성해서 make 하고 build 되어 실행되는데 까지의 과정을 이해 

    - 메모리라는 것이막연하게 source code와는 동떨어지게 생각했는데, 조금더 면밀하게 연관지어 개념을 잡을 수 있게됨

    - 부팅의 과정이 생각보다 어려운 코드나 복잡하게 돌아가는게 아닌것임을 생각하게됨 

     

     

    참고

    egloos.zum.com/rousalome/v/9966116

     

    [ARMv8]ARM64 - 각 익셉션(Exception) 레벨 소개

    이번 포스팅에서는 ARMv8 아키텍처를 파악하다가 만나는 가장 큰 걸림돌인 '익셉션 레벨'에 대해 설명합니다.대부분 개발자들은 기존 ARM 아키텍처의 User, Supervisor, IRQ, FIQ, 모드에 익숙한 상태입니

    egloos.zum.com

     

     

    댓글

실험중인 삶, Life is not a race