에피소드 II: RV32I 명령어 집합

또 하나의 중요한 정보원은 물론 RISC-V 참조 매뉴얼입니다. 이 매뉴얼을 보면 RISC-V 표준에 여러 가지 종류가 있다는 것을 알 수 있습니다. 가장 단순한 것(RV32I, 즉 32비트 기본 정수 명령어 집합)부터 시작합시다. 그다음에 한 번에 하나씩 기능을 추가하는 방법을 살펴보겠습니다. 이것은 RISC-V의 매우 좋은 특징입니다. 명령어 집합이 모듈식이므로 아주 작고 자체적으로 완결된 커널에서 시작할 수 있으며, 이 커널은 표준을 준수하게 됩니다. 즉, 표준 도구(컴파일러, 어셈블러, 링커)로 이 커널용 코드를 생성할 수 있다는 뜻입니다. 그런 다음 저는 2장(13쪽부터 30쪽까지)을 읽기 시작했습니다. 130쪽의 표도 함께 보면, 실제로 서로 다른 명령어는 11개뿐입니다! (예를 들어 저는 AND, OR, ADD 등을 같은 명령어로 봅니다. 연산은 추가 매개변수일 뿐입니다.) 지금은 전체적인 그림만 파악하려는 것이므로, 아직 세부 사항까지 깊이 들어갈 필요는 없습니다. 이 11개 명령어를 전체적으로 살펴봅시다:

명령어 설명 알고리즘
Branch 조건부 점프, 6가지 변형 if(reg OP reg) PC<-PC+imm
ALU 레지스터 레지스터 3개를 사용하는 ALU 연산, 10가지 변형 reg <- reg OP reg
ALU 즉시값 레지스터 2개를 사용하는 ALU 연산, 9가지 변형 reg <- reg OP imm
Load 메모리에서 레지스터로, 5가지 변형 reg <- mem[reg + imm]
Store 레지스터에서 메모리로, 3가지 변형 mem[reg+imm] <- reg
LUI 상위 즉시값 로드 reg <- (im << 12)
AUIPC PC에 상위 즉시값 더하기 reg <- PC+(im << 12)
JAL 점프 후 링크 reg <- PC+4 ; PC <- PC+imm
JALR 레지스터 기준 점프 후 링크 reg <- PC+4 ; PC <- reg+imm
FENCE 멀티코어를 위한 메모리 순서 지정 (여기서는 자세히 다루지 않으며, 지금은 건너뜁니다)
SYSTEM 시스템 콜, 중단점 (여기서는 자세히 다루지 않으며, 지금은 건너뜁니다)

요약하면, 분기(조건부 점프), ALU 연산, 로드와 스토어, 그리고 무조건 점프와 함수 호출을 구현하는 데 쓰이는 두어 가지 특수 명령어가 있습니다. 메모리 순서 지정과 시스템 콜을 위한 함수도 두 가지 있습니다(하지만 이 두 가지는 당분간 무시하겠습니다). 좋습니다. 결국 명령어는 9개뿐이니 해볼 만해 보입니다... 이 시점에서 저는 모든 것을 이해하지는 못했으므로, 제가 가장 단순하다고 생각하는 부분(레지스터 파일과 ALU)부터 시작하고, 그다음에 명령어 디코더와 각 부분이 어떻게 서로 연결되는지 살펴보겠습니다.

다음