티스토리 뷰

[Operating System]

참고 도서

- 만들면서 배우는 OS 커널의 구조와 원리

- OS구조와 원리 (OS개발 30일 프로젝트)

 

보안을 공부하는데에 있어서 기초가 되는 OS를 공부하기 위해 효율적으로 공부하는 방법을 알아보던 중 직접 제작해보라는 추천이 있었고, 실제로 OS를 한번 만들어 보고싶은 마음에 프로젝트 아닌 프로젝트를 시작하게 되었다. 주 참고 도서는 '만들면서 배우는 OS 커널의 구조와 원리 - 김범준' 이며 부수적으로 참고하는 도서로는 'OS 구조와 원리 (OS 개발 30일 프로젝트) – 카와이 히데미' 를 선택했다. 이 두 책을 선택한 이유는 먼저 공부해본 형의 추천과 인터넷 리뷰를 참고해 선택했다. 카와이 히데미 저자의 책은 저자가 직접 개발한 툴을 이용해 OS를 만들어야 한다는 점이 아쉬웠으나 OS에 필요한 여러 가지 개념들이 수록되어 있어서 참고 도서로 선택하게 되었다.

 

1. OS 개발의 시작

컴퓨터의 전원 버튼을 눌러서 컴퓨터가 켜지면 가장 먼저 메인보드의 ROM에 저장되어 있는 바이오스의 부트스트랩(부트 프로그램)을 실행한다. 이 부트스트랩은 POST(Power On Self Test) 작업을 하는데 컴퓨터에 장착된 각 부품들이 이상 없는지 테스트를 진행한다. 이 테스트가 종료되면 디스크의 첫 번째 섹터인 MBR (Master Boot Record) 영역을 읽어 Main Memory(RAM)으로 로드한다. 일반적으로 MBR 영역이 실행되면 부팅 가능한 파티션을 찾고 해당 파티션의 시작점으로 이동해서 본격적으로 OS의 부팅이 시작된다. 책에서는 첫번 째 과정으로 디스크의 MBR 영역에 코드를 쓰고 해당 디스크로 부팅 한다.

 

이런 과정을 거치기 위해서는 몇 가지 도구가 필요한데 책에서는 NASM과 Rawrite, Floppy Disk 를 소개하고 있다. NASM은 어셈블리어를 기계어로 번역해주는 어셈블러이고, Rawrite – raw write - 는 디스크에 어떠한 구조도 없이 속 된 말로 '생'으로 혹은 '날 것' 그대로 써주는(write) 프로그램이다. 문제는 Floppy Disk 인데 요즘에 Floppy Disk 를 사용하는 사람은 거의 없을 뿐 아니라 컴퓨터나 노트북에 드라이브 역시 없다. 그래서 나는 Floppy Disk 대신 USB 메모리를 이용해서 진행하려고 한다.

 

NASM 말고 평소에 많이 사용했던 GCC를 이용하고 싶었으나 어셈블리어 문법이 조금 다르기도 하고, NASM 을 이용해 많이 사용한다는 저자의 추천(?)에 의해 NASM 을 그대로 사용하기로 했다. 나중에 익숙해지면 GCC 로 번역하는 작업까지도 생각하고 있다.

 

Rawrite는 Floppy Disk에 코드를 작성하는 프로그램이므로 USB 메모리에 쓰기에는 적합하지 않다. 따라서 Rawrite 는 사용이 불가능해서 다른 방법을 찾아 보니 리눅스에 있는 'dd' 명령어를 사용하면 USB 메모리에 바이너리 값을 입력할 수 있었다. 'dd' 명령어는 리눅스에는 기본으로 있는 명령어지만 윈도우에는 없으므로 윈도우용 'dd'를 다운받아서 설치해주어야 한다.

 

이제 NASM 과 dd를 설치하고 USB 메모리에 코드를 작성하고 부팅하는 부분 까지 설명하도록 하겠다.

 

1.1 NASM 설치

[그림 1]

 

http://www.nasm.us 에 접속해서 latest stable version 을 클릭한다.

 

[그림 2]

 

[그림 3]

 

[그림 2] [그림 3] 순서로 진행하면 되는데 마지막에는 exe파일이나 zip 파일중 하나만 다운받으면 된다. 쉽게 진행하기 위해 installer를 다운받아서 설치하도록 하겠다.

 

[그림 4]

 

설치 중 기본 경로가 임시 폴더로 잡혀있기 때문에 반드시 경로를 본인이 편한 경로로 설정해주어야 한다. 본인은 C:\nasm 으로 설정했다.

 

[그림 5]

 

