반응형
오늘은 OS 개발을 위한 이론을 공부를 했다.
- 지식 정리
3장에서 다룰 내용
- OS를 구동할 프로세서에 대한 지식
- 64비트 프로세서의 내부 구조를 간략하게 설명하고, 운영 모드별 메모리 관리 기법의 공통점과 차이점을 살펴본다.
- 64비트 프로세서에는 크게 16비트, 32비트, 64비트 모드가 있으며, 각 모드에 따라 프로세서는 조금씩 다른 방식으로 동작합니다.
- OS 개발하려면 각 모드와 모드의 차이점을 알아야 합니다. 이는 직접 프로세서를 제어하고 모드를 전환할 때 필요한 초기화를 수행해야 하기 떄문이다.
3.1 운영모드
- 주변에서 사용하는 인텔 64비트 호환 프로세서(x86-64 프로세서)에는 크게 다섯 가지 운영 모드가 있다.
- 16비트의 리얼 모드
- 32비트의 보호 모드
- 64비트의 IA-32e 모드와 조금 낯선 시스템 관리 모드
- 가상 8086모드
- 각 모드에는 다음과 같은 특징이 있고, 컨트롤 레지스터와 인터럽트라는 특수한 이벤트를 통해 각 모드로 전환할 수 있습니다.
운영 모드 | 설명 |
---|---|
리얼 모드 | - 프로세서의 초기 상태로서 16비트 모드로 동작하며 8086 프로세서와 호환되는 모드 최대 1MD(2^20)의 주소 공간을 지원 |
보호 모드 | 32비트 모드로 동작하며 세그먼트, 페이징, 보호, 멀티태스킹 등의 기능을 제공하는 모드 4GB(2^32)의 주소 공간을 지원 |
IA-32e 모드 | 32비트 호환 모드와 64비트 모드의 두 가지 서브모드로 구성 16EB(2^64)의 주소 공간을 지원하는 모드 |
시스템 관리 모드 | 전원 관리나 하드웨어 제어 같은 특수 기능을 제공하는 모드 |
가상 8086 모드 | 보호 모드 내부에서 가상의 환경을 설정하여 리얼 모드처럼 동작하는 모드 |
- 64비트 모드를 지원하는 IA-32e 모드는 제조사에 따라 다르게 불려진다. -> 인텔에서는 IA-32e 모드로 표기, AMD에서는 Long Mode로 표기
- 앞으로 우리가 만들 64비트 멀티코어 OS는 전원 관리 기능이나 보호 모드에서 16비트 코드를 실행하는 기능을 지원하지 않으므로, 시스템 관리 모드와 가상 8086 모드를 제외한 세 가지 모드만 구현한다.
- 리얼 모드
- 64비트 서브모드(IA-32e 모드)
- 보호 모드
리얼 모드
프로세서가 어떤 상태 또는 모드에 있든 전원이 켜지거나 리셋되면 프로세서는 리얼 모드로 진입합니다.
- 리얼 모드는 과거의 16비트 프로세서와 동일하게 동작하며, 이후에 설명할 BIOS의 여러 기능을 사용할 수 있습니다.
- BIOS는 디스크 읽기 및 쓰기 기능부터 그래픽모드로 전환하는 기능까지 여러가지 기능을 제공하며, 이를 사용하면 별도의 디바이스 드라이버를 제작하지 않고도 원하는 작업을 수행할 수 있다.
- 리얼모드에서 하는 작업
- OS 이미지를 디스크에서 메모리로 복사하여, 보호 모드로 변경하는 것
-> 해당 작업은 어셈블리어로 처리해야 한다.
- OS 이미지를 디스크에서 메모리로 복사하여, 보호 모드로 변경하는 것
보호 모드
리얼모드에서 IA-32e 모드로 전환하려면 반드시 보호 모드를 거쳐야 한다.
- 보호 모드는 32비트 윈도우나 리눅스 OS가 동작하는 기본 모드이다.
- 최대 4G(2^32) 주소 공간을 제공한다.
- OS의 필수 기능으로 자리 잡은 보호, 멀티태스킹, 세그먼테이션, 페이징 등의 기능을 하드웨어적으로 지원한다.
- 제리스터와 자료구조가 다양하다.
IA-32e 모드
- IA-32e 모드에는 서브모드로 32비트 호환 모드와 64비트 모드가 잇다.
- 32비트 호환 모드는 보호모드와 같은 기능을 수행
- 최대 16E(2^64)의 주소 공간을 제공하며 레지스터 수도 보호모드보다 많다.
- 32비트 호환 모드에 있는 것처럼 동작하므로, 32비트 코드를 그대로 실행할 수 있다는 점이다.
운영모드 사이의 관계와 운영 모드의 전환
- 특정 모드에서 다른 모드로 전환하는 작업은 현재 동작 중인 모드에 따라 차이가 있습니다.
- 리얼 모드에서 보호 모드로 전환하는 상황처럼 다른 모드를 거치지 않고 바로 전환 가능한 경우도 있지만, 리얼모드에서 IA-32e 모드로 전환하는 상황과 같이 리얼모드 -> 보호모드 -> IA-32e를 거쳐서 전환해야 하는 경우도 있다.
- 전원이 켜지거나 리셋되면 프로세서는 리얼 모드로 진입한다.
- 리얼모드에서 전환할 수 있는 유일한 모드는 공식적으로 보호 모드뿐이다.
- 보호모드에서는 가상 8086모드, IA-32e모드, 다시 리얼 모드로 전환할 수 있다.
- 시스템 관리 모드는 모든 모드에서 진입할 수 있다.
운영모드와 레지스터
OS를 개발하는 관점에서 운영 모드는 크게 16비트 모드, 32비트 모드, 64비트 모드 세 가지로 나눌 수 있따.
- 보호모드의 레지스터
![]() |
![]() |
---|---|
- OS를 개발하는 과정에서 큰 비중을 차지하는 레지스터는 범용 레지스터, 세그먼트 레지스터, 컨트롤 레지스터 3가지입니다.
- 위 3가지 레지스터를 제외한 레지스터는 사용빈도가 극히 적거나 직접 레지스터에 값을 설정할 일이 거의 없다.
범용 레지스터 (General Purpose Register)
- 운영 모드와 가장 관계가 깊은 레지스터이다.
- 범용 레지스터는 계산, 메모리 어드레스 지정, 임시 저장 공간 등의 목적으로 사용합니다.
- 범용 레지스터의 수는 프로세서가 지원하는 운영모드에 따라 다르다.
- 16비트와 32비트 모드를 지원하는 x86 계열(인텔 32비트 호환 프로세서)은 8개, 64비트 모드를 지원하는 x86-64 계열은 16개의 범용 레지스터가 있다.
세그먼트 레지스터 (Segment Register)
- 16비트 레지스터로 어드레스 영역을 다양한 크기로 구분하는 역할을 합니다.
- 모드마다 조금씩 역할에 차이가 있습니다.
- 리얼모드에서는 : 단순히 고정된 크기의 어드레스 영역을 지정하는 역할만 한다.
- 보호모드, IA-32e모드에서는 접근 권한(Privilege Level), 세그먼트의 시작 어드레스와 크기 등을 지정하는 데 사용되기도 한다.
- 이러한 기능을 통해 -> 커널 영역을 보호하는 기능을 쉽게 구현 가능
- 메모리 관리 기법에는 크게 세그먼테이션 기법과 페이징 기법 두 가지가 있다.
- 이중에서 세그먼트 레지스터를 통해 주소 공간을 구분하는 방식 : 세그먼테이션
컨트롤 레지스터(Control Register)
- 현재 운영 중인 모드의 특정 기능을 제어하는 레지스터이다.
- x86 프로세서에는 CR0, CR1, CR2, CR3, CR4의 5개의 컨트롤 레지스터가 존재하며, x86-64 프로세서에는 CR8이 추가되어 총 6개의 컨트롤 레지스터가 있다.
- 각 컨트롤 레지스터의 역할
운영 모드와 메모리 관리 기법
x86과 x86-64 프로세서에서 지원하는 메모리 관리 기법은 크게 두가지이다.
- 주소 공간을 특정 영역으로 나눈다.
- 세그먼테이션(Segmentation) - 전체 영역을 원하는 크기로 나누어 관리하는 방식
- 페이징(Paging) - 일정한 단위로 잘라진 조각을 모아 원하는 크기로 관리하는 방식
리얼 모드의 메모리 관리 방식
- 리얼 모드는 최대 1MB까지 주소 공간을 사용하며 세그먼테이션만 지원한다.
- 리얼 모드에서 세그먼트 크기는 64K로 고정이고, 세그먼트의 시작 어드레스는 세그먼트 레지스터에 직접 설정한다.
- 리얼 모드는 페이징을 사용하지 않으므로 물리 주소로 변환하는 방식이 비교적 간단하다.
- 리얼 모드의 세그먼테이션은 세그먼트 레지스터의 값에 범용 레지스터의 값을 더하는 방식으로 동작합니다.
보호 모드의 메모리 관리 방식
- 세그먼테이션과 페이징을 모두 지원한다.
- 보호 모드의 세그먼테이션은 리얼 모드의 세그먼테이션보다 많은 기능을 제공한다. 또한 보호 모드의 세그먼테이션은 세그먼트 레지스터에 세그먼트의 기준 주소를 직접 설정하는 대신 디스크립터 자료구조의 위치를 설정하는 방식으로 바뀌었습니다.
- 세그먼트 레지스터의 명칭도 세그먼트 디스크립터를 선택한다는 의미에서 세그먼트 셀렉터로 변경되었다.
- 디스크립터는 메모리 영역의 정보를 저장하는 자료구조로 여러 종류가 있다. 그중 세그먼트에 대한 정보를 나타내는 디스크립터를 세그먼트 디스크립터라고 부른다.
- 세그먼트 디스크립터에는 세그먼트의 시작 어드레스 크기와 권한, 타입 등의 정보가 있다.
- 접근하는 어드레스가 세그먼트의 크기를 넘어서는 경우 예외
- 보호 모드에서 주소를 계산하는 방법은 리얼 모드와 마찬가지로 세그먼트 레지스터의 기준 주소에 범용 레지스터의 값을 더해서 구합니다.
부팅과 부르 로더
- 모든 OS는 동등하게 512바이트 크기의 작은 코드에서 시작된다.
- 이는 부트 로더(Boot loader)라고 불리며, OS의 나머지 코드를 메모리에 복사해 실행시킵니다.
부팅과 BIOS
부팅(Booting)은 PC가 켜진 후에 OS가 실행되기 전까지 수행되는 일련의 작업 과정을 의미합니다.
부팅 과정에서 수행하는 작업에는
- 프로세서 초기화(멀티코어 관련 처리 포함)
- 메모리와 외부 디바이스 검사 및 초기화
- 부트로더를 메모리에 복사하고 OS를 시작하는 과정
- 부팅 과정 중 하드웨어와 관련된 작업을 BIOS가 담당하며, BIOS에서 수행하는 각종 테스트나 초기화를 POST라고 부릅니다.
- BIOS는 메인보드에 포함된 펌웨어(Firmware)의 일종으로, 이름 그대로 입출력을 담당하는 작은 프로그램이다.
- 보통 PC 메인 보드에 롬(ROM)이나 플래시 메모리로 존재하며, 전원이 켜짐과 동시에 프로세서가 가장 먼저 실행하는 코드입니다.
- BIOS는 부팅 옵션 설정이나 시스템 전반적인 설정 값(Configuration)을 관리하는 역할도 겸하고 있으며, 설정 값으로 시스템을 초기화하여 OS를 실행할 수 있는 환경을 만듭니다.
- BIOS는 예전 16비트 환경부터 디스크 입출력과 비디오 모드 전환 등 여러 가지 기능을 제공해왔습니다.
- BIOS는 예전 16비트 환경부터 디스크 입출력과 비디오 모드 전환 등 여러 가지 기능을 제공해왔습니다.
- BIOS에서 제공하는 기능은 인터럽트를 통해 사용할 수 있으며, MS-DOS 같은 과거의 16비트 OS는 BIOS의 기능에 많이 의존했습니다.
- MINT64 OS도 OS이미지를 메모리에 복사하고 GUI 모드로 변환할 때 BIOS의 기능을 사용합니다.
- 우리에게 가장 중요한 것은 부트 로더 이미지를 메모리로 복사하는 단계입니다.
- 부트 로더는 부트스트랩 코드라고도 불리며 우리가 BIOS에서 처음으로 제어를 넘겨받는 부분입니다.
- 루트로더는 플로피 디스크나 하드 디스크 등 저장 매체의 가장 앞부분에 존재합니다.
- PC는 디스크나 플래시 메모리 등 다양한 장치로 부팅할 수 있으므로 BIOS는 POST가 완료된 후 여러 장치를 검사하여 앞부분에 부트로더가 있는지 확인합니다.
- 부트 로더가 존재한다면 코드를 0x7C00 어드레스에 복사한 후 프로세서가 0x7C00 어드레스부터 코드를 수행하도록 합니다.
- 부팅 가능한 모든 장치를 검사했는데도 부트 로더를 찾을 수 없다면 BIOS 'Operating System Not Found'와 같은 메시지를 출력하고 작업을 중단합니다.
- 부트 로더가 디스크에서 메모리로 복사되어 실행되었다는 것은 BIOS에 의해 PC가 정상적으로 구동되었다는 것을 의미합니다.
- 부트로더는 크기가 512바이트로 정해져 있습니다.
- 4장과 5장에서 우리가 만들 부트로더 역시 OS이미지를 디스크에서 메모리로 복사하는 역할만 수행합니다.
- 이러한 사태를 방지하려면 BIOS는 첫 번째 섹터에 있는 데이터가 부트 로더인지 확인해야 합니다.
- 이를 위해 BIOS는 읽어들인 512바이트 중에 가장 마지막 2바이트의 값이 0x55, 0xAA인지 검사해서 부트로더인지 확인합니다.
- 읽은 데이터가 0x55, 0xAA로 끝나지 않는다면 데이터로 인식하고 부팅 과정을 더 진행하지 않습니다.
부트 로더 제작을 위한 준비
반응형
'운영체제' 카테고리의 다른 글
OS 개발 - 4일차 (64비트 프로세서 OS 개발) (1) | 2024.01.29 |
---|---|
OS 개발 - 1일차 (2) (0) | 2024.01.25 |
운영체제 개발 - 1일차 (0) | 2024.01.25 |