운영 모드
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를 막을 수 있음
'Miaaaaaaaaong > OS' 카테고리의 다른 글
[MintOS]MintOS 제작을 위한 환경 세팅 (0) | 2023.07.11 |
---|---|
[MintOS]MintOS 목표 및 기초 (0) | 2023.07.10 |