Chobits OS를 개발하며...

OS 개발을 시작한지 근 한달만에 릴리즈를 하게 되었군요. 시원 섭섭한 마음에 넋두리나 한번 해볼까요? ^^;

이번 작업을 처음 계획한건 8월 초쯤 이었습니다. 8월 15일이 제 생일이라, 뭐 재미있는것좀 올리고 싶었거든요. 간단히 할수있는걸 찾다가 운영체제가 눈에 띄어 계획을 세우고 작업을 시작하게 되었죠. 처음에는 한 보름정도면 완료할수 있을줄 알았는데(작업일지 까지 쓸 생각을 했을정도니..), 실제로 해보니 신경써야 할 부분이 많더군요. 그래서 한달이나 걸려 버렸습니다. (이럴줄 알았으면 보름정도 일찍 시작할걸 그랬어요.)

처음 만드는 운영체제 이다 보니 많은 애착이 갑니다. 그래서 될수 있으면 하나의 완성된 모양을 갖길 바랬죠. 조금씩이라도 여러 부분을 지원 하려고 했습니다. 하지만 한 작업에 너무 많은 시간을 쏟는 취미는 없기에 여기서 멈춥니다. 그리고 언제나 그렇듯 소스는 공개합니다. 관심 있으신 분들 읽어 보시구요. 작업일지도 함께 공개합니다. 어떻게 운영체제를 만드는지 과정이 궁금하신 분들은 읽어 보세요.

운영체제 작업은 여기서 끝냅니다. 앞으로 업데이트할 계획은 전혀 없습니다. 소중한 20대의 시간을 운영체제 개발에 쏟긴 싫군요.
그리고 다음에는 이번보다 더욱 재미있는 주제를 가지고 글을 쓰게 될것 같습니다. ^-^
그때까지 제 홈페이지를 방문해 주시는 모든 분들께 행복한 일만 가득하시길 바랍니다. 그럼 이만...

2003년 9월 6일, 여리(선경렬)가 작성.
이메일 : alphamcu@hanmail.net 홈페이지 : www.zap.pe.kr (여리의 작업실)


소스권한

Chobits OS에 사용된 모든 코드는 제가 직접 작성 하였습니다. 그리고 전 제 코드 전부에 대해서 모든 권한을 포기 합니다. 어느 누구라도 제 코드를 사용할수 있으며, 수정하실수 있습니다. 전 여기에 대해 전혀 상관하지 않으며, 모든 코드를 제가 만든이상 어느 누구도 저의 이런 결정을 반박하실 수 없습니다.


Chobits OS 특징


참고자료


작업일지...

2003년 9월 6일

끝났다! 모든 작업을 끝냈다. 오늘은 system call을 디자인하고 어플리케이션 두개를 만들어 봤다. 하나는 그 유명한 'Hello World!'와 다른하나는 예전 gw-basic 시절에 잼있게 했던 'snake'라는 게임이다. snake를 만들기 전에는 이게 어려울줄 알고 걱정했었는데, 막상 프로그래밍 해보니 간단했다. 음... 단 3시간만에 완료.. ㅎㅎ.. 암튼 이걸로 운영체제의 모습은 다 갖췄다고 생각된다. 어플리케이션까지 지원되니까 말이다. 이걸로 끝이다. 이번 작업도 끝이야!! 릴리즈다! 바이바이~~~!!

2003년 9월 5일

많은 희생을 가해서 fdd와 vmware간의 충돌을 없앴다. 그외에 file system driver의 버그를 잡았고(끊임없이 파일을 읽어들이다가 혼자 다운되는 버그.. -_-;;) app를 로드하는 루틴까지 만들었다. 내일은 app를 만들고 syscall을 디자인 해봐야 겠다. 어쨌든 모레까지 작업해서 운영체제 작업을 끝내야 겠다. 너무 많은 시간을 투자한것 같아.. 음.. 공부도 해야하는데.. 이런..

2003년 9월 4일

