004주차 (2013.05.18) Arm System Developer's Guide PT자료


#1

4주차 Study Note (2013/05/18)

Status

Notice

  • 김진평님이 PT자료를 바탕으로 발표 진행함.
    • p.1~p.101: 자세히 / P.102~P.241: 요약
    • 한사람에게 너무 집중하면 결과적으로 그 사람도 지치고, 세미나 자체가 무너질 우려 제기
    • 향후 세미나 진행 시, 김진평 님에게 집중적으로 묻는 방식은 금지할 것.
  • 이후의 세미나 방향에 대한 논의
    • :+1: PT자료는 어느정도 들었으니 마무리하고, 책의 챕터를 선정해서 진행하자.
    • :+1: ARM 2차 세미나 후, C팀 첫 회식 진행하자.
    • :+1: ARM 3차 세미나는 금요일에 진행할 예정이기에, 시간 가능하신분은 알아서 참석요망
    • :-1: 다음번에 PT자료 남은 부분을 조금 더 진행하자.
    • :-1: PT자료는 어느정도 들었으니 마무리하고, 책으로 자세히 진행하자.
    • :-1: PT자료는 어느정도 들었으니 마무리하고, 소스코드를 바로 진행하자.
    • :-1: 2차 세미나 후 남은시간은 세미나 진행하자. ※ 책을 통해 얻는 지식은 부트코드 분석시에 40%도움이 되고, 전체 코드에서 약 10% 도움이 됨
  • 소스코드 분석대상 Architecture 및 Platform 선정
    1. Exynos 5410을 주장하는 측의 의견
    1. ARM v8제품군을 주장하는 측의 의견
    1. 위의 big.LITTLE이 아닌 다른 Architecture를 이용하자
    • kernel의 지원 여부가 불분명한데 단순한 core로 가는 것이 장점일 수 있다.
    1. 소스코드 분석 시 TIP
    • 컴파일을 통해 타겟보드의 결과에 집중하게 되면 점점 Hell이 되고, 정작 중요한 goal은 딜레이 되는 현상 발생.
    • 처음에 코드 보면 힘들지만, 참고 진행하다보면 내성이 생겨서 편안해짐.

