Arm 구조 및 제어 - 2

2022. 5. 29. 18:57

예전에 공부하며 필기하던 내용 2번째.

이 이후 내용은 책필기 참조

 

 

11. 파이프라인
 - CPI(clock-cycle per instruction)
    명령어 하나를 처리하는데 소모되는 프로세스의 클럭수
    이상적인 cpi는 1이다(1이 될수록 좋다)

 - 파이프라인의 단계는 processor에 따라 다르고 고성능일수록 단계가 증가한다
    ex: fetch-decode-execute

12. 컴파일
 - 네이티브 컴파일: host=target일때
 - 크로스 컴파일: host!=target일때 host에서 생성한 결과물을 target에서 동작할수 있게 설계하는 것
 - ex
    c(.c), c++(.cpp), asm(.s)를 각각 알맞은 컴파일러로 오브젝트 파일(.o) 생성
    오브젝트파일(.o)와 라이브러리(.a)를 링커로 연결한다->실행파일(.axf혹은 .elf등등)생성
    이 실행파일에는 bin과 디버깅을 위한 심볼(주소등)을 포함하였다
    실행파일을 역어셈아면 디버깅을 위한 asm이 생성된다(이일을 전문으로 하는 사람이 리버스엔지니어)
    transfer를 사용하여 실행파일에서 바이너리파일(.bin)을 빼낼수 있다
 => 위 도구 모두를 통합한 것을 툴체인이라고 한다.

13. 컴파일 결과물의 동작
컴파일러의 종류와 결과물





---
※.
cpu: 컴퓨터 중앙처리장지(프로세서) - core+co-processor, MMU, cache등으로 구성된다
gpu: 그래픽용 cpu
soc: 통합용 cpu - cpu, i-rom, i-ram, 주변장치 등으로 구성된다
ap:스마트폰용 프로세서(소형기기용 프로세서)
mpu: 마이크로프로세서, cpu와 각종 주변장치를 위한 제어기(주변제어장치, peripheral controller)들의 결합 
apu: amd사에서 cpu와 gpu의 기능을 융합한 cpu

※.
리스트: 검색과 변경(삽입, 삭제)시 사용
스택: 리스트의 특별한 형태, 지역변수와 매개변수를 저장한다. LIFO(last in first out)방식
큐: 리스트의 특별한 형태, 프로세스의 실행을 관리하기 위해 사용한다.
    fifo(first in first out), 원형큐 방식등이 있다.
원형큐: 큐의 끝에 도달하면 밀어내기 작업을 해서 다음공간을 확보해야하는데, 이러한 시간을 줄이고자 큐를 원형으로 구성한 구조

14. operating mode 와 exception
 - operating mode(op mode): 프로세서가 현재 어떤 권한을 가지고 어떤 종류의 작업을 하고 있는지를 나타냄
    종류
     - user mode: 응용프로그램 수행시, 유일한 비특권 모드(hw접근불가)이다
     - svc(supervisor) mode: 시스템 자원(hw등)관리 가능, 즉 커널이나 드라이버를 처리한다.(전원 on시 기본동작모드)
     - fiq: 빠른인터럽트처리
     - irq: 인터럽트처리
     - abort mode: 명령이나 데이터를 rw할때 오류발생시(I/D관련)
     - undefined mode: 명령어를 디코딩시, 정의되지않은 명령을 수행하라고 할시(I관련)
     - system mode: user mode와 같지만, 특권모드이다(arm v4이후부터 지원)

    제어방식
     - arm의 psr레지스터중 cpsr의 0~4bit(M)으로 제어(사용자의 경우)
     - exception vetor table을 이용해 자동으로 제어된다

    operating mode를 위한 레지스터(책 32.p 하단 참조)
     - r0~r8과 r15는 공용, r13~r14는 개별, 나머지는 모드에 따라 공용/개별이다
     - 단, r13, r14, r15는 특수한 기능으로 사용한다.
     - r15(공용): pc, 프로그램이 수행하는 주소값을 저장
     - r14(개별): lr(link register), 서브루틴 발생시 돌아갈 원래위치(주소)를 저장
     - r13(개별): sp(stack pointer), 프로그램에서 사용되는 스택의 위치를 저장
     - 위의 레지스터외에도 psr(program status register)가 있다
     - 1개의 cpsr(current program status register, user와 system모드)와
     - 5개의 spst(saved program status register, 나머지 모드들)가 있다
 - exception(커널에서는 trap이라고도 한다)
    외부의 요청이나 요류로 인해 프로그램의 동작을 멈추고 프로세스의 동작모드를 변경, 정해진 프로그램을 실행하여 요청이나 오류를 처리하는 것
    즉, 정상적으로 진행되는 프로그램의 동작을 방해하는 모든 것이 예외사항이다.
     => arm에서는 '예외사항발생-EVT이동-알맞은 상황으로 분기-해당 프로그램 실행'의 과정으로 이루어진다
 - exception vetor table



 => fiq의 경우 evt상위에 프로그램이 있어서 분기명령(b)없이 처리루틴을 바로 실행할 수 있다.(다음라인을 바로 실행)