오늘은 늦잠자서 학교에 가질 못했다. -_-;; 그래서 반나절이나 운영체제 작업을 할수있었다. 어제 약을 발라서인지 손의 물집도 많이 가라앉았고.. ㅋㅋ.. 오늘은 fdd 디바이스 드라이버, fat 12 파일 시스템 드라이버, file open,close,read 함수 구현, ms-dos의 'type'명령 구현등을 했다. -0-;; 반나절이라는 시간이 이 모든것을 가능케 했다. 놀랍다. 일주일만 이정도 시간이 계속 주어진다면, 윈도우라도 만들겠다. -_-;; (뻥이 심한가..ㅋㅋ) 아직 fdd 드라이버와 vmware간에 사소한 충돌(?)이 있긴 하지만 별 문제없고... 암튼 이것들을 다 끝내고 type 명령어로 harry potter 첫부분을 화면에 뿌려봤다... 아주 부드럽게 글씨가 뿌려진다. 흐흐... 기분좋네.. 좀더 힘내서 이번주 내로 릴리즈 해야지.. 깐바떼 쿠다사이, 여리사마!! >.< (?)

2003년 9월 3일

어제 술먹고 노래방 갔는데... 아침에 일어나보니 양손에 피멍이 들어있다. 손등에는 피멍, 손바닥에는 무려 7군데가 파랗게 멍들어 있었고 오른쪽 손에는 물집까지 잡혔다. 알고보니 노래방에서 템버린 치다가 이렇게 됐다는데.. -_-;;; 술먹으면 암튼 정신을 못 차린 다니까.. -,-;;; 오늘은 쉬어야 겠다.. 도저히 키보드를 칠수가 없다. 으 쓰라려..

2003년 9월 2일

술...

2003년 9월 1일

태스크 스위칭 함수를 하나 만들었다. 스레드가 작업이 없을때는 바로 다른 스레드를 실행할수 있게... 그외에 딜레이 함수도 추가... 딜레이를 구현하기 위해서 처음에는 무슨 구조체를 만들고, 딜레이 메세지를 처리하는 스레드를 만들고.. 어쩌고 저쩌고 삽질하다가.. 가만히 생각해 보니, 딜레이라는게 이걸 요청한 스레드만 멈추면 되는거아냐? 순간 7줄로 끝나버렸다. -_-; 난 바보였다. 도대체 오늘 하루종일 뭐한거지? -_-;;;

2003년 8월 31일

8월의 마지막 날이다. 오늘은 printf에 몇가지 기능을 업데이트 했다. 그외에 dir 명령을 추가했다. 아직 fdd 디바이스 드라이버와 파일 시스템 드라이버가 없기 때문에 일단은 bootsect에서 읽었던 정보를 그대로 가져다가 쓰고있다. 빨리 이들 드라이버를 만들어야지 불편해서 못살겠다...

2003년 8월 30일

키보드 스레드에서 일단 중요 키들만 처리하는 코드를 완료했다. shift 키와도 연동이 잘된다. 키보드 관련 정의를 수백개 만들었다. 키보드.... 거참.. 무슨 메세지가 이렇게 많은건지.. 생각하면 할수록 끝없이 나온다.. -_-; 욕심이 너무 과한건가? 암튼 이후에 쉘을 만들었다. 쉘 이름은 히데키라고 붙였다. 히데키는 쵸비츠에 등장하는 치이의 남자친구.. ㅋㅋ.. 히데키는 ms-dos 쉘의 장점을 따왔다. 명령어도 똑같이 만들었다. 오늘은 일단 help, ver, cls를 등록했다. 쉘을 만드는건 의외로 시간이 적게걸렸다. 내가 단순히 프로세스와 스레드만 등록시켜주면 커널이 다 알아서 디바이스 드라이버와 연동시켜주니 이렇게 편할수가 없다. 실제로 코딩양도 훨씬 줄어들었고.. 왜 커널을 잘 만들어야 하는지 알것같다. 좋은 커널로 작업하면 인생이 편해진다!! ㅋㅋㅋ (자화자찬이군.. ㅋㅋ)

2003년 8월 29일

키보드 스레드를 만들었고, 아스키 테이블을 등록해서 입력받은 키를 보여주는 부분까지 했다. 그외에 스레드가 작업이 없을때는 바로 다음 스레드를 실행할수 있게 하는 코드도 삽입했다.. 나머지는 내일 해야겠다. 내일은 토요일.... 오늘은 일찍 자야지.. 학교도 안가니까.. ㅋㅋ

2003년 8월 28일