Issues (Ongoing)

  • [x] 1. BUS Master는 항상 Processor가 담당할까? [#18]

    그렇지 않다. Ethernet 또는 PCI도 master가 될 수 있다.

  • [x] 2. Multicore인 경우에 pipeline을 각각 나눠서 수행한다고 보면 되는 것인가? [#19]

    아니다. Muticore인 경우 pipeline을 CPU수 만큼 가질 수 있다.

  • [x] 3. ARM 64비트는 명령어 길이도 64비트인가? [#20]

    아니다. 64비트라고 하여도, 명령어 길이는 32비트를 사용한다.

  • [x] 4. ARM에 여러가지 mode가 존재하는데, 각 mode는 레지스터를 전부 각각 가지고 있는가? [#21]

    GPR의 일부분은 공유하고, 다른 레지스터(CPSR, SPSR)등은 자신의 것을 가지고 있다.

  • [x] 5. ARM에서 각 mode로 전환 시, register 값을 반드시 저장해야만 하는가? [#22]

    당연히 저장하여야 한다. 저장하는 값에는 다시 복귀하기 위한 address 값도 저장한다.

  • [ ] 6. ARM board로 boot 시, ARM mode, Thumb mode 중 어느것으로 작동하는가? [#23]

    Study 시에는 ARM mode라고 define 하였지만, 확인이 필요합니다. :sos:

  • [x] 7. User mode에서 IRQ mode로 전환 후, 또 다른 mode로 전환이 가능한가? [#24]

    당연히 가능하다.

  • [x] 8. Thumb모드의 장점은 무엇인가? [#25]

    Code의 사이즈를 줄일 수 있고, 시스템 구성상 호환성을 보장한다. 또한 code의 사이즈가 줄기 때문에 cache hit 율이 올라가고 그에따른 성능향상을 보장 받는다. ARM모드 대비 70%로 code 압축 효과가 있고, 130% 성능 개선이 있다. (Ref.: Embedded Recipes)

    어떠한 제약 때문에 16비트 폭의 메모리를 사용하는 경우 Thumb모드가 훨씬 빠릅니다. 16 비트 폭의 메모리를 사용하는 경우도 ARM모드를 사용할 수 있습니다. 하지만 ARM명령을 두번에 걸쳐 읽어야 하기 때문에 Thumb모드보다 느립니다.

  • [x] 9. ARM pipeline에서 각 stage에서 소요되는 cycle 수는 보통 1 cycle인가? [#26]

    보통은 1cycle이다.

  • [x] 10. 5stage 이상 pipeline에서 memory와 write-back stage에서 소요되는 cycle 수가 같을까? [#27]

    둘은 메모리와 레지스터로 하드웨어적인 특성이 다르다. 5단 pipeline의 경우 대부분 프로세서 속도 500MHz이하에서 L1 cache를 1cycle로 구현 가능하다. 이경우 register와 동일하게 1cycle access time을 갖는다.

    그러나 memory stage가 꼭 L1 hit된 경우만 있지는 않다. cache miss, page miss 등의 경우도 발생한다. (심지어 Reg. File의 경우 1clock을 2phase로 나누어 write, read 처리하여 write한 data를 동일 clock에 읽어내는 경우도 있다.)

    1GHz 이상의 프로세서는 대부분 L1 cache latency가 2cycle 이상이며 이경우 memory stage가 2개 이상으로 늘어난다.

  • [x] 11. ARM pipeline의 forwarding 기능은 어느 architecture version 부터 적용이 되었는가? [#28]

    아마 5단계 이상부터 사용되었을 것이다. 추가 조사가 필요하다. :sos:

  • [x] 12. pipeline의 multiple issue는 어떻게 처리 가능한가? [#29]

    pipeline은 Front-End와 Back-End부분으로 나뉘며, 각 부분에는 Reservation StationROB(ReOrder Buffer)를 통해 처리된다.

  • [x] 13. Cortex 계열의 ARM 버전은 몇이라고 보면 되는가? [#30]

    Cortex는 A, M, R 계열로 나뉘며, 현재 study하고 있는 Exynos5420은 ARMv7이다.

  • [x] 14. TCM은 무엇인가? [#31]

    TCM(Tightly Coupled Memory)로 임베디드 쪽에서 critical한 이슈를 다룰 때 사용한다.

    자동차 분야를 예로들면, 당장 급한 task는 cache에 쓰고 하고 할 시간이 없다. 그런 경우 cache를 안거치고 수사이클 이내에 직접 TCM에 접근하여 처리한다.

  • [x] 15. co-processor의 경우 instruction을 어떻게 처리하는가? [#32]

    Undefined exception을 발생시키고, 분기하여 처리한다.


  • [x] 16. Thumb Mode에서도 다른 mode로 변경이 가능한가? [#33]

    Thumb명령어 bx, blx 를 이용하여 ARM state로 변경될 수 있습니다.

    또한 Thumb명령어인 swi 를 사용하면 인터럽트가 발생하여 ARM 모드로 진입하게 됩니다.

  • [x] 17. Loop-unrolling이 어떤 역할을 하는가? [#34]

    Loop를 적당하게 풀면, pipeline의 gain을 얻는 수 있는데, 이런 작업을 하는 과정이다. 보통은 profiling을 통해 hot spot을 찾고, gain을 얻을 수 있는지 판단에 의해 작업한다.

  • [x] 18. 자동 inline 옵션은 compiler의 어떤 optimization level부터 가능한가? [#35]

    GCC의 경우 O3옵션 사용하면 가능하다.

    	                       Included in Level
       Optimization	       -O1  -O2  -Os  -O3
       inline-functions        X	  X    X    O
    

    (Ref.: KLDP wiki)

  • [x] 19. Point aliasing은 무엇인가? [#36]

    서로 다른 이름을 가진 pointer가 같은 주소를 지정하는 경우를 말함. 이경우 thread unsafe하기 때문에 warning발생 image


  • [x] 20. ARM의 주소지정방식 중 IA-DB, FD-EA가 의미하는 것은? [#37]

    여러개의 데이타를 load store 하는 명령어인 ldm, stm 과 조합하여 사용합니다.

    stack에 저장할 때 특히 신경써야 할 부분입니다. ARM 에서는 기본적으로 Full-Descending 스택 정책을 사용합니다. 따라서 스택에 저장할 때는 먼저 스택포인터를 줄이고, 그 다음에 저장을 합니다.

    스택에서 읽을 때는 반대로 먼저 읽고 스택포인터를 증가시킵니다. (그렇게 약속이 되어있습니다)

    이때 사용하는 명령어 짝이 stmdb (store multiple decrease before), ldmia (load multiple increase after) 입니다. 다른 방법으로는 stmfd, ldmfd 를 사용해도 컴파일러가 알아서 stmdb, ldmia로 바꾸어 컴파일해줍니다.

    마찬가지로 push, pop을 쓰면 알아서 FD 스택이라고 가정하고 컴파일 해줍니다. Empty, Ascending/Descending, Increase/Decrease, Before/After는 아래를 통해 이해.

    image

    ※ 동일 명령어
    :LDMDA = LDMFA
    :LDMDB = LDMEA
    :LDMIA = LDMFD = LDM = POP :LDMIB = LDMED :STMDA = STMED :STMDB = STMFD = PUSH :STMIA = STMEA = STM
    :STMIB = STMFA

  • [x] 21. 최적화 시, r0~r3 register를 사용하는데, 그 원리가 어떻게 되는가? [#38]

    함수의 인자가 int형(4byte)4개를 넘으면 나머지는 스택에 저장됩니다. double처럼 4byte를 넘어갈 경우 복수의 레지스터에 저장되며, 함수의 리턴값은 r0~r1에 저장됩니다. 만약 8byte가 넘을 경우 포인터를 return합니다.

  • [x] 22. ARM의 어셈블리 명령은 어떻게 기계어 명령으로 변환되는가? [#39]

    아래 그림과 같이 일정한 규칙에 의해 변환된다.