007주차 (2013.06.08) ARM System Developer's Guide (처음~Ch.09)


#1

7주차 Study Note (2013/06/08)

Status

Notice

  • 기 선정된 Chapter 위주로 진행 (Ch.3은 개인이 각자 보고 다음시간에 질문 시간 갖자!

Issues (Clear)

  • [x] 1. 메모리 타이밍과 리프레시 비율의 의미? [#42]

    메모리 타이밍은 작업을 수행할때 걸리는 시간을 램 클럭을 기준으로 대기 시간을 정하는 옵션이다. 보통 칩에서 제공하는 값이 있어서 그 값을 바탕으로 타이밍을 정한다.

    리프레시 비율은 데이터 값이 지워지지 않도록 주기적으로 신호를 주어서 처리하는 것이다. DRAM cell은 Row, Column, Bank로 이루어져 있으며 이것이 address 특정 bit와 대응한다. 중간에서 Row Buffer를 통해 항상 access하며, bank는 동시에 여는 Row Buffer의 수를 의미한다. (Ref.:[Memory timings] (http://en.wikipedia.org/wiki/SDRAM_latency))

  • [x] 2. 부호 확장기의 역할은? [#43]

    Signed 값 지정시에 사용한다. Unsigned 정수의 경우 0 extension, Signed 정수의 경우 MSB extension 이다.

  • [x] 3. “register” 지시어를 피해야 하는 이유는 무엇인가? [#44]

    stack의 cycle수 때문에 그렇다. 유저 입장에서는 사용하지 않는 것이 현명하다. register를 통해 강제로 register를 지정하면 compiler입장에서 GPR 후보군이 작아지므로 최적화에 방해가 된다.

  • [x] 4. Scratch register란? [#45]

    범용 목적으로 사용하는 register이다.

  • [x] 5. 코드가 작은 함수의 경우 compiler가 이를 알고 inline화 시키는데, "작은"함수의 기준이 어떻게 되는가? [#46]

    결론만 얘기하면 정해진 rule은 없다. compiler 제작자마다 version마다 다를 수 있으며, inline 결정 관련 인자는 아래와 같다.

    • 함수의 크기 및 함수가 호출되는 횟수 (e.g.: 해당 함수가 1곳에서만 call되는 경우 or 1줄짜리 함수인 경우)
    • 현재 최적화 수준 (O2또는 O3 이상)
    • 속도(-Otime)가 최적화 대상인지 아니면 크기(-Ospace)가 최적화 대상인지 여부 (Otime일 때 inline)
    • 함수에 외부 또는 정적 연결 중 어느 것이 있는지 여부
    • 함수에 포함된 매개변수의 수
    • 함수 반환 값 사용 여부
  • [x] 6. inline함수는 일반 C 함수처럼 header파일을 공유해서 사용하는가? [#47]

    그렇다. 보통은 다른 C 함수처럼 사용한다.

  • [x] 7. exception이나 interrupt 시 복귀 주소가 상이한 이유는 무엇인가? [#48]

    오늘 스터디중 이해가 잘 안되는 부분이 있었습니다. 그런데 방금 책 보다가 해결이 되어 공유합니다. 사실과 다른 것이 있다면 과감하게 댓글 달아주세요.^^

    [표 9.4] 링크 레지스터 기반의 익셉션 복귀 주소

    질문은 ‘IRQ가 발생하면 왜 링크 레지스터에 -4를 빼는가?’ 였습니다. 제가 찾은 답은 이렇습니다. 이해를 돕기 위해 ADD, SUB, MOV가 파이프라인에 들어있다고 가정할께요.

    | Fetch (LR)  | Decode (LR-4)  | Execution (LR-8) |
    |  ADD        | SUB            | MOV              |
    

    파이프라인 동작 특성으로 인해 실행 단계에서 PC는 항상 명령어 주소에 8을 더한 값을 가리킵니다. (34page 인용) 지금 이 순간에는 PC가 ADD의 주소를 가리키고 있습니다.

    IRQ 익셉션이 발생하면 하드웨어가 일단 MOV까지는 실행시킵니다. 그런 다음 링크 레지스터에 PC를 넣는 작업까지 해 줍니다.

     r14_irq = PC 
    

    아 그런데 MOV까지 실행 했으니까 SUB로 돌아가야 하는데 링크 레지스터가 엉뚱한 곳을 가리키네요. 보정해 줍시다.

    r14_irq = r14_irq - 4
    

    이렇게 해서 왜 링크 레지스터에 -4를 하는지 밝혀 졌습니다.

    SWI와 Undefined Exception는 왜 LR을 그대로 쓸까요? 마찬가지로 예를 들어 볼께요.

    | Fetch (LR)  | Decode (LR-4)  | Execution (LR-8) |
    |  ADD        | SWI            | MOV              |
    

    Software Interrupt가 발생하는 순간의 모습은 이렇습니다. 바로 Decode에 SWI가 걸렸을 때 입니다. 앞에서 본 것 보다 한 클럭 일찍 예외가 발생하네요.

    지금 PC는 ADD의 주소를 가리키고 있으니까 앞에서와 같이 -4를 해버리면 무한 인터럽트에 빠질 태니까 LR 레지스터를 그냥 써도 되겠네요. :slight_smile:

    Undefined Exception도 Decode 단계에서 예외가 발생하나 봅니다. 어떤 명령어인지 찾아보다가 "이보게 내 사전에 그 명령어는 없네."하고 발생하는 거니까요.

    Data Abort 익셉션이 발생하면 LR에 -8을 빼서 보정합니다. 익셉션을 발생시킨 명령어를 가리키는 것인데 아마도 디버깅을 위해서가 아닌가 싶습니다.

    | Fetch (LR)  | Decode (LR-4)  | Execution (LR-8) |
    |  ADD        | SUB            | LDR              |
    
  • [x] 8. FIQ는 실제로 사용되는 예를 본적이 없는데, 사용되는 예제가 무엇일까요? [#49]

    리눅스에서는 사실 잘 사용하지 않는다. 뭐 굳이 예를들자면, Security쪽에서 주로 사용한다.

  • [x] 9. Interrupt처리 방법이 상당히 많은데 Linux에서는 다 지원하는가? [#50]

    커널에서 enable_irq와 disable_irq 같은 함수류들이 존재하므로 리눅스에서는 모두 지원한다고 보는 것이 맞을 것 같습니다.

  • [x] 10. Interrupt가 만약 굉장히 많이 걸린다면, 일정한 Queue가 있어서 다 저장하는 것인가? [#51]

    동일 interrupt가 여러번 발생하면 (예: 1us timer) 발생횟수 여부는 알 수 없다. (SW로 counter를 읽어보는 정도의 방법으로 판단 가능)

    Queue에 저장하는 것이 아니라 irq source별로 INTC가 status를 제공하며 ARM은 status가 clear될 때까지 interrupt handler를 순차적으로 호출한다.

  • [x] 11. Hardware적으로 같은 clock에 동시에 Interrupt가 들어올 수 가 있는가? [#52]

    IO는 모두 독립적이므로 당연히 동일 clock에 동시에 발생가능하다.

    e.g: Ethernet RX event + DMA completion event