정보공간_1

[6기 강북 홍진우] 64비트 멀티코어 OS#2 - 레지스터 분석 및 역할 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강북 홍진우] 64비트 멀티코어 OS#2 - 레지스터 분석 및 역할

알 수 없는 사용자 2014. 9. 12. 19:46

엘리트멤버 6기, 강북 멤버십 23-1기 홍진우입니다.

무더운 여름이 가시고 어느덧 가을로 접어들었네요! 환절기 건강 유의하시기 바랍니다 ^^

그럼 두번째 포스팅 시작합니다!!!




 첫번째 포스팅에는 64비트를 개발하려면 어떤 것들이 필요하고, 기본적인 운영은 어떤 분류로 이루어지는지에 대한 포스팅을 했었는데요.  금번 포스팅에서는  64비트 멀티코어는 어떤 레지스터들이 존재하며 구체적인 역할이 무엇인지 대해 알아보도록 하겠습니다.


 마찬가지로 기준이 되는 코어는 Intel 64Bit 호환 프로세서(x86-64 프로세서) 입니다.



*레지스터란?

 레지스터는 프로세서 내부에 있는 작은 저장 공간으로, 연산, 제어, 상태 등의 목적으로 사용되는 메모리 저장소 입니다. CPU에 내장, 혹은 가장 근접해있는 메모리 저장소이기에 RAM/하드 디스크 등과 같은 보조 기억 장치보다 속도가 현저히 빠르지만 CPU 아키텍쳐 구현의 한계로 용량이 매우 적습니다.



* 레지스터의 접두사(Prefix)와 접미사(Postfix)

  각 레지스터의 이름에도 고유 규칙과 의미가 부여되어 있습니다.

 64비트 범용 레지스터는 대부분 RAX, RBX와 같이 'R'로 시작하는 레지스터 명을 가집니다.

 32비트 범용 레지스터는 EAX, EBX, R8D, R9D등의 'E'  접두사, 'D' 접미사를 가집니다.

 16비트 범용 레지스터는 AX, BX, R8W, R9W처럼 접두사가 없거나 'W'접미사가 붙습니다.

 또한 상위 비트, 하위비트가 레지스터가 따로 존재하는 있는 경우, 상위비트를 포함하는 레지스터는 'H' 접미사, 하위비트를 포함하는 레지스터는 'L' 접미사가 붙습니다.




1. 각 운영모드 별 레지스터(Register)

  64비트 운영체제에는 지난번 포스팅에서 언급한대로 운영체제 모드가 다수 존재합니다. 보호모드, IA-32e 모드, 리얼모드, 시스템 관리 모드, 가상 8086모드들이 있습니다. 각 모드별로  이용하게 되는 레지스터들의 차이점이 존재합니다. 이중 보호모드와 IA-32e레지스터를 주목해 보겠습니다.


   1-1. 모드별 레지스터

 x86-64 프로세서에 존재하는 레지스터들은 목적에 따라 프로그램 실행 기본 레지스터, 시스템 관련 레지스터, 실수연산 및 SIMD 관련 레지스터로 나누어 볼 수 있습니다.


 존재하는 레지스터들을 목적에 따라 나누자면, 프로그램 실행 관련 레지스터,시스템 관련 레지스터, 실수 연산/SIMD 관련 레지스터 이렇게 3가지 종류로 나누어 볼 수 있습니다.

  아래의 그림은 보호모드와 IA-32e에서 사용되는 레지스터를 보기 쉽게 나열한 것입니다.

[보호 모드의 레지스터]