아주 깨끗하게 프로세스/스레드 구조를 마무리 지었다. 라운드로빈 스케줄러도 완성하였고.. 256개의 프로세스와 256*256개의 스레드를 시스템에서 동시에 돌렸다. 환상적으로 부드럽게 돌아간다. @.@ 그리고 도중에 아무 프로세스/스레드를 죽이는 코드도 삽입.. 그래도 전혀 문제없음.. 아.. 난 왜 이렇게 똑똑한걸까.. 히히... -_-;; 내일부터는 디바이스 드라이버만 작성하면 된다.. 디바이스 드라이버는 프로세스와 스레드만 등록시켜 주면 커널이 알아서 처리해준다..!! 내가 제일 신경쓴 부분.. 드라이버 만들때도 커널에 왔다갔다 한다면 정말 귀찮거든.. 이런건 간단하게 해줘야지..히히.. 암튼 내일부터는 가속도다!! 아자!

2003년 8월 27일

잠. (sleeping)

2003년 8월 26일

vmware에서는 잘 동작했는데, 오늘 실제 컴퓨터에서 동작 시켜 보니 잘 되질 않았다. -_-;;; 버그를 찾기 위해 디버깅 하는동안 컴퓨터를 수십번은 재부팅 했다... 버그는 간단했다. vmware에서는 sti를 실행하는 순간 첫번째 irq0 인터럽트가 발생한다. 반면 컴퓨터에서는 sti를 실행하더라도 system timer가 인터럽트를 발생시킬때까지 어느정도 gap이 존재한다. 이 미세한 차이점으로 인해서 코드가 깨질수도 있다는 것을 알았다...(물론 버그가 있는 코드만 깨진다. -_-;;) 암튼 알아내느라 죽는줄 알아따.. 나보다 컴퓨터가 더 고생한것 같아.. 에궁..

2003년 8월 25일

막상 개강하고 나니 하루에 한시간 앉아 있기도 힘들다.. 오늘은 프로세스와 스레드를 연동하는 부분까지 구현했다. 아직 다 못한 몇몇부분과 스케줄러는 내일 구현해야 겠다... 암튼 오늘은 몸이 많이 피곤하다.. 일찍자야지..

2003년 8월 24일

멀티 태스킹에 성공했다. 처음에는 tss 32 디스크립터를 잘 설정해 줬는데도 이상하게 vmware에서 에러를 내뱉는 바람에 실패... 이유를 모르고 한참 해매다가 혹시나 해서 ltr명령으로 초기 task register를 지정해 주니까 바로 성공... 정말 허무하다. 왜 이렇게 중요한 사항을 데이터시트에는 단 2줄로 기록해서.. 별로 중요하게 생각지 않게 만드는 거지.. -_-;; 쓸데없는것만 잔뜩있고 말야... 암튼 오늘은 스레드 구조를 만들었으니... 내일부터는 프로세스와 스레드 구조를 연동하는 부분을 만들고, 라운드 로빈 알고리즘을 짜야 겠다. 근데 벌써 내일이 개강이다.... 작업을 시작한지 20여일이나 지났는데도 여기까지 밖에 못했는데 개강이라니... 정말 반성해야 겠다..

그리고 메모리 메커니즘을 새롭게 생각해 봤다. 블럭을 한 4k 정도로 만들고, 그보다 작은블럭을 그 4k pool에서 할당 받은 블럭을 다시 블럭화 하며 만들면 상당히 메모리가 효율적으로 될것같다. 소스는 거의 변경하지 않아도 되고 속도는 동일하니 꽤 괜찮을것 같다. 이게 실제로 있는지는 잘모르겠지만 "여리의 메모리 매니져"라고 이름붙여 봤다. ㅋㅋ 나중에 시간있을때 이걸로 업데이트 해야겠다.

2003년 8월 23일

메모리 alloc/free 함수를 만들었다. 함수 이름은 ddk에 있는것과 동일하게 했다. 머리가 나빠서 메카니즘은 복잡하게는 못만들고 아주 간단하게 만들었다. 테스트를 해보니 잘~ 굴러간다. 이걸 만들면서 메모리 관리가 얼마나 힘들고 피말리는지 알수있었다. 나중에 프로세스별로 할당받은 메모리를 관리할수 있도록 만들어야 될텐데.... 음... 지금은 생각도 하기 싫다. -0-;;; 암튼 메모리는 끝냈으니, 드디어 내일부터 멀티 태스킹 시작이다.!! 아싸! 시간이 얼마없다! 최선을 다해라 여리야!!

