본문 바로가기

MINT64 OS 개발

(16)
8장. A20 게이트를 활성화하여 1MB이상 영역에 접근 Ⅰ. IA-32e 모드 커널과 메모리 맵 IA-32e 모드 커널을 실행하기 위한 준비 작업으로, PC에 설치된 메모리가 64MB이상인지 검사하고, IA-32e 커널이 위치할 영역을 모두 0으로 초기화하는 작업을 수행한다. 부팅 과정을 완료하고 나서, 1MB 이상의 메모리에 정상적으로 접근이 되는지 확인하고 이를 위해 어떤 작업이 필요한지 살펴본다. 1. 1MB 이상의 메모리에 접근해야 하는 이유 부트 로더에 의해 커널 이미지가 메모리에 로딩되는 어드레스는 0x10000이다. 만약, 1MB 이하의 어드레스 중에서 비디오 메모리가 위치한 0xA0000 이하를 커널 공간을 사용한다고 가정하면, 보호 모드 커널과 IA-32e 모드 커널의 최대 크기는 (0xA0000 - 0x10000)로 576KB가 된다. 커널..
7장. C언어로 커널 작성 업로드 안한 기간동안 OS는 꾸준히 공부하는 중에 있다. 양이 생각보다 많아, 모든 정보를 언제 다 업로드할지 걱정되지만 꾸준히 정리하여 업로드를 진행해보겠다. Ⅰ. C 소스 파일 추가와 보호 모드 엔트리 포인트 통합 보호 모드 커널 디렉터리에 C 소스 파일을 추가하고 자동으로 포함하여 빌드하는 방법에 대해 작성되어 있다. 환영 메시지를 출력하는 C코드를 추가하여, 보호 모드 엔트리 포인트와 통합해볼 예정이다. 1. C 소스 파일 추가 여러 소스 파일에서 공통으로 사용한 헤더 파일 생성 해당 헤더 파일은 보호 모드 커널 전반에 걸쳐 사용한다. 기본 데이터 타입과 자료구조를 정의하는데 사용한다. 1.Kernel32의 하위 디렉토리인 Source에 Types.h 파일을 생성한다. #ifndef __TYPES..
6. 32비트 보호 모드로 전환 Ⅰ. 개요 리얼 모드에서 보호모드로 전환하려면, 크게 6단계를 거쳐야 한다. 상위 2단계는 보호 모드 전환에 필요한 자료구조를 생성하는 단계이다. 나머지 4단계는 생성된 자료구조를 프로세서에 설정하는 단계이다. 세그먼트 디스크립터 생성 → GDT 정보 생성 → 프로세서에 GDT 정보 설정 → CR0 컨트롤 레지스터 설정 → jmp 명령으로 CS 세그먼트 셀렉터 변경과 보호 모드로 전환 → 각종 세그먼트 셀렉터 및 스택 초기화 (32bit 보호 모드) → 보호 모드 커널 실행 보호 모드에서 반드시 생성해야 하는 자료구조는 세그먼트 디스크립터와 GDT이다. Ⅱ. 세그먼트 디스크립터 생성 1. 개요 세그먼테이션 기법에서 세그먼트의 정보를 나타내는 자료구조를 의미한다. 세그먼트: 메모리 공간을 임의의 크기로 나..
5. OS이미지 메모리에 복사 Ⅰ. 1024 섹터 크기의 이미지를 메모리로 복사하는 코드 1. C언어 #include int main(){ int iTotalSectorCount = 1024; int iSectorNumber = 2; int iHeadMumber = 0; int iTrackNumber = 0; // 실제 이미지를 복사할 address(물리주소) char* pcTargetAddress = (char*) 0x1000; while(1){ //전체 섹터 수를 하나씩 감소시키면서 0이 될때까지 섹터를 복사 if(iTotalSectorCount == 0){ break; } iTotalSectorCount = iTotalSectorCount - 1; // 1섹터를 읽어들여서 메모리 어드레스에 복사 // BIOSReadOneSect..
4. 32비트 보호 모드로 전환 Ⅰ. 개요 리얼 모드에서 보호모드로 전환하려면, 크게 6단계를 거쳐야 한다. 상위 2단계는 보호 모드 전환에 필요한 자료구조를 생성하는 단계이다. 나머지 4단계는 생성된 자료구조를 프로세서에 설정하는 단계이다. 세그먼트 디스크립터 생성 → GDT 정보 생성 → 프로세서에 GDT 정보 설정 → CR0 컨트롤 레지스터 설정 → jmp 명령으로 CS 세그먼트 셀렉터 변경과 보호 모드로 전환 → 각종 세그먼트 셀렉터 및 스택 초기화 (32bit 보호 모드) → 보호 모드 커널 실행 보호 모드에서 반드시 생성해야 하는 자료구조는 세그먼트 디스크립터와 GDT이다. Ⅱ. 세그먼트 디스크립터 생성 1. 개요 세그먼테이션 기법에서 세그먼트의 정보를 나타내는 자료구조를 의미한다. 세그먼트: 메모리 공간을 임의의 크기로 나..
3. OS이미지 메모리에 복사 1. 1024 섹터 크기의 이미지를 메모리로 복사하는 코드 (1) C언어 #include int main(){ int iTotalSectorCount = 1024; int iSectorNumber = 2; int iHeadMumber = 0; int iTrackNumber = 0; // 실제 이미지를 복사할 address(물리주소) char* pcTargetAddress = (char*) 0x1000; while(1){ //전체 섹터 수를 하나씩 감소시키면서 0이 될때까지 섹터를 복사 if(iTotalSectorCount == 0){ break; } iTotalSectorCount = iTotalSectorCount - 1; // 1섹터를 읽어들여서 메모리 어드레스에 복사 // BIOSReadOneSec..
2. 간단한 부트로더 제작 본 내용은 본인 공부에 대한 정리용으로, 자세한 내용이 포함되지 않음을 참고 바랍니다. Ⅰ. 부팅과 부트로더 1. 부팅과 BIOS 부팅(Booting): PC가 켜진 후, OS가 실행되기 전까지 수행되는 일련의 작업 과정이다. BIOS(Basic Input Ouput System) 부팅 과정 중, 하드웨어와 관련된 작업이다. 보통 PC 메인보드에 ROM이나 플래시 메모리로 존재한다. 전원이 켜짐과 동시에 프로세서가 가장 먼저 실행되는 코드이다. 부팅 옵션 설정이나 시스템 전반적인 설정 값을 관리하는 역할도 겸하고 있으며, 설정 값으로 시스템을 초기화하여 OS를 실행할 수 있는 환경을 만들어주는 역할이다. BIOS가 제공하는 기능은 인터럽트를 통해, 사용할 수 있다. POST(Power On Self Te..
1. 개요 & 환경 구축 본 내용은 본인 공부에 대한 정리용으로, 자세한 내용이 포함되지 않음을 참고 바랍니다. Ⅰ. 개요 64비트 멀티코어 OS 인 MINT64 OS를 개발할 예정이다. 큰 순서는 부트로더 -> 32bit OS -> 64bit OS 로 진행된다. 64bit OS 개발 완료 후, 멀티코어 관련 기능을 추가해서 최대 16개의 코어를 지원하게 확장하고 GUI시스템까지 구현할 예정이다. Ⅱ. OS 개발 시, 필요한 지식 1. 하드웨어 지식 32bit에서 64bit로 바꾸는 작성이나 PC주변장치를 다루는 작업은 하드웨어에 대한 지식이 없으면 불가능하다. 다행히, 대부분의 내용은 하드웨어와 함께 제공되는 스펙문서에 존재한다. 스펙문서만 잘 구하면, 하드웨어를 모른다 하여도, 큰 문제가 발생하지 않는다. 2. 어셈블리어 사..