3. 운영모드와 레지스터

os를 개발하는 관점에서 운영모드는 크게 16비트모드, 32비트모드, 64비트 모드 3가지로 나뉠 수 있음.

범용레지스터

  • 계산, 메모리 어드레스 지정, 임시저장 공간등의 목적으로 사용함
  • 범용레지스터의 수는 프로세서가 지원하는 운영모드에 따라 다름
  • 범용 레지스터의 수가 늘어나면 수행속도가 개선됨
  • 관련된 값을 레지스터에 모두 올려서 계산함으로서 메모리에 접근을 최대한 줄이는 것
  • 이와 비슷한 효과는 함수 호출에도 그대로 적용됨
  • 다수의 범용레지스터에 함수 파라미터를 넣어 넘겨줌으로서 스택영역의 메모리에 접근하는 시간과 스택을 정리하는 시간을 줄일 수 있음
    <x86-64프로세서의 범용레지스터와 용도>

  • 64비트 범용레지스터는 하위 32비트, 16비트, 8비트의 크기로 구분하여 접근할 수 있고, 레지스터에 접두사를 붙여 접근하는 크기를 표시함

<운용모드에 따른 범용레지스터의 크기와 이름>

  • 리얼모드에서 16비트 크기 이하의 레지스터만 접근 가능한 것으로 표시되어 있지만, 오퍼렌드 크기 접두사(Operand-Size Prefix, 0x66)를 사용하거나 어드레스 크기 접두사(Address-Size Prefix, 0x67)를 사용하면 32비트 레지스터도 접근할 수 있음
  • 운영모드에 따라 접두사를 결합하는 방법에는 일정한 규칙이 있으며 사용한 접두사에 따라 명령어가 처리하는 오퍼랜드나 어드레스의 크기가 달라짐

<운영모드와 접두사에 따른 오퍼랜드 및 어드레스의 크기>


-> 리얼모드에서
REX접두사:X,
operand-size prefix: N,
address-size prefix: N
일 때
유효한 operand 크기가 16bit,
유효한 address 크기가 16bit
이다.

여기서 한가지 의문점은 과연 접두사가 의미하는 것이 무엇이며
어떻게 사용하는지 이다.
원래 사이즈가 64bit 레지스터인데 접두사를 붙임으로서 확장, 축소 해서 사용하는 것인지
따로 각 접두사별 레지스터가 존재하는 것인지

  • 그림을 보면 IA-32e모드의 기본 오퍼랜드 크기가 32비트로 표시되어 있음
  • IA-32e 64bit모드는 64비트모드 이므로 오퍼랜드의 크기와 어드레스트의 크기가 모두 64비트인 것이 당연함
  • IA-32e모드의 기본 오퍼랜드의 크기는 32비트, 기본 어드레스의 크기는 64비트로 설계되어 있음
  • 기본 오퍼랜드의 크기가 32비트로 설계되어 있어서 64비트 어드레스를 표현할 수 없다.
  • 그래서 RIP상대 어드레스라는 새로운 어드레스 계산방식이 도입되었음
  • RIP상대 어드레스 레지스터는 현재 수행중인 명령의 어드레스를 가리키는 레지스터
  • RIP레지스터의 값과 32비트 오퍼랜드를 통해 64비트 주소공간을 나타낼 수 있다.
  • 하지만, 기본 오퍼랜드의 크기가 32비트이므로 RIP레지스터의 값에 상위 2G와 하위 2G범위 까지만 표현할 수 있는 단점이 있음
  • 64비트 오퍼랜드와 관계있는 REX접두사를 사용해 범위를 벗어나느 어드레스에 접근해야 함
  • REX접두사를 사용하면 오퍼랜드의 크기가 64비트가 되고 따라서 64비트 어드레스를 모두 표현할 수 있음

여기서 REX접두사가 뭘까?

<RIP상대 어드레스와 메모리 영역>


->RIP는 현재 수행중인 명령의 어드레스를 가리키는 reg.
RIP가 옮겨다니며 -2G ~ +2G의 범위 만큼 RIP상대
어드레스에 접근이 가능한 것

세그먼트 레지스터

  • 16비트 레지스터로 어드레스 영역을 다양한 크기로 구분함

  • 리얼모드에서는 단순히 고정된 크기의 어드레스 영역을 지정함

  • 보호모드와 IA-32e모드에서는 접근권한, 세그먼트의 시작 어드레스와 크기등을 지정하는데 사용되기도 함
    <x86-64프로세서의 세그먼트 레지스터>

  • 세그먼트 레지스터의 역할은 주소 공간을 목적에 따라 구분한는 것이며, 주소공간을 구분하는 방법은 메모리 관리기법과 깊은 관계가 있음.

  • 메모리관리 기법에는 크게 세그먼테이션과 페이징 두가지가 있음. 이중 세그먼트레지스터를 통해 주소공간을 구분하는 방식이 세그먼테이션이다.*

컨트롤레지스터

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

<x86-64프로세서의 컨트롤 레지스터>

  • 컨트롤 레지스터는 리얼모드와 보호모드일 때 32비트 크기이다.
  • IA-32e모드에서는 64비트로 확장되지만 일부 제약 사항이 있다.
    • CR0와 CR4, CR8레지스터에서는 64비트 영역을 모두 사용할 수 있다.
    • CR2레지스터의 경우는 64비트 영역을 모두 사용할 수 있다.
    • CR3레지스터는 비트40부터 51까지 모두 0으로 설정해야 한다.

<컨트롤 레지스터의 구조>

  • 각필드는 저마다 특정기능을 활성화/비활성화 하며, 현재 운영모드에 따라 필수 필드와 옵션필드가 달라진다.
  • 컨트롤 레지스터의 특정기능은 해당비트를 1로 설정해도 충분하지만, 특정기능은 1로 설정하기 전에 프로세서가 사용할 자료구조를 미리 준비해야한다.

'Project > OS' 카테고리의 다른 글

6. Bootloader 만들기  (0) 2019.07.11
5. 부팅과 부트로더  (0) 2019.07.11
4. 운영모드와 메모리 관리기법  (0) 2019.07.11
2. 운영모드  (0) 2019.07.11
1. ubuntu18.04.2 LTS개발환경 세팅  (0) 2019.07.11

+ Recent posts