Thief of Wealth
article thumbnail

2장에 이어서 더 자세한 ARM의 특징들을 알아보자.


1. ARM Core의 데이터 흐름도 (폰 노이만 ver)


지금은 위 그림보다 하버드 구조를 더 많이 쓴다.

하버드와 폰 노이만 아키텍쳐의 차이점을 이전 글에서 자세히 설명했다!




2. ARM Date Types


ARM 프로세서 내부에서는 어떤 데이터 타입들의 전송이 일어나고 있을까


- Byte : 8bit

- HalfWord : 16bit

- Word : 4byte = 32bit

- Doubleword : 64bit


- Intruction Sets : ARM 명령어는 무조건 32bit로 고정!

- Core Instructions : Core 명령어들은 58



3. ARM Register Set




- ARM의 Register개수는 몇개일까. RISC니까 32개? 아니다. 더많다. 37개이다. (32bit짜리가 37개)

- 어떻게 37개가 나오느냐

pc : 1개

CPSR: 1개

SPSR: 5개

일반모드 register: 30개


- 다른 레지스터도 있는데?

그건바로

Banked Register : 

일반 사용자모드가 아니고, 슈퍼유저 모드일때 (특권 모드)일때 사용되는 register를 Banked register라고 한다.

ARM은 유저모드에 따라서 사용하는 register가 다르다!

Banked Register의 개수는 시스템에 따라 다르다.



- pc는 명령어 주소값을 저장하는 register인건 알겠는데, CPSR, SPSR은 뭐여


- PSR ( Program Status Register ) 프로그램 상태 레지스터


- CPSR

Current PSR.

즉, 현재 코어의 내부 동작을 모니터링하고 제어하는 것에 사용되는 레지스터!

제어(Write)는 특권모드일때만 할 수 있고 일반적으로는 read만 가능


- SPSR

Saved PSR

즉, 프로세스의 동작 모드가 변경될 때 사용!

현재 CPSR의 내용을 저장하는 역할을 한다.


아래는 CPSR의 구조도이다. 즉, SPSR은 아래의 CPSR의 내용을 저장한다.

- PSR flag

위 CPSR 그림 좌측의 이산적인 비트들읠 집합이 보인다.

ALU가 연산한 결과의 특성을 기록해 놓는 녀석들이다.


차례대로 살펴보자

1) N : ALU의 결과값이 Negative인가?

2) Z : ALU의 결과값이 0인가?

3) C : ALU의 결과값에 캐리가 발생했는가? (자리값이 1증가했는가)

4) V : ALU의 결과값이 오버플로우인가

5) Q : ALU의 결과값이 오버플로우 & 포화상태(Saturation) 인가? 


예를 들어보자


ex) ALU에서 다음과 같은 연산이 일어난다고 가정하자

char a = -3; // 11111101

a += 4; //  11111101 + 00000100

11111101 + 00000100 = 1 00000001 이므로 캐리값 발생! C flag를 1로 바꿔줌.


char b = 127; // 01111111 

b += 1; //  01111111 + 00000001

01111111 + 00000001= 10000000 이므로 오버플로우!. char타입은 127까지 저장가능한데 값이 128되버림.

V flag 1로 바꿈!


- PSR Interrupt Masks

위 CPSR 그림 우측에 Interrupt Masks가 보이는가?

저건 interrupt 발생여부를 제어하는 녀석이다. (interrupt 는 hw에 의해 발생한다는거 기억)

I = 1 이면 IRQ 인터럽트 무효화!

F = 1 이면 FIQ 인터럽트 무효화!


값이 0 이면 허용!



- 프로세서 Mode

위 CPSR 그림에 Control 부분에 Mode가 보이는가


저 영역에는 프로세서의 모드가 저장되는데 모드에는 다음과 같은 것들이 있다.



뭔 소린지 1도 모르겠으니 정리를 해보자.


1) Abort (abt) : 메모리 접근 실패시 에러발생용.