2003년 8월 22일

메모리 관리 메카니즘을 디자인 해봤다. 아무리 생각해봐도 이거 없이는 멀티 태스킹 작업을 하기가 힘들것 같았기 때문... 메모리 블럭의 크기는 512바이트로 잡았다. 가장 적당한 크기 같다. 바운드에 걸리지도 않고 흐흐.... 16메가 환경에서 무려 2만 8천여개의 블럭이 생긴다. 블럭 관리를 어떻게 해야할지.. 참 걱정이다.

2003년 8월 21일

휴가

2003년 8월 20일

키보드로 부터 데이터를 입력받는 인터럽트 핸들러까지 만들었다. 현재 입력받은 키를 큐에 집어넣는 것만 된다. 내일부터 멀티태스킹 작업을 시작해야 겠다. 키보드 태스크를 하나 만들어서 입력받은 키들을 실시간으로 처리해야 할것같으니까 말이다. :) 그리고 intel data book을 한 셋트 더 주문했다. 이왕 공짜인거 한 셋트 더 지원받아서 책장에 꽂아 놔야지.. 히히... (이기적인 녀석.. ㅋㅋ)

2003년 8월 19일

버그를 찾았다. 어셈블리된 소스를 보니 전역변수를 참조할때도 ebp 레지스터를 참조하고 있었다. 아무리 소스를 봐도 이걸 왜 쓰는지 알수가 없었다. 분명히 ebp를 이용하고 있지 않음에도 사용하고 있었다. 암튼, ebp를 셋팅해주고 돌리니 잘 돌아간다. ^^ 키보드 인터럽트 핸들러도 작성하였다. 내일은 키값을 알아내는 프로시져를 만들어야지. 참! 저번에 주문한 intel data book이 오늘 도착했다. 주문한지 5일만에 오다니... 깨끗한 책을 보고 있자니 감격해 버렸다. :)

2003년 8월 18일

8259 pic 컨트롤러를 reprogramming하는 부분까지 끝냈다. 그리고 소스를 전체적으로 한번 정리 하였고(넘 어지러워 @.@).. 인터럽트 핸들러까지는 정의했다. 이후, idt table을 등록하고 interrupt를 켰다. 불행히도 system timer가 한번밖에는 호출되지 않았다.. 1초에 50여번 정도 호출되야 하는데 한번!! 단한번만 호출되고 만다... 강력한 printf(!!)로 스택검사까지 해봤지만,, 리턴 어드레스도 전부 맞고.. eoi도 보내줬는데.. 왜 그럴까? -_-; 괜히 스택을 고치다가 gp도 발생해 버리고... 윽.. 머리아파..

2003년 8월 17일

a20 라인을 활성화 시키는 코드를 작성했다. 역시 무한루프에 빠지는 버그가 있었지만 강력한!! printf 덕으로 무사히 위기를 모면했다. 다음으로 인터럽트 관련 코드를 짜야하는데, 그럴러면 8259라는 pic 컨트롤러를 먼저 알아야 할것같다. 오늘은 스펙을 읽고 내일 코드를 작성해야겠다..... 그러고보니.. 오늘은 별로 한게 없네.. -_-;; (반성중)

2003년 8월 16일

빰빠라밤!!! 드디어 오늘 printf 함수를 만들었다! 비록 디버거는 없지만.... 버그 잡는 시간은 크게 줄일수 있을것 같다.!! 으하하하... printf 함수를 만드는 도중에.. 몇번 무한루프에 빠지는 버그때문에 시스템이 자꾸 에러를 내뱉는 이상한 상황에 부딪혀.. 정말 그만두고 싶은 생각이 간절했는데.. 다행이 버그를 잡았다. 히히.. sprintf를 만들때는 vc링커의 버퍼체크 옵션때문에 링크가 안되는 어이없는 일도 겪었다. 한참 해맸지만.. 역시 탁월한 감각(?)으로 무사히 넘기고.. ㅋㅋ.. 내일부터는 좀더 버그 잡는 시간이 줄어들것 같다.. 이번달까지 뭔가를 만들어야 하는데.. 빨리해야지!!

