'OperatingSystem' 카테고리의 글 목록
1
2월

[OS 개발 18] 태스크 스위칭과 보호 (3) - 보호

1. 보호의 개념 이번 포스팅에서는 보호에 대해 알아보도록 하겠습니다. 글을 쓰는 과정에서 나도 공부하면서 작성하는지라 처음에는 좀 내용이 빈약할 수 있습니다. 왜냐하면 이번 포스팅에서는 개념위주로 작성할 계획이기 때문입니다. 일단 포스팅을 마치고 나중에 다시 확인해서...

1
2월

[OS 개발 17] 태스크 스위칭과 보호 (2) - CALL 스위칭

1. CALL 스위칭으로 변경하기 앞서 포스팅에서 현재 태스크에서 다음 태스크로 넘어갈 때, jmp나 Call을 사용한다고 했습니다. 이번에는 앞에서 봤던 코드를 활용하여 CALL 방식으로 프로세스를 불러들이도록 하겠습니다. 따라서 코드를 변경해야 하는데, 지난 코드에...

1
2월

[OS 개발 16] 태스크 스위칭과 보호 (1)

1. 태스크의 개념 이번 포스팅에서는 태스크 스위칭에 대해 포스팅하겠습니다. CPU는 작동하는 과정에서 많은 프로세스들을 동시에 실행하고 이를 처리합니다. 여기에서 프로세스가 태스크(Task, 작업)를 가리키는 하나의 유닛으로 볼 수 있습니다. 즉, 태스크는 CPU가 ...

1
2월

[OS 개발 15] 무한 재부팅에 대한 개인적 견해

무한 재부팅에 대하여 어느덧 OS 개발에 대한 15번째 포스트 입니다. IDT에 대한 포스팅까지 마친 시점에서 이번 포스팅에서는 잠시 무한 재부팅 문제에 대해 좀 살펴보기로 하겠습니다. 그 동안 OS를 만들고자 했던 많은 분들이 겪어왔던 고충 중 하나가 바로 무한 재부...

1
2월

[OS 개발 14] 인터럽트와 예외처리(4) 예외처리 구현하기

1. 예외처리 코드 예외 처리 코드는 이전 인터럽트 코드에서 일부를 추가하였습니다. 특히 Boot.asm은 지난 포스팅에서 사용했던 Boot.asm을 사용하면 되겠습니다. 단, 코드에서 다음과 같이 2섹터를 사용하기 위해 al에 넣을 값을 2로 바꿔주기만 했습니다. B...

1
2월

[OS 개발 13] 인터럽트와 예외처리(3) PIC와 인터럽트 구현하기

1. 코드 실행하기 앞서 두 포스팅에 걸쳐서 IDT에 대해 알아보았습니다. IDT와 PIC, 예외의 개념들을 토대로 다음과 같이 어셈블리 코드로 구현해 보았습니다. (init.inc는 이전 파일과 내용은 그대로이며, 이름만 바뀌었습니다.) 2. 코드 분석 Boot.as...

1
2월

[OS 개발 12] 인터럽트와 예외처리(2) PIC와 예외처리

1. PIC의 개념 인터럽트는 소프트웨어 인터럽트와 하드웨어 인터럽트로 분류할 수 있습니다. 그런데 키보드 입력, 디스크 제어 등은 하드웨어 단에서 인터럽트가 걸려야 하기 때문에, 구현할 때 PIC에 대해 어느 정도 알고있어야 합니다. PIC는 Programmable ...

1
2월

[OS 개발 11] 인터럽트와 예외처리(1) IDT의 개념

1. IDT의 개념 이제 GDT를 끝내고 IDT 개념에 대해 다룰 순서입니다. IDT는 Inturrupt Descriptor Table의 약자로, 위키피디아는 다음과 같이 정의하고 있습니다. 인터럽트 벡터 테이블을 구현하기 위해 x86 아키텍처에서 사용되는 데이터 구조...

1
2월

[OS 개발 10] 32비트 커널 로더(4) - 커널 구현과 분석