2) Fast interrupt / FIQ (fiq) : IRQ와 비슷하지만, 보다 더 빠른 데이터 전송 및 처리를 할 수 있도록 하는 interrupt모드.

( 긴급할때, 중요할때 빠른 처리를 위해서 사용함 )


3) Interrupt Request / IRQ (irq) : 일반적인 regular interrupt모드


4) Supervisor (svc) : 특권을 갖는 User모드 => CPSR레지스터를 write할 수 있다. (Sw적으로 system call로 요청됨)


5) System (sys) : 프로세스가 리셋될때 진입, OS의 커널이 제어한다.


6) Undefined (und) : 프로세스가 알아먹을 수 없는 명령어를 만났을때 진입.


7) User (usr) : 일반 사용자 모드 (default 값임)



(참고)

앞장에서 PipeLine은 언급하지 않고 지나갔는데,

알다시피 ARM은 RISC 아키텍쳐를 사용하고, RISC 아키텍쳐는 PipeLine 실행에 최적화 되어있다.

PipleLine은 알아서 하시고!

pipeLine으로 인해 발생할 수 있는 나쁜놈들이 있는데 그것을 살펴보자.


Hazard


1) Structural Hazard

- 자원요구의 충돌로 인해 발생한다. 

-

- 위 그림처럼 pipeline형으로 진행되고 있을 때, 서로다른 프로세스가 1개의 자원에 접근하려는 신호를 "동시에" 하면서 Structural Hazard가 발생한다.


- 자원을 충분히 많이주면 해결된다.

- 또는 메모리공간을 분리시켜놓으면 된다.


2) Data Hazard

- RAW (read after write) 에서 발생한다

- 프로세스가 연산하고 그 값을 새로이 업데이트 (write) 하기전에, pipeLine 밑에있는 녀석이 먼저 읽어버려서 발생한다.

- 그때는 오류발생하거나, 다음 프로세스를 좀더 지연시키는 방법도 있지만,

- 다른 방법으로는 ALU에서 연산후 결과값을 바로 사용하려는 다음 프로세스에게 전달해 버리는 것이다. Forwarding(Bypassing) 이라고도 한다.



3) Control Hazard

- pipeLine방식을 쓸 때 pc가 바뀌면서 실행되는데, Branch나 Jump같은명령어를 쓰면 pc를 강제적으로 바꿔준다.

- 한마디로 조건에 맞으면 다음 pc실행하고, 아니면 건너뛰어서 다른 pc를 실행하는 것이다.

- 근데 일반적으로는 조건문을 판단하는 과정까지, pc는 계속 다음 명령어를 pipeline으로 실행한다.

- 그러다가 조건문이 false라서 아주 멀리있는 pc로 이동하게 되면?

- pipeline으로 미리 실행중이던 프로세스들은 실행하던거 다 취소하고, 새로 바뀐 pc를 위해 다시 작업해야한다.

- 즉, pc가 어디로 갈지 결정될때 까지 다음 명령어를 미리 실행하고 있기 때문에 발생하는 것이 제어 hazard다.


해결방안으로는

- pc결정값이 나올때 까지 지연시키거나

- ALU삽입하여 pc결정값을 빨리 알게 해주거나

- static한 예측방법으로써 무조건 true 또는 false 이라고 고정적으로 예측하여 찍을 수도 있고

- dynamic한 예측방법으로써 이전 branch값이 false이면 다음것도 false로 true 였으면 true로 예측해서 찍는 방법이있다.





'개발 > 마이크로컴퓨팅' 카테고리의 다른 글

6. ARM 명령어  (0) 2019.04.18
5. ARM 디버깅  (0) 2019.04.18
4. ARM 프로세서에 대해 2  (0) 2019.04.18
2. ARM은 뭘까  (0) 2019.04.17
1. 임베디드 시스템이란 무엇일까  (0) 2019.04.17
profile on loading

Loading...