[10장. 64비트 모드로 전환하자.]를 읽다보니, kReadCPUID()함수를 어셈블리어로 작성했는데, 포인터를 다루더군요. 한번 정리할 필요가 있다고 생각되어 어셈블리어에서 포인터를 어떻게 다루는지 정리해보겠습니다. int main(){...DWORD dwEAX, dwEBX, dwECX, dwEDX; kReadCPUID(0x80000001, &dwEAX, &dwEBX, &dwECX, &dwEDX);..} 현재는 32비트 보호모드 상태이고, main문에서 CPU가 IA-32e모드를 지원하는지 알아보기 위한 함수(kReadCPUID)를 호출합니다.kReadCPUID는 어셈블리어로 작성되었습니다. 1 global kReadCPUID23 SECTION .text45 kReadCPUID:6 push ebp7 ..
Assembly로 작성된 EntryPoint.s에서 C로 작성된 kernel로 어떻게 넘어갈까? [ 그림1. C로 만들어진 kernel의 배치 ] Enty point의 코드는 0x10200 전까지만 채워져 있다. 그리고 Entry point의 마지막 명령어가 jmp $이기 때문에 무한 루프를 돌고 있다. C로 만들어진 kernel을 주소 0x10200에 올리고 Entry point의 마지막 명령어를 jmp dword 0x08: 0x10200으로 수정하면 kernel이 작동할 수 있을 것이다. 하지만 이러한 계획에는 3가지 제약조건이 있다.1) C라이브러리 호출 불가2) 0x10200 위치에 kernel코드 배치3) kernel 코드는 순수한 바이너리 파일 1)번의 제약조건은 컴파일할 때, gcc에 옵션으..
부트로더가 하는 일은 별거없다. OS 이미지를 1MB이하의 메모리로 복사하기만 하면된다.이러한 코드는 부팅디스크의 첫번째 섹터(512byte)에 기록된다. 이를 MBR(Master Boot Record)라고 부른다. 우선은 최소한의 역할을 하는 부트로더를 만들어보자. 하는 일은 1. BIOS에 의해 부트로더로 인식되서 메모리에 올라가고2. 무한 루프를 돈다.* 아직은 OS이미지 복사 기능이 없다 BIOS에 의해 부트로더로 인식되는 일은 아주 간단하다. 512바이트의 마지막 2바이트에 0x55, 0xAA를 써넣기만 하면된다.코드는 아래와 같다. 코드는 nasm 컴파일러를 사용했다. 1 [ORG 0x00]2 [BITS 16]34 SECTION .text56 jmp $78 ti..
운영체제 만들기를 공부하다보니 배울 것이 참 많았다. 그래서 블로그로 정리해본다.우선 참고한 책은 [ 64비트 멀티코어 OS원리와 구조 ]이다.이 책의 개발환경은 윈도우에서 cygwin을 이용했다. 그리고 64bit환경을 지원하기 위해 x86-64 크로스 컴파일러를 만들어서 쓰고 있다.나도 시도해봤는데, 크로스 컴파일러 만들기에 실패했다. 나중에 알게된 사실인데 이미 gcc가 32, 64bit를 지원한다.굳이 cygwin을 쓸 필요가 없을 것 같아서, 나는 virtual box를 이용해서 개발할 예정이다.ubuntu 16.04 LTS, 64bit 운영체제를 깔아서 썼다. 그리고 nasm과 qemu도 깔아썻다. 설치는 아주 쉽다. 예) sudo apt-get install nasm, sudo apt-get..