2003년 8월 15일

광복절이다.. 내 생일이다.. -_-! 오랜만에 고기를 먹었다. 배부르니 코드가 눈에 안들어온다. 오늘은 쉬어야 겠다. 그래도 일기는 써야지.. 이거 자꾸쓰니 무척 재미있다.. 난 어렸을때 왜 일기쓰는걸 싫어했을까? -_-? 바보같이... 가나다라마바사!!... 그리고 어제 인텔에 주문한 데이터시트 제본에 대한 답장이 왔다. 보내준단다... 음.. 괜히 저번에 프린터로 뽑아서 제본한것 같다.. 돈만 아깝게 시리..

2003년 8월 14일

오늘도 머리가 많이 빠진것 같다. 오늘은 CR, LF 문자 처리 함수를 만들었는데 이것들과 커서가 제대로 협력하지를 못했다.. 겨우 버그를 찾기는 했지만.... 이것때문에 너무 많은 시간을 허비했다.. 디버거가 있었다면.. 정말 순식간이었을 작업이 하루종일 걸렸다... 빨리... 화면에 문자찍는 함수라도 제대로 되서... 그것만이라도 제대로 된다면 좀 작업이 편안해 질것같은데.. ToT... 아무리 생각해도 printf는 인류 최대의 발명이다. 그리고 소프트아이스.. 디버거를 뭐 그렇게 비싸게 파냐고 욕한거.. 정말 미안하다... 디버거는 인류 최대의 유산이다.. 내가 무지했다.. 흑흑..

2003년 8월 13일

특정 좌표에 문자열을 출력하는 함수를 만들었다.. 유용하게 쓸것같다.. 그건그렇고 커서도 어떻게 조절해야하는데... 알고보니 커서를 조절하는 놈도 6845였다.. 이놈은 pio로 명령을 때려줘야 한다. 인라인 어셈으로 만들려고 했지만 이상하게도 dx 레지스터를 컴파일러가 인식하지 못한다... 변수를 dx로 쓰지말라나 뭐라나.. 바보같은 녀석.. 어쩔수 없이 이것도 masm으로 구현했다. masm의 코드가 늘어날수록 linux와 호환을 하려했던 내꿈도 멀어지는것 같아 가슴이 아프다... 그래도 부트섹터는 여전히 nasm이니까..뭐.. -_-;;; 포트 입출력 함수이름은 windows용 함수와 이름을 같게 했다.. 될수있으면 최대한 비슷하게 만들생각이다. (머리가 나빠서 이함수 저함수 이름외우는건 불가능 하니깐..)

2003년 8월 12일

모니터에 글씨를 쓰는건 의외로 간단했다. 비디오메모리인가 하는곳에도 데이터를 뿌려주니 글씨가 써진다.. 음.. 착한녀석.. 난 6845 crt 컨트롤러와 통신해야 되는줄 알고 긴장하고 있었는데... 이렇게 쉬운줄 알았으면 어제 할껄 그랬다... ㅋㅋ 남는 시간에 wac 포럼에 들어가 call-gate와 tss 세그먼트의 무용론에 관한 글을썼다. 답변이 줄줄이 달렸다. 질문하면 답변이 별로 안달리는데.. 이렇게 비판글을 쓰면 답변이 많이 달린다... -_-;;;;; 음.. 그렇군... 암튼 몰랐던걸 새롭게 알았으니까 기분이 좋다. ;;;;

2003년 8월 11일

분명히 보호모드 안으로 들어 왔을텐데..(vmware에러가 없는걸로 봐서는..) 확인을 못하겠다. 그래서 보호모드 들어오면 키보드 led 켜는 코드를 넣어봤다. 다행이 led에 불이 들어온다.. 제대로 돌아가고는 있는 모양이다.. 근데 까만 화면만 보고있자니... 도대체 뭘 해야할지를 모르겠다. 내일부터는 다른건 다 제쳐두고 글씨쓰는 라이브러리나 만들어야지..

2003년 8월 10일

