ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컴퓨터구조][ARM] ARMv7 부트 코드
    공학/컴퓨터구조 2023. 8. 7. 19:00

    글의 참고

    - DEN0013D_cortex_a_series_PG.pdf (Chapter 13 - Boot Code p13.1)


    글의 전제

    - 내가 글을 쓰다가 궁금한 점은 파란색 볼드체로 표현했다. 나도 모르기 때문에 나중에 알아봐야 할 내용이라는 뜻이다.

    - 밑줄로 작성된 글은 좀 더 긴 설명이 필요해서 친 것이다. 그러므로, 밑 줄 처친 글이 이해가 안간다면 링크를 따라서 관련 내용을 공부하자.


     

    글의 내용

     

    - 목적, 소개

    • 이 챕터는 ARM 프로세서의 boot code를 설명할거다. 근데 2가지에 초점을 맞춰서 설명하려고 한다.
      1. SoC 같은 칩들을 최초에 전원을 넣으면 대부분은 OS를 바로 사용하지 못한다. 예를 들어, ARM 코어에 전원이 인가되는 시점에 바로 실행되는 코드들이 있는데, 이런 경우는 bare-metal code라고 부른다. 요 글에서는 이놈들에 대해 설명할 것이다.  
      2. 어떻게 부트 로더가 커널 이미지를 메모리에 로드하고 커널을 동작시키는지 설명할 거다.

     

    13.1 Booting a bare-metal system

    • ARMv7가 reset 되었을 때, exception vector table의 reset vector가 가리키는 익셉션 리셋 핸들러를 호출한다. 익셉션 리셋 핸들러는 반드시 다음의 작업들을 해야 한다. 그러나 모든 작업들을 반드시 해야한다는 것은 아니다. 필수적인 작업들을 해야 한다는 소리이다.
      • 멀티 코어 시스템에서는 non-primary cores들은 sleep에 들어갈 수 있게 enable한다.
      • 익셉션 벡터들을 초기화한다.
      • MMU를 포함한 메모리 시스템을 초기화한다.
      • corre mode와 registers들을 초기화한다.
      • critical I/O devices 들을 초기화한다.
      • Perform any necessary initialization of NEON or VFP 
      • 인터럽트들을 enable한다.
      • core의 mode와 state를 바꾼다.
      • Handle any set-up required for the Secure world
      • main() application을 호출한다.
    • 가장 먼저 고려해야 할 사항은 exception vector table의 위치다.
    • 다음 단계는 caches, MMU와 branch preditors를 설정해야 한다. 일단 MMU, caches를 disable하고 caches와 TLB를 무효화(invalidated) 한다. 일부 Cortex-A 프로세서들은 리셋 시점에 자동으로 L1과 L2를 disable 하지만, 다른 놈들은 직접 수동으로 무효화를 해줘야 한다. 
    • MMU TLB`s 반드시 무효화(invalidated)되어야 한다. The branch target predictor hardware는 아마 무효화시킬 필요까지는 없겠지만, boot code에서 반드시 enabled 되어야 하긴 한다. branch prediction는 이시점에서 안전하게 enabled 될 수 있고, 결과적으로 퍼포먼스를 증가시킬 수 있다. 아래의 ARMv7의 example code를 보면서 확인해보자. 아래의 MRC, MCR 관련 내용은 이 글을 참조하자.
    @ Disable MMU
    MRC p15, 0, r1, c1, c0, 0 @ C15의 c1 레지스터의 값을 ARM 레지스터 r1에 쓴다.
    BIC r1, r1, #0x1                @ r1 = r1 & 0xFFFFFFFE -> 이건 결국 C15으 0번째 비트를 CLEAR하겠다는 소리. C15의 0번째 비트가 MMU enable/disable 비트다.
    MCR p15, 0, r1, c1, c0, 0 @ r1에 MMU를 disable한 내용을 C15의 c1 레지스터에 쓴다.

    @ Disable L1 Caches -> L1 Caches는 일반적으로 하버드 아키텍처로 명령어/데이터 라인이 각각 있다.
    MRC p15, 0, r1, c1, c0, 0 @ Read Control Register configuration data
    BIC r1, r1, #(0x1 << 12) @ Disable I Cache(명령어 캐시를 의미)
    BIC r1, r1, #(0x1 << 2)   @ Disable D Cache(데이터 캐시를 의미)
    MCR p15, 0, r1, c1, c0, 0 @ Write Control Register configuration data


     

    '공학 > 컴퓨터구조' 카테고리의 다른 글

    [컴퓨터 구조] PCI  (1) 2023.08.09
    [컴퓨터 구조] PCI 인터럽트  (0) 2023.08.08
    [컴퓨터 구조] 디스크 주소 지정  (0) 2023.08.07
    [컴퓨터 구조] Data Alignment  (0) 2023.08.07
    VGA 텍스트 모드  (1) 2023.08.05
Designed by Tistory.