사막의 여우
Loading...
2016. 2. 5. 15:27

[OS 개발 7] 32비트 커널 로더(1) - 커널과 디스크 구조

1. 커널 로딩 드디어 OS의 핵심이라고 볼 수 있는 커널을 로딩하는 단계까지 왔습니다. 부트로더 포스팅만 해도 시간이 꽤 걸렸는데, 앞으로 커널 로더를 구현하는 부분은 얼마나 걸릴지 모르겠네요. 이전 포스트까지 디스크의 MBR 영역에서 부트 로더 프로그램을 읽어들이는 코드를 만들어 보았습니다. 그런데 512 바이트 영역은 내가 진짜 만들고자 하는 OS 프로그램을 넣어서 실행하기에는 굉장히 작은 공간이죠. 따라서 디스크 MBR 영역 다음의 영역에서 OS 커널 프로그램을 읽어들이고 이를 메모리 공간에 적재하는 과정이 필요합니다. 부트 스트랩 과정에서 5단계에 해당할 것입니다. 아래 링크를 통해 다시 한번 그 절차를 살펴보도록 하겠습니다. 2016/02/03 - [분석연구소/운영체제 구조] - [OS 만들기..

[OS 개발 6] 레지스터 세그먼트와 오프셋 개념

세그먼트:오프셋 주소 개념과 물리주소 변환 계산하기 레지스터의 종류에는 범용 레지스터, 세그먼트 레지스터, 컨트롤 레지스터 등, 다양한 역할을 담당하고 있는 레지스터들이 있는데, 이번 포스팅에서는 세그먼트 레지스터에 대해서 알아보도록 하겠습니다. 세그먼트 레지스터는 처음 인텔이 8086 CPU를 개발하는 과정에서 1Mb로 지정한 이유로 어드레스 버스와의 호환성 문제로 인해 사용하게 되었습니다. 어드레스 버스가 20비트가 필요함에도 불구하고, CPU는 16, 32, 64비트 단위로 호환되는 특성상, 20비트 어드레스 버스와 호환되기 어려웠기 때문입니다. 따라서 16비트 레지스터 2개를 이용하여 20비트 메모리에 접근하는 방식을 채택하였으며, 이를 위해 segment:offset 주소체계가 사용되었습니다. ..

2016. 2. 3. 14:12

[OS 개발 5] 부트로더의 개념 및 제작, 실행, 분석

1. 간단한 부트코드 입력 준비단계가 길었는데 이제 본격적으로 시작해보겠습니다. 우선, 우리는 부트스트랩의 첫 과정으로, 디스크의 첫 512b바이트를 읽어들이는 부분을 구현해야 합니다. 특별히 이 512바이트 영역을 MBR영역이라고 칭한다고 이전 포스트에서 언급했었습니다. 즉, 이번 포스팅에서 할 일은 부트 코드를 입력하고 부트 로더를 실행해 보는 것입니다. 그 전에, 제가 앞으로 포스팅할 때 설명하는 방식에 대해 간략하게 소개해 보도록 하겠습니다. 우선 아래 코드와 같이, 전체적인 코드와 함께 될 수 있으면 코드의 설명부분을 주석으로 처리할 것입니다. 만약 다음 포스팅 때 중복되는 내용이 있다면 건너뛸 수도 있습니다. 그리고 뒤에 [설명n]을 붙여놨습니다. 이는 해당 명령어가 무엇을 의미하는지 좀 더 ..

[OS 개발 4] 준비 단계(3) - 부트스트랩 과정

부트스트랩 대부분의 PC 부팅과정은 다음과 같습니다. 1. 컴퓨터가 구동되면 전기적 신호에 의해 메인보드에 이식되어있는 BIOS가 구동된다. 2. 이 후 POST 단계(Power On Self Test)를 통해 메모리와 하드디스크, 하드웨어를 자체적 으로 점검하기 시작한다. 3. CMOS 설정 정보를 읽어들이고 부팅에 필요한 정보를 획득한다. : CMOS는 현재 시간이나 하드웨어 정보(BIOS)를 보관하고 유지하기 위해 쓰이는 비 휘발성 메모리를 의미한다. 4. 하드디스크 첫 번째 섹터인 Master Boot Record(MBR)를 검사하고 이를 로드한다. : MBR은 전체 512Byte이다. (추후에 좀 더 구체적으로 설명하도록 하겠습니다). 5. 부트로더가 실행되어 커널을 메모리에 로딩(혹은 적재라고..

2016. 2. 2. 13:54

[OS 개발 3] 준비 단계(2) - 레지스터와 어셈블리 명령 체계

1. 어셈블리 언어? OS를 제작하는 과정에서 우리는 어셈블리 언어와 맞닥뜨릴 것입니다. 그런데 이 어셈블리 언어가 그리 쉽지만은 않습니다. 저도 그 동안 프로그래밍을 해오면서 거의 C++이나 자바와 같은 하이레벨(High Level) 언어를 위주로 주로 공부했을 뿐, 로우 레벨(Low Level) 언어에 대해 제대로 공부해보기는 사실상 처음인 것 같고 어려움을 느꼈습니다. 하지만 운영체제 구축이 주 목적인 만큼, 우리는 어셈블리 언어에 대해서 잘 알아야만 합니다. 뿐만 아니라, 어셈블리 언어에 대해 공부하면 추후에 디스어셈블링 기술을 배울때도 유용합니다. 디스어셈블링 기술은 이미 제작된 소프트웨어를 역으로 해부하여 소스코드를 분석해내는 기술인데, 이때 어셈블리 언어 해석 능력이 매우 유용하게 작용합니다..

2016. 2. 2. 13:05

[OS 개발 2] 준비 단계(1) - 제작 환경 구축

제작을 위한 준비 본격적으로 OS제작에 앞서 몇 가지 준비물이 필요합니다. 1. NASM 먼저 우리는 앞으로 OS를 제작하기 위해 어셈블리어를 자주사용하게 될텐데, 이를 CPU가 인식할 수 있는 기계어로 변환하는 작업이 필요합니다. 이미 OS를 제작한 선구자들이 이러한 과정에서 편의를 위해 NASM이라는 컴파일러를 제작했습니다. 사실 카와이 히데미씨가 제작한 NASK라는 컴파일러도 있긴 하지만 이는 사용하지 않기로 했습니다. 일단 아래 사이트에서 NASM을 다운받아 봅니다. http://www.nasm.us/ 사이트에 접속하면 아래와 같이 링크를 통해 다운받으면 됩니다.(참고로 저는 꽤 옛날 버전인 0.99버전을 받았습니다. 일부 블로거 분들 글을 보니 최신 버전이 호환문제로 나중에 무한 재부팅과 같은 ..

2016. 2. 2. 11:41

[OS 개발 1] 첫 시작

운영체제(Operating System, OS) 만들기에 앞서 그 동안 프로그래밍을 공부하면서 운영체제에 대해서도 계속 공부해야겠다는 생각을 가지고 있었지만 그러지 못했습니다. 이제는 험난했던 대학원 생활도 끝났고 입사를 앞둔 상황에서 OS를 꼭 공부하고, 특히 블로그를 통해 그 과정을 정리하기로 했습니다. 그런데 막상 시작하려고 하니 어디서부터 손을 대야 하나 감을 잡지 못했죠. '무조건 책부터 사야하나?''다들 구글링을 하던데 구글 검색만으로도 OS 공부가 가능할까?' 그 시작 방법조차 여의치 않아서 OS 처음 공부 방법을 좀 찾아봤더니 OS를 직접만들고 이를 공유하는 사람들이 꽤 있다는 사실을 알아챘습니다. 나는 왜 그 동안 OS를 직접 만들어볼 생각을 못했는지,,그런데 그 블로거들의 공통점은 대부..

2016. 1. 21. 22:41

[Ollydgb]올리디버거 쉽게 테마 변경하기

올리디버거(ollyDbg) 쉽게 테마 변경하기 이번에는 올리디버거를 '간지'나게 해줄 색상 변경방법에 대해 소개하고자 한다. 보통 처음 올리디버거를 내려 받고 실행하면 다음과 같은 화면을 볼 수 있습니다. 그런데, 어두운 배경 윈도우에서 작업하는 것이 익숙한 나는 영 이 창의 색상이 맘에 안들었습니다. 그래서 테마를 바꿔서 사용중입니다. 하지만 올리디버거 프로그램 내부에서 일일이 색상 확인해 가면서 바꾸는 작업이 생각보다 오래걸려서 여간 성가신 작업이 아닐 수 없죠(분석하기에도 바쁜데 언제 이걸 일일이..!!) 그래서 편리하게 다른 분께서 설정한 색상을 적용하는 방법을 공유하고자 합니다. 우선, 올리디버거 EXE파일이 있는 폴더 내에 다음과 같은 아이콘 리스트 중, ollydbg.ini 파일을 메모장으로..

2016. 1. 20. 14:36

[VisualStudio] 디버깅시 커맨드 창이 자동 종료되는 현상 해결

디버깅 커맨드 창 자동 종료 해결 방법 처음 디버깅을 하는 과정에서 콘솔창이 종료되는 현상으로 인해 당황하는 경우가 있는데, 이러한 현상을 바로 해결하기 위한 매우 간단한 방법을 소개하고자 합니다. 먼저, 다음과 같이 '프로젝트' 메뉴에서 '속성'을 선택합니다.(속성 앞에는 자신의 프로젝트 명이 적혀있음) 다음과 같이 '속성 페이지'가 화면에 출력되면 왼편 메뉴에서 '링커'->'시스템'을 선택합니다. 이후 오른편 화면에서 '하위시스템'을 선택한 후, 드롭창에서 '콘솔'을 선택합니다. 이후, 적용을 클릭하고, 프로젝트를 디버깅 없이 코딩(Ctrl+F5)해보면, 콘솔창이 사라지지 않고, 그대로 화면에 출력되어 있는 것을 볼 수 있습니다. 간단한 설정만으로도 프로젝트 실행시 콘솔창을 화면에 띄워둘 수 있음을 ..