15. arm프로세서의 명령어(asm)
 - 종류
    32bit arm명렁어
여기는 다시 친다

 - 규칙: ATPCS(arm thumb procedure call standard)
    ① 함수 실행시 처음 4개의 인자(argument)는 r0~r3를 통해 전달되며, 따라서 매우 빠르게 전달된다(남은 인자는 스택에 전달된다)
    ② return값은 r0를 통해 전달된다(단, return값이 32bit를 초과하면 low:r0, high:r1에 저장되에 전달된다)
    ③ 4개이상의 인자전달시 stack이 사용되므로 성능감소가 일어날 수 있다.
    ④ 외부에서 함수를 사용하려면 함수를 .globl로 선언해야한다(책 41.p하단 참조)

 - 명령어 상세종류(37~39.p)
    ① 산술 및 논리연산 명렁어: ADD, SUB, AND, ORR등
    ② 비교연산명령어(cpsr의 flag를 변경시킨다): CMP, CMN, TST등
    ③ 조건필드(조건)명령어: EQ, NE, NV등, ex: cmp(비교)/addeq(위의 결과가 같다면 더한다)
    ④ 
     - b(branch): pc기준 +-32mb 범위내에 있는 주소로 이동한다(보통 라벨을 사용한다[:])
     - bl(branch with link): r14(lr)에 되돌아갈 주소(현재 주소) 저장+branch
    ⑤ psr transfer 명령: mov와 기능이 같으나, psr에 관한 명령이다
     - MRS r0, cpsr: 상태레짓값을 r0에
     - MSR cpsr_c, #0x80: 상수값을 상태레짓 c필드에
    ⑥ single register data transfer 명령
     - ldr: 로드레지스터, 값을 읽어 레지스터에 전송(적재, 싣다, 가져오다)
     - str: 스토어 레지스터, 레지스터의 값을 메모리로 전송
      ⓐldr r0,[r1,#4]: r1의 주소+4위치의 data를 읽어 r0에 저장/str r0,[r1,#4]: r0의 값을 r1의 주소+4위치에 저장
      ⓑldr r0,[r1,#4]!: !는 오토업데이트, r1의주소+4위치의 data를 읽어 r0에 적재, 이후 r1=r1+4
      ⓒldr r0,[r0],#4: 많이 쓰임, r1의 주소의 data를 읽어 r0에 적재, 이후 r1=r1+4 
      ⓓ특수한 경우
        LDRB r0,[r1],#1: r1의 주소에서 1바이트만큼의 데이터를 r0에저장 이후 r1=r1+1
        LDRH r0,[r1],#2: r1의 주소에서 halfword만큼의 데이터를 r0에 저장 이후 r1=r1+2
        => 즉, 아무옵션 없는 default의 값이 word단위의 전송이다
        => 만일 LDRB r0,[r1],#2라면 데이터가 끊기고, LDRH r0,[r1],#1이면 데이터가 중복된다
    ⑦ 그밖에 swap명령(메모리 영역의 값과 레지스터의 값을 서로 바꿀때, 세마포어 구현시 사용), swi명령(usermode에서 다른 모드로 전환시 사용, swi명령), ded, field, map, 덧붙임 명령어등이 있다.

 

16.
 => api를 읽을 때 보통 operand: 상수, rn/rd: 레지스터, {cond}: 조건필드, <oeration>: 명령이고, 기타적으로 {size}: 크기, [-fields]: 필드값(혹은 flag)등등이 있다.

+ Recent posts