1. 부트로더에서 커널 구현부로의 점프 앞서 언급한대로, 부트로더에서 커널 구현부로 넘어가는 부분을 우선 구현해야할 것입니다. 다음 코드를 보시죠. 위 코드는 부트로더를 확장하여 작성한 코드입니다. 일부 앞서 포스팅에서 언급했던 내용은 해당 포스팅에서 설명을 참고하도록...

6
2월

[OS 개발 9] 32비트 커널 로더(3) - GDT의 개념과 적용

1. GDT의 개념 이전 포스팅을 마치면서 잠깐 GDT에 대해 언급하였습니다. 16비트 리얼 모드에서 32비트 보호 모드로 운영 모드를 바꿔야 하며, 이를 위해 GDT를 사용한다고 했는데요,. 본 포스트에서는 GDT 에 대해 알아보도록 하겠습니다. GDT를 풀어쓰자면 ...

5
2월

[OS 개발 8] 32비트 커널 로더(2) - 리얼 모드와 보호 모드

32비트 보호모드로의 전환 전 포스팅에서 마지막에 16비트 모드에서 32비트의 전송 체계로 바꿔줘야 한다고 했습니다. 이게 무슨 의미 일까요? 부트로더의 개념 및 제작, 실행, 분석 포스팅에서 제작했던 부트 로더 프로그램은 사실 16비트 단위로 데이터가 처리되는 리얼 ...

5
2월

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

1. 커널 로딩 드디어 OS의 핵심이라고 볼 수 있는 커널을 로딩하는 단계까지 왔습니다. 부트로더 포스팅만 해도 시간이 꽤 걸렸는데, 앞으로 커널 로더를 구현하는 부분은 얼마나 걸릴지 모르겠네요. 이전 포스트까지 디스크의 MBR 영역에서 부트 로더 프로그램을 읽어들이는...

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

세그먼트:오프셋 주소 개념과 물리주소 변환 계산하기 레지스터의 종류에는 범용 레지스터, 세그먼트 레지스터, 컨트롤 레지스터 등, 다양한 역할을 담당하고 있는 레지스터들이 있는데, 이번 포스팅에서는 세그먼트 레지스터에 대해서 알아보도록 하겠습니다. 세그먼트 레지스터는 처...

3
2월

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

1. 간단한 부트코드 입력 준비단계가 길었는데 이제 본격적으로 시작해보겠습니다. 우선, 우리는 부트스트랩의 첫 과정으로, 디스크의 첫 512b바이트를 읽어들이는 부분을 구현해야 합니다. 특별히 이 512바이트 영역을 MBR영역이라고 칭한다고 이전 포스트에서 언급했었습니...

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

부트스트랩 대부분의 PC 부팅과정은 다음과 같습니다. 1. 컴퓨터가 구동되면 전기적 신호에 의해 메인보드에 이식되어있는 BIOS가 구동된다. 2. 이 후 POST 단계(Power On Self Test)를 통해 메모리와 하드디스크, 하드웨어를 자체적 으로 점검하기 시작...

2
2월

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

1. 어셈블리 언어? OS를 제작하는 과정에서 우리는 어셈블리 언어와 맞닥뜨릴 것입니다. 그런데 이 어셈블리 언어가 그리 쉽지만은 않습니다. 저도 그 동안 프로그래밍을 해오면서 거의 C++이나 자바와 같은 하이레벨(High Level) 언어를 위주로 주로 공부했을 뿐,...

2
2월

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

제작을 위한 준비 본격적으로 OS제작에 앞서 몇 가지 준비물이 필요합니다. 1. NASM 먼저 우리는 앞으로 OS를 제작하기 위해 어셈블리어를 자주사용하게 될텐데, 이를 CPU가 인식할 수 있는 기계어로 변환하는 작업이 필요합니다. 이미 OS를 제작한 선구자들이 이러한...

2
2월

[OS 개발 1] 첫 시작

운영체제(Operating System, OS) 만들기에 앞서 그 동안 프로그래밍을 공부하면서 운영체제에 대해서도 계속 공부해야겠다는 생각을 가지고 있었지만 그러지 못했습니다. 이제는 험난했던 대학원 생활도 끝났고 입사를 앞둔 상황에서 OS를 꼭 공부하고, 특히 블로그...