일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- vi
- #Qt Creator
- #IntelManual
- Overwatch League SaberMetrics
- BEST of the BEST
- KASAN
- C++11
- Find
- vim
- ftz
- 오버워치
- libpcap
- #
- FTZ 레벨2
- #MINT64 #Sqix
- >
- Sqix
- #Best of the Best #OS #MINT64 #Sqix
- command
- 오버워치 세이버메트릭스
- libtins
- linux
- Network
- vi 외부 명령어
- 인터럽트
- #IntelManual #segment Descriptor #세그먼트 디스크립터 #MINT64 #Sqix
- Today
- Total
Sqix
64bit 멀티코어 OS 제작하기 [3] - 1 : 부트로더와 makefile 본문
이번 글에서는 BIOS와 부팅에 관련된 내용을 다룹니다.
OS를 가동시키기 위해서는 먼저 컴퓨터를 부팅해야 합니다. 부팅 단계에서는 프로세서, 메모리, 외부 I/O 장치를 초기화하고, 부트 로더를 메모리에 복사하며, 이를 기반으로 OS를 가동하는 과정을 거칩니다.
우리가 만들고자 하는 OS는 다음과 같은 부팅 과정을 거칩니다.
======================================================================================================================
[BIOS 영역]
(1) 전원 On (H/W에서 user input을 받아야 합니다.)
(2) POST 단계
1) 프로세서 초기화
2) 메모리 검사 및 메모리 초기화
3) 주변 장치 검사 및 초기화
(3) 부트 로더 이미지를 메모리에 복사 (0x7C00 주소에 복사)
[OS 영역]
(1) 부트 로더 단계
1) OS 이미지를 1MB 이하의 메모리로 복사
2) 보호 모드(32bit kernel)로 전환
(2) 32비트 커널
1) 64bit kernel을 1MB 이하의 메모리로 복사
2) IA-32e 모드(64bit kernel)로 전환
(3) 64비트 커널
1) 멀티코어 초기화
2) 멀티태스킹 모듈 초기화
3) 메모리 관리 모듈 초기화
4) 주변 장치 초기화 (I/O 장치 및 외부 저장 장치)
5) 그래픽 모드로 전환
6) 응용프로그램 실행
======================================================================================================================
여기서 BIOS란, 메인보드에 ROM 혹은 플래시 메모리로 존재하며 부팅 설정 옵션, 시스템 설정 값 등을 지정할 수 있고, 지정된 값으로 시스템을 초기화하여 OS를 실행할 수 있도록 합니다. 최근에는 UEFI라는 GUI를 적용하여 사용자들이 사용하기 보다 편리하게 만들어 제공하고 있는 추세입니다. BIOS가 진행하는 가장 중요한 일 중 하나는 바로 부트 로더 이미지를 메모리에 복사하는 역할입니다. 그럼 여기서 부트 로더란 무엇일까요?
알아보기 전에 앞서, 컴퓨터는 하드웨어와 소프트웨어로 구성되어 있습니다. 우리가 컴퓨터를 이용하고자 할 때, 먼저 무엇을 하나요? 바로 하드웨어 조립입니다. 메인보드에 CPU, RAM, VGA, Power, 등을 꽂아 넣습니다. 그 후에는 우리가 만들고자 하는 OS와 BIOS가 필요합니다. 하지만, 이들만 있다고 바로 컴퓨터를 구동할 수는 없습니다. BIOS는 특정 위치에 있는 메모리에만 엑세스하여 그 위치에 있는 코드만을 작동시킵니다(0x7C00). 즉, 이 위치에 우리가 원하는 것들을 로드해주는 프로그램을 작성하여 넣는다면 OS(S/W)와 H/W를 연결해 줄 수 있습니다. 이것이 바로 부트 로더입니다.
부트 로더는 최상위 섹터에 존재하는데, 이 섹터를 MBR(Master Boot Record)라고 하고, 크기는 512byte(모든 섹터의 단위크기)로 구성됩니다. 매우 작은 공간을 가지기 때문에, 간결한 ASM 코드를 이용해 작성하고, 정형화된 기능(OS 이미지를 메모리로 복사하고 제어 권한을 부여)만을 수행합니다. 또한, 특별한 검사 루트를 가지기 어렵기 때문에 마지막 2바이트를 검사하여 해당 값이 0x55, 0xAA인지 체크하여 인증이 완료되면 부팅 과정을 진행하고, 아니라면 데이터 취급하여 진행을 하지 않습니다.
이제 부트 로더에 대해 알아보았으니, 부트 로더 제작을 진행해 봅시다. 한승훈 저자님의 책에서는 이클립스를 이용하였지만, 저는 Qt Creator라는 IDE를 이용하여 진행하겠습니다.
원활하게 진행하기 위해서 root권한이 아닌 디렉토리를 제작합니다. 또한, Makefile 기반 시스템을 사용하기 위해서 프로젝트를 만들 때 다음과 같은 방법을 사용합니다.
- File -> New file or project -> Import Existing Project -> 만들어 놓은 디렉토리 선택(여기서는 MINT64) -> 진행
그 후, 필요한 디렉토리를 생성해 냅니다.
QT에서는 디렉토리 하위에 있는 파일을 파싱하여 프로젝트에 추가하기 때문에, 폴더를 추가하려면 파일을 생성해야 합니다. 이제 하나씩 파일들을 만들어 보겠습니다. 먼저 makefile을 생성해 봅시다. QT는 Makefile 및 어셈블리 파일 생성을 지원하지 않기 때문에 우선 vim에서 작업하도록 하겠습니다. (C 인라인 어셈은 아마 가능할 겁니다.)
esc - :wq를 눌러 저장하고 나옵니다. makefile의 역할은 간단하게 빌드 및 삭제 관리를 해 줄 수 있도록 하는 파일입니다. 이제 최상위 디렉토리에 makefile을 생성하였으니, 부트 로더 디렉토리에 makefile을 생성하겠습니다.
마찬가지로 저장하고 나가 줍니다.
현재까지는 dependency에 맞는 파일이 없기 때문에, 당연하게도 빌드 에러가 나는 것이 정상입니다.
이제 여기까지 왔으니, dependency에 맞는 파일들을 생성해 보겠습니다.
'MINT64 OS ' 카테고리의 다른 글
64bit 멀티코어 OS 제작하기 [3] - 3 : 부트로더 화면 제어 (0) | 2018.05.14 |
---|---|
64bit 멀티코어 OS 제작하기 [3] - 2 : 가장 기초적인 부트 로더 제작 (0) | 2018.05.14 |
64bit 멀티코어 OS 제작하기 [2] - 2 : 메모리 관리 기법 (0) | 2018.05.10 |
64bit 멀티코어 OS 제작하기 [2] - 1 : 운영 모드와 레지스터 (0) | 2018.05.08 |
64bit 멀티코어 OS 제작하기 [1] : 환경 설정 (0) | 2018.05.07 |