khann's IT와 경제 블로그

반응형

RISC-V 지난 글 보기

 

https://khann.tistory.com/2

 

RISC-V #1 - 개요

RISC-V 란? 2018년, 오픈소스에 적대적이던 마이크로소프트사 깃허브(Github)를 인수했다 . (8조원에 인수했다고 한다) 아래는 마이크로소프트의 깃허브 인수 기사 (https://www.coindeskkorea.com/%EB%A7%88%EC%..

khann.tistory.com

 

 

이번 시간에는 RISC-V와 ARM의 레지스터와 명령어 셋을 비교해보겠다.

 

 

ARM의 레지스터 셋(Register set)과 명령어 셋(ISA, Instruction Set Architecture)

 

Register

ABI Name

Description

Volatile

r0

 

Parameter, result, scratch register 1

Volatile

r1

 

Parameter, result, scratch register 2

Volatile

r2

 

Parameter, scratch register 3

Volatile

r3

 

Parameter, scratch register 4

Volatile

r4-10

 

-

Non-volatile

r11

 

Frame pointer

Non-volatile

r12

IP

Intra-procedure-call scratch register

Volatile

r13

SP

Stack pointer

Non-volatile

r14

LR

Link register

Non-volatile

r15

PC

Program counter

Non-volatile

▲ ARM의 32bit 레지스터 ( 16개의 integer register, 각 레지스터는 32bit)

 

 

Register

ABI Name

Description

Volatile

X0

 

Parameter/scratch register 1, result register

Volatile

X1-7

 

Parameter/scratch register 2-8

Volatile

X8-15

 

Scratch registers

Volatile

X16-17

 

Intra-procedure-call scratch registers

Volatile

X18

 

Platform registe

Non-volatile

X19-28

 

Scratch registers

Non-volatile

X29

FP

Frame pointer

Non-volatile

X30

LR

Link registers

Non-volatile

▲ ARM의 64bit 레지스터 ( 32개의 integer register, x31은 특수 인코딩 레지스터)

 

 

ARM에서는 육안으로만 봐도 비트에 따라(32bit와 64bit) 레지스터의 Reserved가 다르다.

 

일단 ARM의 32bit에서는  r11에 Frame Pointer, r13에 Stack Pointer, r14에 Link Register, r15에 Program Counter가 Reserved가 되어있다.

그러나 ARM이 64bit로 넘어오면서(ARMv8~) 레지스터의 구조가 새롭게 바뀌었다. 총 레지스터가 32개로 증가하고 각 레지스터는 기존 32bit에서 64bit로 증가했다.

가장 중요한 점은 Stack pointer가 General purpose register에서 제외(?)되고 x31레지스터에 인코딩 됐다.

 

ARM의 레지스터 셋이 32비트에서 64비트로 넘어오면서 이렇게 구조가 바뀔 수밖에 없었던 이유는 ARM의 명령어 셋의 OPCode가 상위 bit에 존재해서인 것 같다. 복잡하다.

 

 

ARM 32bit의 명령어 셋

한눈에 보기에는 눈에 잘 들어오지 않는 이 명령어 셋(ISA, Instruction Set Architecture) 표를 보면 상위 bit에 Opcode가 존재함을 알 수 있다.

 

또한 ARM 64bit 에서는 A64 명령어 셋(ISA, Instruction Set Architecture)을 사용하는데 기존 T32와 A32를 이용하는 방식이다.

 

A64 명령어 셋

 

 

 

 

RISC-V의 레지스터 셋(Register set)와 명령어 셋(ISA, Instruction Set Architecture) 

 

Register

ABI Name

Description

Saver

X0

zero

Harewired zero

-

X1

Ra

Return address

Caller

X2

Sp

Stack pointer

Callee

X3

Gp

Global pointer

-

X4

Tp

Thread pointer

-

X5-7

T0-2

Temporary registers

Caller

X8

S0/fp

Saved register / fram pointer

Callee

X9

S1

Saved register

Callee

X2.-11

A0-1

Fucntion arguments / return values

Caller

X12-17

A2-7

Function arguments

Caller

X18-27

S2-11

Saved registers

Callee

X28-31

T3-6

Temporary registers

caller

▲ RISC-V의 레지스터

 

 

bit에 따른 RISC-V 레지스터

 

 

RISC-V에서는 bit 수가 증가할 것을 미리 고려하고 레지스터를 설계한 모양이다.

총 지스터는 32개로 고정이고 각 레지스터는 코어의 bit 수에 따라 32bit, 64bit, 128bit로 증가한다.

 

 

 

RISC-V의 명령어 셋

 

RISC-V의 명령어 셋 

 

RISC-V의 명령어 셋(ISA, Instruction Set Architecture)도 마찬가지다. 

ARM과 다른 점은 바로 Opcode가 1bit부터 64bit 사이에 Reserved 되어있다.

그래서 bit 수가 증가하더라도 Opcode의 위치 변환 없이 상위 bit만 조정되면 된다.

 

 

 

RISC-V코어의 샘플elf 실행 중 레지스터 정보 확인

 

위 사진은 직접 RISC-V 64bit를 가상화로 구동시켜 Helloworld 같은 기본 C 프로그램을 만들어서 gcc로 컴파일한 후,

gdb로 디버그하는 과정 중에 register를 확인해 본 모습이다.

총 32개의 레지스터에 각 64bit씩 크기를 가진 레지스터들이 프로그램의 현재 실행 위치에 해당하는 레지스터를 지닌 모습이다.

 

 

요약하며,,

명령어 셋(ISA, Istruction Set Architecture)와 레지스터 셋(register set)를 통해 ARM과 RISC-V를 비교해보았다.

가장 큰 차이점은 Opcode가 reserved된 위치이다. ARM에서는 상위 bit에, RISC-V에서는 하위 bit에 위치해있다.

아마, ARM에서는 64bit, 128bit까지 고려를 많이 하지 않고 처음 ARM을 설계를 했으나 점점 64bit의 필요성이 생기자 억지로 구색을 맞춘 느낌이 난다.

그에 반해 RISC-V는 처음부터 bit의 증가에 유연하게끔 설계를 한 느낌이다.

 

이것만 보면 RISC-V는 정말 좋아 보인다. 오픈소스라는 가장 큰 장점과 bit에 유연하다. 이 2가지만으로도 ..

하지만 이미 ARM이 임베디드 기기를 장악해 최적화된 사용화된 수많은 전자기기들이 RISC-V로 바뀌기는 쉽지 않을 것 같다.

 

 

코어 아키텍처는 너무 어렵다.

오래전에 정리해놓은 자료인데 블로그를 작성하며 다시 상기시켜가며 글을 쓰다 보니 기억이 안 나 더 어려운 거 같다..

 

다음 시간에는 직접 가상화 머신을 통해 RISC-V를 구동하여 샘플 코드를 만들고 구동시켜보는 실습을 해보도록 하겠다.

 

 

피드백은 언제나 환영입니다.

 

반응형

이 글을 공유합시다

facebook twitter googleplus kakaostory naver