오늘도 벌레 한마리를 잡았다. 어셈으로 컴파일한 목적파일을 vc linker와 연결할때 이 목적파일은 더이상 16비트 코드가 없는 순수한 32bit 코드들이다. 따라서 부트섹터에서 넘어올때-보호모드 진입전에 코드들은 16비트로 강제 코딩을 해야 한다는 거다. 머리속에서는 생각하고 있었는데, 막상 닥치니까 하나도 생각이 안났다. 음... 앞으로도 계속 이런식이면 어쩌지.. -_-; 그건그렇고 보통 "부트섹터->로더->운영체제 이미지" 이런순으로 부팅이 이루어 지는것 같다. 윈도우즈도 ntldr가 로더 역할을 한단다.. 음.. 나도 로더를 만들어야 하나? 안돼.. 마음흔들려선 안돼.. 난 내길을 가는거야.. -_-! 난 '부트섹터->운영체제'로 바로가는 고속도로를 탈거야! 코드가 많아지면 내 머리털이 남아나질 않을테니까....ㅋㅋ

2003년 8월 9일

속았다.. nasm이 지원하는 coff 형식을 vc의 링커가 인식을 못한다. 설명서를 자세히 읽어보니 cygwin을 위한 coff 형식이란다. -_-; 이런 @%@!$#% 놈들.. 나 완전히 새됐다. 오늘작성한 보호모드 진입코드를 전부 masm으로 바꿔야 겠다. 아.. 정말 힘빠지네..

2003년 8월 8일

버그를 잡았다. 나누기가 틀렸다. -_-; 꿈에서도 버그를 찾기위해 씨름했다. 지쳤다.. --;; 디버거가 없으니 버그를 못잡겠다.. 디버거를 구해줘!! 왜 vmware는 디버거를 제공해 주지 않는건가!! T-T 소스포지에 있는 보크스인가.. 박카스인가 하는 프로그램도 있던데... 그건 도대체 뭐가 뭔지 알아야 사용을 하지.. -_-; 뭐.. 디버거 없으면 필요도 없고.. 암튼 오늘 버그를 잡고 운영체제를 메모리에 로드할 만반의 준비를 다 갖췄다..!! ㅋㅋㅋ 일단휴식.. 산책이나 해야지..

2003년 8월 7일

시작이 반이라고 말한 사기꾼 녀석을 짓밟고 싶다. 어셈으로 fat12 파일시스템을 읽기위해 노가다를 했다. 일단 오늘은 실패... 섹터번호가 커질수록 제대로 읽지를 못한다... 뭐가 잘못된 거야.. -_-;; vmware가 이상한가 해서 동생 컴터로 해봤는데.. 역시 거기서도 에러발생.. 윽.. 난 어셈이 정말 시러!!

2003년 8월 6일

사용할 어셈블러를 정했다. NASM이란놈.. 흐흐.. ELF와 COFF 둘다 지원한다.. 혹시 나중에 리눅스에서도 개발해야 할지 모르니까 일단 이걸로 정했다. 메뉴얼도 pdf로 잘 되어있어서 보기 편했다.. 드디어 오늘!! 부트섹터 작업에 드디어 들어갔다. 화면에 내 이름을 출력해 봤다... 멋지군..! 장하다 여리야!!

2003년 8월 5일

운영체제 이름은 쵸비츠(chobits)라고 정했다. 내가 좋아하는 애니매이션 제목.. ㅋㅋ 뭐 특별한 의미는 없는데... 설마하니 사람들이 의미를 물어보겠어? 그냥 이름이 그러면 그런갑다 하겠지.. -_-; 부트섹터를 만들어야 하는데.. 음... 갑갑하네.. 시간도 부족하고..

2003년 8월 4일

컴터할수있는 시간을 하루에 4시간으로 늘렸다. 이정도라면 빠른시일내에 뭐라도 나오겠지... 개강하면 하루에 1~2시간 밖에는 없을텐데.. 걱정이다.. 개강하기전에 빨리 마무리 해야되는데.. 계획표를 짜봐야 겠다.

2003년 8월 3일

나도 운영체제를 한번 만들어 봐야겠다. -_-! (중대한 결정!) 어떻게 만들지는 이제 생각해 보자. 그리고 일기도 써야지.. 히히.. (작업일지인가? -_-?) 코드가 별로 안되면 이걸로라도 용량을 채워야 할꺼 아냐.. ㅋㅋ