Miaaaaaaaaong/OS

[MintOS]MintOS의 여러가지 운영 모드와 레지스터

Recarrdo 2023. 7. 11. 20:47

운영 모드

MintOS에는 꼭 필수적으로 들어가야할 운영 모드 3가지가 있는데, 아래와 같다.

  • 리얼 모드
  • 보안 모드
  • IA-32e 모드

리얼 모드

프로세서가 처음 진입하는 모드이다.

OS 이미지를 디스크에서 메모리로 복사하여 보호 모드로 변경하는 일을 한다.

 

보호 모드

리얼 모드에서 IA-32e 모드로 변환하기 위해 꼭 거쳐야하는 모드이다.

 

IA-32e

이 모드엔 서브 모드인 32 호환 모드와 64 호환 모드가 있다.

32비트 호환 모드는 보호 모드처럼 작동한다.

이 모드 때문에 64비트에서 32비트 프로그램들을 사용할 수 있는 것이다.

 

레지스터

레지스터 수가 많아지면 계산이 빨라짐

아래는 대표적인 레지스터를 나열한 것이다.

  • RIP 레지스터는 현재 수행 중인 명령의 주소를 가리키는 레지스터
  • 범용 레지스터는 계산, 메모리 주소 지정, 임시 저장 공간 등 여러 목적으로 사용(ax....)
  • 세그먼트 레지스터는 주소 영역 구분(CS, DS, SS, ES, FS, GS)
  • 컨트롤 레지스터는 운영 모드를 변경하고 특정 기능을 제어하는 역할(CR)

 

메모리 관리 기법

세그멘테이션: 세그먼트 레지스터를 사용하여 케이크를 원하는 크기로 조각 내듯이 사용하는 방식

페이징: 이미 조각난 빵을 조합하여 만들듯이 사용하는 방식

  • 페지잉은 CR3 컨트롤 레지스터가 관련 정보를 저장함
  • 4KB 3단계 페이징
  • 어드레스 변환 과정은 아래와 같음(레지스터 수가 많아져도 원리는 같아서 후는 생략함)
    • CR3가 페이지 디렉터리의 베이스 주소가 됨
    • 페이지 엔트리는 페이지 테이블의 베이스 주소가 됨
    • 테이블 엔트리는 4KB 페이지의 베이스 주소가 됨
    • 페이지 내 오프셋에서 물리 주소를 할당 받음
    • 이는 보호 모드에서고 IA-32e는 레지스터가 많아서 중간에 PML4도 추가됨 (다른 것은 다 똑같음)

 

운영 모드에선 페이징이 지원되지 않는다.

  • 세그먼트 레지스터에 세그먼트 베이스 주소를 직접 설정

보호 모드에선 페이징과 세그멘테이션 둘 다 지원

  • 디스크립터 자료구조의 오프셋을 설정

디스크립터는 메모리 영역의 정보를 저장하는 자료구조

세그먼트 디스크립터는 세그먼트에 대한 정보를 나타내는 디스크립터

  • 세그먼트의 시작 주소, 권한, 타입 등 포함
  • GDT(Global Descriptor Table)에 모여있다.(메모리에 있다)

CPL은 DPL 보다 같거나 높아야함(숫자 표현으론 작아야함) (0 ~ 3)

 

EXB 필드는 해당 페이지에서 명령어가 실행되는 것을 막는 필드

  • 페이지 속석에 이를 설정함으로써 BOF를 막을 수 있음