nasm 은 명령 프롬프트에서 실행해야하기 때문에 편하게 사용하기 위해서는 환경 변수에 nasm 경로를 등록해두어야 한다.

 

[그림 6]

 

환경 변수에 등록한 뒤 명령 프롬프트에서 nasm 을 입력하고 엔터했을 때 [그림 6]과 같이 에러 메세지가 출력되면 설치가 성공적으로 된 것이다.

 

1.2 dd for Windows 설치

[그림 7]

 

http://www.chrysocome.net//download 에 접속하고 마찬가지로 가장 최신 버전 중 beta가 아닌 안정적인 버전을 선택해서 다운받는다. 압축을 풀면 나오는 dd.exe 파일을 C:\Windows\System32 폴더에 복사한다. 이렇게 하는 이유는 'dd' 역시 명령 프롬프트에서 실행해야하는 프로그램인데 환경 변수를 따로 추가하지 않고 실행하기 위해 본래 추가되어 있는 System32 폴더에 넣어둔 것이다. 따로 압축 푼 경로를 환경 변수에 추가해주어도 무방하다.

 

2. 어셈블리어 작성

메모장 같은 텍스트 에디터를 열어서 어셈블리어를 작성하면 된다.

[그림 8]

 

어셈블리어 코드는 [그림 8]과 같이 작성하면 된다. 저작권에문제가 될까 싶어 코드를 그대로 올리지 않고 그림 파일로 올린다.

 

코드 내용에 대한 것은 추후에 자세히 설명하도록 하겠다. 간단하게 동작하는 것만 살펴보면 화면에 'ABC123'을 출력하고 배경색을 설정한 다음 MBR이 에러 없이 정상 동작하도록 시그니처를 추가해준 것이다. 이 시그니처 값이 다를 경우 에러메세지가 출력되면서 정상동작이 되지 않기 때문에 필요하다. 'dw 0xAA5' 가 시그니처를 추가해준 것이다.

 

작성을 완료 했으면 boot.asm로 저장한다. 이 때 확장자 asm은 딱히 의미가 있는건 아니고 어셈블리어 코드가 저장되어있는 파일은 확장자를 .asm 으로 저장하는게 관습적으로 행해진다.

 

[그림 9]

 

이제 nasm을 이용해서 기계어로 번역해야하는데 명령어는 [그림 9]와 같다.

-f 옵션은 파일의 형식(format)을 지정해주는 옵션인데 bin 은 바이너리 파일이라는 의미로 어떠한 형식없이 우리가 작성한 코드 형태 그대로 저장되도록 하기 위해 넣어준 옵션이다. '-o boot.bin' 옵션은 번역한 아웃풋 파일을 boot.bin 이라는 이름으로 저장하겠다는 옵션이다. [그림 9]의 boot.txt는 본인이 방금 저장한 어셈블리 코드 파일이다.

 

마지막으로 dd를 이용해서 USB 메모리에 bin 파일을 작성해주면 된다.

[그림 10]

 

명령어는 "dd if=[boot.bin 경로] of=\\.\[USB Drive]: bs=512 count 1" 이다. 관련 자료를 찾던 중 'Stack Overflow' 에 [그림 10]과 같은 글이 있었다. "드라이브 문자를 잘못 입력할 경우 부트섹터가 파괴되어 많은 데이터를 잃을 수 있다" 는 내용이다. 그러니 반드시 USB 메모리의 드라이브 문자를 확인하고 입력하길 바란다.

 

[그림 11]

 

[그림 11]과 같이 boot.bin의 경로와 드라이브 문자를 정확하게 입력해주면 USB 메모리에 우리가 작성한 bin 파일이 작성된다. 메세지가 [그림 11]과 같이 출력되면 정상적으로 작성된 것이다.

 

3. USB 메모리로 부팅

[그림 12]

 

바이오스에서 부팅 순서를 USB 메모리를 최상위로 올려주고 부팅하면 [그림 12]와 같이 우리가 작성한데로 출력이 되는것을 확인할 수 있다. 이 것은 우리가 운영체제의 도움 없이 최초로 실행시킨 코드인 만큼 앞으로의 진행에 있어서 큰 도약이라고 책에서는 설명하고 있다. 다음번에는 앞에 작성한 어셈블리 코드를 디컴파일하고 분석해보도록 하겠다.

신고

'##컴퓨터 기본 > #OS' 카테고리의 다른 글

[OS기초] 커널 로드  (0) 2016.02.01
[OS 기초] 코드 분석  (0) 2016.01.18
[OS 기초] OS 개발의 시작  (1) 2015.12.29
댓글
댓글쓰기 폼