업데이트:

태그: ,

카테고리:

register file

  • C라는 HLL이 컴파일되면 컴파일러가 최적화된 assembly를 만들어낸다.
  • 이 assembly는 컴퓨터의 assembler를 구성하는 명령어와 1:1 매칭되어있다.
  • mips 32bit 아키텍처에서 이 assembly의 각 instruction은 32bit의 길이를 가지고 있다.


so what is register file

  • register file 정의 : 중앙 처리 장치 (CPU) 의 프로세서 레지스터 배열

음.. 이것만으로 확실히 와닿지 않는다. 프로세서 레지스터가 뭘까?

  • 프로세서 레지스터 정의 : 프로세서 레지스터 register는 기본적으로 프로세서가 사용하는 가장 빠른 곳에 위치해있다.
  • mips 아키텍처에서는 기본적으로 r0~r31, pc, lo, hi, coprocessor에 f0~f31 등이 있다.
  • context switching을 고려할때, 이 레지스터 파일의 값들을 저장할 방법을 커널에서 제공해야하는데, 이는 커널의 sched.h에 구현되어있다.


  • 레지스터의 종류에는 아래와 같은 것들이 있다.

  • registers(32개)

스크린샷 2023-03-14 16 37 20



  • Coprocessor 0번(4개)

스크린샷 2023-03-14 16 38 12



  • Coprocessor 1번(32개)

스크린샷 2023-03-14 16 37 53



  • mflo, mfhi, jal로 간접적으로 제어하는 레지스터 pc, hi, lo가 있다.

스크린샷 2023-03-14 16 38 28



  • 레지스터의 각 번호는 2진수로 변환하면 머신코드에서 그대로 사용된다.



레지스터는 32개 이상인데?

  • Operation 포맷 별로 어느 레지스터 종류를 사용할지 결정되어있다.

근데, 레지스터가 32개 이상인데, 레지스터를 5bit로 표현하는 명령어가 어떻게 레지스터를 인식하는게 궁금했는데,
각 명령어별로 어느 레지스터 종류에서 가져올지 사전에 정의되어있기에 가능한 것이다.

가령, add와 같은 J format 명령어는 각 rs, rt, rd가 32개의 레지스터($at, $v0 등)에서 가져오도록 약속되어있으며,
mtc1과 같은 부동소수 관련 명령어는 source register를 부동소수점을 가지고있는 coprocessor 1번에서 가져오도록 약속되어 있다.



Mips 코드의 변환과정

일단, 어셈블리로 작성된 코드가 어셈블러에 의해 머신코드로 바뀐다는 것은 알고 있다.
어셈블러는 어셈블리로 작성된 코드를 다시 최적화하는 과정을 거쳐(이때 $at가 사용된다.) 머신코드로 변환한다.
이를 직접 확인해보자.

코드예시

  • 단순히 a0, a1레지스터에 있는 값을 더해 v0레지스터로 넣는 코드이다.
.text #code영역 명시

.main: #main 함수
	add $v0, $a0, $a1


변환된 코드

스크린샷 2023-03-14 17 22 39

  • 이렇게 변환된 코드는 실행되면 운영체제가 가상메모리를 할당하고, 메모리에 프로세스로서 올라간다.


메모리에서 위치

  1. Mips는 빅엔디안이므로, 최상위 bit를 word address의 시작주소로 사용한다.
  2. Kernel level 메모리도 고려한다.
  3. stack의 시작주소는 0x7fffffff, heap의 시작주소는 static data가 프로세스 최초 실행 시 초기화 된 후의 주소부터 시작한다.
  4. text(code영역)은 0x00400000부터 시작한다.
  5. 프로세스 실행시 사용가능한 최대 메모리 공간은 2^32byte(4GB)이며, word address를 기반으로 표현하면 2^30(1GB)이다.
    • 여담으로, 32bit컴퓨터를 사용한 시절, OS가 최대 4GB까지만 인식했는데, 그 이유가 여기있다.

댓글남기기