[x86-64IA-32e모드의 레지스터]


 위의 두 가지 모드를 비교해보면, 공통적인 부분과 서로 다른 부분이 존재합니다. 주의깊게 관찰해 보시면 범용 레지스터 부분의 종류와 크기가 다른 것을 알 수 있습니다. 이는 각 모드가 지향하는 기능과 연관이 있습니다. 보호모드는 32비트를 기반으로 하여 동작하는 모드이고, IA-32e모드는 32비트, 64비트 두 가지 서브모드로 동작하는 점에서 범용 레지스터 구조가 다른 이유를 유추해 보실 수 있습니다.


 이와 같이, x86-64는 각 모드별로 사용하는 레지스터가 차이가 있으며, 해당 목적과 기능에 따라 유연하게 사용 가능한 레지스터가 조정됩니다.


2. 용도 별 레지스터 분류

 이렇게 x86-64프로세서에는 다양하고 수많은 레지스터들이 존재합니다. 그렇지만 개발적 관점에서 주목해야할 레지스터의 종류는 '범용 레지스터(General Purpose Register)', '세그먼트 레지스터(Segment Register)', '컨트롤 레지스터(Control Register)' 이렇게 세 가지로 분류되어 집니다.



   2-1. 범용 레지스터(General Purpose Register)

  범용 레지스터는 운영 모드와 직접적으로 관련이 있는 레지스터으로 연산, 메모리 주소값 지정, 임시 데이터 저장 등의 용도로 쓰입니다.  우리가 16비트/32비트/64비트 운영체제라 부르는 것은 범용 레지스터의 데이터 크기(WORD)와 깊은 관련이 있습니다.(호환 모드의 경우  하위 호환성을 위해 WORD보다 더 낮은 크기의 Register를 사용합니다.)

 범용 레지스터의 수가 늘어나면 늘어 날 수 록 메모리 근접성으로 인해 명령 수행 속도가 개선됩니다. 하지만 레지스터 갯수의 한계로 모든 연산을 레지스터에서 LOAD/STORE 하기 힘듭니다. x86-64 프로세서에는 총 16개의 범용 레지스터가 있습니다.(32비트 호환 프로세서의 경우애는 8개가 존재합니다.)


[x86-64 범용 레지스터의 종류와 용도]



 이러한 특징을 가지는 범용레지스터는 각 운영모드 모두 공통적으로 같은 공간을 사용하고 있습니다. 하지만 각 모드에 따라 사용하는 영역과 갯수에 차이가 있습니다.




   2-2. 세그먼트 레지스터(Segment Register)

  세그먼트 레지스터는 16비트의 크기를 가지며 주소 영역을 다양한 크기로 쪼개어 구분하는 역할을 합니다. 하지만 각 모드 별 세그먼트 레지스터는 조금씩 차이가 있습니다. 리얼 모드에서는 고정된 크기의 어드레스 영역을 지정하는 역할, 보호모드와 IA-32e 모드에서는 접근 권한, 세그먼트의 시작 주소의 크기등을 지정하는데 사용됩니다.


[x86-64 세그먼트 레지스터의 종류와 기능]



    2-3. 컨트롤 레지스터(Control Register)

   컨트롤 레지스터는 운영 모드를 변경하고, 현재 운영 중인 모드의 특정 기능을 제어하는 레지스터입니다. x86은 CR0~4, x86-64 프로세서에는 CR8이 추가되어 총 6개의 컨트롤 레지스터가 있습니다.


[x86-64 컨트롤 레지스터의 종류와 기능]

  컨트롤 레지스터는 프로세스의 운영 모드와 확장 기능을 제어하는 역할을 합니다. 각 비트 영역마다  제각기 특정 기능의 Enable/Disable 역할을 담당하고 있습니다. 각 기능을 Enable하기에 앞서 해당 기능에 필요한 자료구조나 상태가 갖춰지지 않을경우 System Failure가 뜨거나 자동으로 재부팅 동작을 실행되게 됩니다. 각 비트별 세부적인 내용에 대해서는 추후 포스팅에서 실제 동작과 관련지어 설명하겠습니다. 



  다음 포스팅은 64비트 멀티코어 OS#3 - 메모리 관리 기법입니다!!!