지난 주에 아우~ 새벽형 인간으로 바꾼지 일주일쯤 지났습니다. 그리고 아침에 꾸준히 작업한 결과 MINT64 OS에 새로운 기능을 추가할 수 있었습니다. ;) 바로 클리핑(Clipping) 기능입니다.

클리핑 기능은 화면에 표시되지 않는 영역을 잘라 내어 이미지가 요상(?)하게 출력되는 것을 막는 작업입니다. 요상하게 표시되는 게 어떤 건지는 아래 두 화면을 비교해 보면 금방 알 수 있습니다. 위의 그림과 아래 그림을 비교해 보면 클리핑 처리를 하지 않았을 때는 화면 영역을 벗어난 나머지 영역이 그 반대편에 표시됩니다.

clip_image002

<클리핑 전 화면>

clip_image002[4]

<클리핑 후 화면>

클리핑 처리가 필요한 이유는 비디오 메모리가 연속된 하나의 덩어리기 때문입니다. 즉, 우리가 화면에서 보는 라인 단위로 딱딱 구분되어 있는 것이 아니라, 라인들이 순서대로 주욱 연결되어 하나의 메모리 공간을 형성하고 있습니다. 그래서 윗 라인의 끝부분에 윈도우를 출력하면 그 다음 라인까지 영향을 받습니다. 클리핑 처리는 보이지 않는 부분은 그리지 않음으로써 이러한 문제를 해결하는 기법입니다. ^^;;;;

사실 어렵게 하려면 한없이 어렵게 할 수 있고, 속도를 좀 포기하면 한없이 쉽게 할 수 있는 것이 클리핑 처리인데... 저는 쉬운 방법을 택했습니다(어떻게 했는지는 “비밀” 입니다. ㅎㅎ 나중에 공개할께요 ^^;;).

에휴~ 이제 슬슬 마우스를 추가해야겠군요. 마우스가 없으니 원... 그냥 랜덤하게 출력하는 것 말고는 별로 할 게 없네요. 급히 하나 추가해 봐야겠습니다. ㅎㅎ 그럼 다들 좋은 주말 되시길 ;)

이번 주와 지난 주 2주에 걸쳐 MINT64 OS에 2D 그래픽 라이브러리를 추가하고, 그걸로 윈도우 프로토타입을 만들어 봤습니다. 아우, 이미지로 만든 윈도우 프로토타입은 24bit Color 였는데, 실제 MINT64 OS는 16bit Color를 사용하고 있어서 색을 맞추는데 시간이 좀 많이 걸렸습니다. ㅠㅠ 그리고 닫기 버튼을 그리는데도 상당한 시간이 걸렸네요 ㅠㅠ

아래는 인증샷~!! 입니다. ;) 이미지랑 상당히 비슷하죠? ㅎㅎ

image

<실제 코드로 구현된 MINT64 OS의 윈도우 프로토타입>

image

<포토샵으로 만든 윈도우 프로토타입>

꼭두새벽부터 일어나서 작업을 했더니 머리가 좀 머엉~ 하네요 ㅎㅎ 그래도 만들어 진 녀석을 보고 있으니 왠지 흐뭇합니다. 이제 클리핑 처리 좀 하고 마우스를 집어 넣은 다음 윈도우 시스템을 추가하면 그럴듯한 녀석이 나오겠군요. ;) ㅎㅎ 신납니다.

에혀 언능 언능하고 응용프로그램쪽으로 넘어가야 하는데, 역시나 작업 능률이 문제군요. ㅡ_ㅡa.. 아침형 인간으로 재탄생할 때까지는 아무래도 어정쩡~ 할 것 같습니다. 역시나 노력하는 수 밖에는 없겠네요 ㅎㅎ 에궁~ 잠시 쉬었다가 또 작업을 시작해야겠군요. ㅎㅎ

마우스와 클리핑이 추가되면 동영상으로 하나 만들어 올리겠습니다. 그럼 좋은 하루 되세요 ;)

다음주면 GUI 시스템 작업을 해야 해서, 오늘 디자이너 준에게 부탁해서 프로토타입 이미지를 받았습니다. ㅎㅎ 바탕화면과 윈도우 프레임을 조합하고 보니 예전 것보다 훨씬 깔끔하네요. ㅠㅠ 어흑... 이때까지 GUI 시스템을 만들면서 윈도우 색깔이나 모양에 신경을 쓴 적이 없었는데... 시간을 좀 들이고 나니까 훨씬 멋지군요. ㅠㅠ


아래의 첫 번째 화면은 이제 만들 GUI 시스템의 프로토타입이고 두 번째 화면은 MINT64 OS 검증용으로 잠시 만들었던 OS의 GUI 시스템 화면입니다. MINT64 OS라는 이름에 맞추어 이번에는 녹색 계열로 배색해 봤습니다.

<MINT64 OS의 GUI 시스템 프로토타입>


<예전에 만들었던 GUI 시스템의 프로토타입>

 

녹색이 생각보다 촌스러운 색(?)이어서 조금만 잘못 써도 감(?)이 확 떨어져 보이던데... 멋지게 작업해 준 디자이너 준에게 감사의 말씀을 드립니다(준영아 사랑해~!! ㅋㅋ). 디자이너 준의 노력에 보답하려면 열심히 그대로 옮겨야겠네요. ㅎㅎ


아우~ 벌써 시간이 이렇게... ㅠㅠ 혹시 보시고 뭔가 부족하다고 생각되는 부분이 있다면 댓글로 제보(?) 부탁 드립니다. ;) 아직 2주 정도 시간이 있으니까 나중에 상의해서 반영하겠습니다. ;)


ps) 참고로 이미지의 저작권은 디자이너 준에게 있습니다. ㅠㅠ 무단으로 도용하면 미워할꺼에요 ㅠㅠ

근 10일에 걸친 대장정이 끝났습니다. ㅠㅠ)-b 중간에 코드를 한번 잘못짜서 디버깅을 다시 하는 사태도 발생했지만, 결국 끝났습니다. ㅠㅠ 잠결에 코딩을 했더니만 알 수 없는 코드들이 중간 중간에 잔뜩 들어가 있더군요. ㅠㅠ 어흑 ㅠㅠ

코어 16개를 모두 활성화한 뒤에 대칭 I/O 모드(Symmetric I/O Mode)로 전환하여 인터럽트 처리 횟수가 전체적으로 10 이상 차이가 나면 인터럽트를 분산하도록 했습니다. 뭐, 매번 돌리면서 인터럽트를 분산시킬 수도 있지만 약간 오바인 것 같아서... ^^;;;;

아래는 인증 샷입니다. :) 코어 16개를 활성화하기 전에 인터럽트 처리 횟수를 출력하고, 16개를 활성화한 후 다시 출력했습니다. 그리고 마지막으로 인터럽트 부하 분산 기능을 활성화해서 키보드를 난타한 다음 최종적으로 처리된 횟수를 출력하도록 했습니다.

 


에혀~ 이제 스케줄러를 코어마다 추가하고 태스크 부하 분산(Task Load Balancing)만 처리하면 끝이군요. ;) 대망의 GUI로 넘어갈 수 있을 것 같습니다. ㅎㅎ 정리하면서 하느라 여기까지 오는데 꽤나 걸렸는데... 이제 좀 속도가 다시 붙을 것 같군요. ;) GUI는 지금까지 했던 것 보다는 알고리즘이 간단하니까 말이죠 ;)

에궁~ 오늘은 일찍 잘려고 했는데... 결국 또 이렇게 되는군요. ㅠㅠ 언능 누워야 겠습니다. ㅎㅎ 다들 좋은 밤 되세요 ;)


ps) 인터럽트 부하 분산 기능을 추가하긴 했는데... 시리얼 포트를 폴링 방식으로 사용하다보니 그다지 인터럽트 부하가 발생하지 않더군요. ㅡ_ㅡa... 사실 크게 이득이 없는 것 같습니다. 나중에 기가바이트 이더넷이나 추가하면 효과를 좀 볼지... ㅎㅎ :)

헥헥... 이번에는 거의 3주 만에 블로그에 글을 올리네요.  ㅠㅠ 점점 글 올리는 주기가 길어지는 걸 보니 조만간 폐허(?)가 되는 게 아닌가 걱정되는군요. ㅠㅠ 정말 블로그에 글 올릴 시간도 없이 열심히 작업했는데, 이제야 겨우 끝났습니다. 사실 코딩하는 데는 이틀 밖에 안 걸렸지만 내용 정리하는데 12일 정도가 걸렸군요. ㅡ_ㅡa... 회사를 다니고 있으니 야간에 작업을 해야 하는데, 그래서 더 어려운 것 같습니다. (이거 원... 잘하면 회사도 때려 치겠군요. 쿨럭..;;;;)


이번에 추가된 기능은 프로세서 내에 잠자고 있는 나머지 코어를 깨우는 일이었습니다. 보통 부팅을 시작하면 BIOS가 코어 중에서 하나만 선택해서 BSP(Bootstrap Processor)로 만든 후 부팅을 시키고, 나머지는 AP(Application Processor)로 만들어 대기시킵니다. BSP는 부팅이 끝나면 MP Configuration Table 같은 걸 읽어서 잠자고 있는 AP의 수를 계산한 뒤 나머지를 깨워서 일을 시키는 것이지요.


MP Configuration Table을 분석하는 작업은 지난 번에 했으니, 이번에는 이 정보를 바탕으로 AP를 활성화했습니다. 아래 그림은 총 16개의 코어를 활성화하여 각자가 메시지를 출력하게 한 것입니다.


 <총 16개의 프로세서(BSP 1개, AP 15개)가 동시에 동작하는 화면> 


아아~ 정말 작업하는 게 쉽지 않군요. 별다른 동기 부여 없이도 꾸준히 하는 스타일인데... 요즘은 살짝 지치는 느낌입니다. 아무래도 배보다 배꼽(?)이 더 큰 상황 때문이 아닐까 생각하는데... 앞으로 MileStone 2개 정도만 더 올리면 GUI라서 꾹 참고 진행하고 있습니다. ;)


에궁... 다음 MileStone은 BSP와 AP가 동시에 인터럽트 처리를 하는 것이 될 것 같습니다. 이것만 지나가면 AP에도 스케줄러를 붙여 멀티 태스킹 시킬 수 있으니... 거의 끝난 것이죠. ;) 아유~ 지겹네요. ㅠㅠ 그래도 열심히 해야지... 어쩌겠습니다. 어흑...


장마 전선이 올라왔다던데... 다들 비 피해 주의하시고 건강 잘 챙기세요 ;)


ps) 곧 GUI로 들어간다니 여자 친구가 MINT64 OS에서 쓸 바탕 화면을 디자인해 줬습니다.이 중에 하나를 택해야 할 것 같은데... 어떤 것이 좋을까요? ;)

 

 

이번에도 상당히 오랫동안 작업했습니다. 요즘은 귀차니즘이 도져서 가만히 않아서 작업하는 게 힘듭니다. 그래서 약간 진도도 처지고 의욕이 살살 꺼지고 있습니다. 그래도 갈 길이 멀기에 끙끙거리면서 작업해서 겨우 붙였군요. ;)


일단 말이 필요 없으니, 직접 한번 보시죠. ;) QEMU에서 실행해서 새 그림이 그려 진 텍스트 파일을 수신한 후, 그것을 다시 화면에 표시한 동영상입니다. 화면을 캡쳐한 것을 올려도 되지만, 동영상이 좀 더 액티브(??)하니 동영상으로 올렸습니다.


<동영상 파일을 변환하니 깨져서 그대로 올렸더니 파이어폭스에서는 제대로 안보이는 문제가 있네요. ㅠㅠ>

https://t1.daumcdn.net/cfile/tistory/13153C1B4A31337702 를 클릭하시면 다운로드 받아서 볼 수 있습니다.



파일 시스템이 생기니 이런 재미난 일도 할 수 있군요. ㅎㅎ 너무 신납니다. ;) 그러고 보니 OS의 기본 기능은 대부분이 구현되었군요. 이제 남은 건 멀티 코어를 활성화하는 부분이랑 GUI 정도인 것 같은데... 다음 이번 달과 다음 달은 꽤나 고생하겠다는 생각이 드는군요. ㅠㅠ 어흑 언능 작업해서 재미난 GUI로 가고 싶어요. ㅠㅠ 그럴려면 또 열심히 달려야겠군요. 어흑...

그러기 전에 오늘은 일단 좀 쉬어야겠습니다. 피곤에 너무 찌들어서 한참을 골골거렸다는 ㅋㅋ 그럼 다들 좋은 밤 되세요. ;)


ps) 다음은 MINT64 OS에서 전송한 ASCII Art 파일을 표시한 것을 캡쳐한 화면입니다. 예전에 쓰던 마스코트인 까마귀입니다. 어때요? 비슷하죠? ㅎㅎ


휴가를 다 반납하고 집에 틀어박혀 작업만 한 결과, 파일 시스템 기본 API를 만들었습니다. 물론 파일 시스템도 허접하게 하나 만들고 말이지요. 그런데 만든 API가 워낙 허접하다 보니 빈 파일 하나를 생성하고 삭제하는 기능 말고는 되는 게 없네요. ㅠㅠ

아흑... 이래서는 안되겠다 싶어서 표준 입출력 함수처럼 open, read, write, close, opendir 등등을 만들고 있습니다. 오늘이 벌써 수요일이니까 이번 주까지 할 수 있을지 모르겠지만, 일단 최선을 다 해야 할 듯 하군요. 에혀... 점점 갈 길은 아직 먼데 체력은 점점 떨어지고 있어서 큰일 났습니다.

무슨 수를 쓰긴 써야 할 때인 것 같군요. ㅎㅎ 일단 좀 더 달려 보고 안되면 특단의 조치(?)를 내려야겠습니다. 홧팅~!!!

ps) 그래도 Milestone인데 아무것도 없으면 허전할 듯 해서, 하드 디스크를 MINT 파일 시스템으로 포맷하고 나온 정보를 표시하는 화면을 올립니다. 어흑... 이런거나 올려야 되다니... 정말 한 게 없군요. ㅠㅠ

clip_image002

<QEMU에 등록된 20MB짜리 하드 디스크의 정보를 읽은 화면>


읏차~ 예상 외에 변수가 생겨서 생각보다 조금 더 걸렸군요. ㅠㅠ 예전에 짰던 코드에 또 버그가 나와서 고칠까 말까 고민하다 보니 시간이 꽤 지났습니다. ㅠㅠ 수정하는 게 당연한데 왜 고민한 건지 잘 모르겠네요. (잠결에 그랬나? ㅡ_ㅡa..)

<LBA 0 어드레스에 2 섹터를 쓴 화면>

일단 간단히 읽고 쓰고를 반복해 본 결과 별 문제가 없는 것 같으니, 파일 시스템으로 넘어가야겠습니다. 파일 시스템은 FAT 파일 시스템을 아주 가볍게 개량해서 만들 생각입니다. 글은 이렇게 썼지만 사실 이미 작년 이맘때쯤에 만들었습니다. ㅡ_ㅡa;;; 아주 허접하지만 FAT 파일 시스템 드라이버를 만드는 것보다 일도 작고(과연??) 나름대로 쓸 만해서 이걸로 가기로 했습니다. 뭐 이름은 MINT64 Simple File System으로 해서 MSFS....가 아니라 MINTFS로 해야겠군요. ㅡ_ㅡa... 어디서 많이 본 듯한 이름이... 쿨럭..;;;


아아~ 또 바쁘게 하나 해야겠습니다. ㅎㅎ 이번 주말에 파일 시스템 스크린샷을 올릴 수 있으면 좋을 텐데.... ^^;;; 일단 열심히~!!! 그럼 다들 좋은 밤 되세요 ;)


하드 디스크 디바이스 드라이버 관련 링크는 아래를 참고하세요

http://www.nondot.org/sabre/os/articles/DiskandDiscDrives/

<64MB 영역 중에서 17MB를 커널 영역으로 사용하고 나머지 47MB를 동적 메모리 영역으로 할당한 화면>

아아~ 정말 이번 내용은 길고 지루했습니다. ㅡ_ㅡa... 내용 정리하는데 거의 9일이 걸렸고, 쓴 내용을 검토하는데 거의 5일이 걸렸습니다. ㅠㅠ 동적 메모리 할당과 해제에 대한 내용이다 보니 다른 스텝보다 좀 아니 훨씬 많더군요. 진짜 죽는 줄 알았습니다. ㅠㅠ


그래도 온몸을 배배 꼬아 가며 정리한 보람이 있는지 마무리하긴 했습니다. ;) 그리고 무시무시한 버그도 녀석도 하나 잡았지요. ㅎㅎ 지난번에도 캐시를 잘못 설정해서 GUI의 속도가 무진장 느린 문제가 있었는데, 이번에도 캐시 때문에 메모리에 접근하는 시간이 무지 걸리는 문제가 발생했습니다(이전에 발생한 캐시 문제는 http://kkamagui.tistory.com/608 에서 볼 수 있습니다).  지난번에 당한 게 있어서 금방 해결은 했는데... 왠지 좀 씁쓸하더군요. 약 10 챕터 정도를 거슬러 올라가서 다 수정해야 했기 때문입니다. ㅠㅠ 아흑... 몇십 분을 삽질하려니 죽을 맛이었습니다. 그래도 일찍 찾아서 다행이네요. ^^;;;; 저쪽 뒤에서 찾았다면 아마 기절했을 듯합니다. ㅎㅎ 이만하길 다행이랄까요?


동적 메모리를 처리하는 알고리즘으로는 제가 즐겨 쓰는(?) 버디 블럭 알고리즘(Buddy Block Algorithm)을 썼습니다. 버디 블럭 코드만 4번째 구현하는데, 이번이 그나마 제일 깔끔한 것 같네요. 나름대로 튜닝도 해서 속도도 만족스럽게 나오고... ^^;;; 혼자 쓸게 아니라서 신경 좀 썼습니다. MINT64 OS에서 구현한 방법은 나중에(?) 공개하겠습니다.


버디 블럭 알고리즘이 궁금하신 분은 http://kkamagui.tistory.com/20 를 참고하기 바랍니다(예전에 만든 자료라서 좀 부실하지만 어떤 원리로 동작하는지 확인하는 용도로는 괜찮을 듯 하군요. ^^a... ).


에혀~ 그러고 보니 또 한 주가 사라졌군요. ㅠㅠ 이러면 안 되는데... 언능 작업 들어가서 부족한 시간을 보충해야겠습니다. 그럼 다들 즐거운 주말 되세요. ;)

근 3주만에 Milestone이군요. ;) 3주동안 감기 몸살에 멤버십 후배들 호출에... 뭐 기타 등등이 섞여서 작업이 좀 더뎠습니다. 덕분에 2주 동안 해야할 분량을 3주나 되서야 겨우 끝냈군요. ㅠㅠ 아흑... 피 같은 한주가 그냥 사라져 버렸네요. ㅠㅠ

3주동안 MINT64 OS에 많은 변화가 있었습니다. 첫 번째는 멀티 태스킹과 멀티 스레딩 기능이 추가되었다는 것이고 두 번째는 실수 연산 기능이 추가되었다는 것입니다. 이 두가지 기능이 추가됨으로써, 태스크 관리쪽이 거의 마무리 되었네요. ㅎㅎ

역시 기념으로 스크린 샷을 찍어 올립니다. 그리고 이번에는 좀 특별하게 동영상도 찍었습니다. ;) 왠지 정지해 있는 화면만으로는 뭐가 어떻게 돌아가는지 확인하기 힘들 것 같아서요... ^^;;;;

아래는 첫 번째는 원주율의 근사값을 계산하는 화면이며, 두 번째는 MINT64 OS를 테스트하는 동영상입니다. 워낙 허접해서 볼 건 없지만 기념삼아 찍어봤습니다.

<원주율을 계산하는 테스트>


<테스트 동영상>

어휴~ 이제는 동적 메모리 관리랑 파일 시스템쪽을 구현해야 하는군요. ㅠㅠ 어흑 어찌나 갈길이 먼지... 머리가 살살 아프네요. ㅠㅠ 일단 자고 내일 생각해야겠습니다. ㅠㅠ

그럼 다들 좋은 밤 되세요 ;)

ps1) 파일 압축쪽도 추가해야하는데... 혹시 소스 파일하나 짜리 Zip 압축/해제 코드를 보신 분은 제보 부탁드립니다. ㅠㅠ 출처를 밝히고 당겨 써야겠어요. ㅠㅠ

ps2) 실제 PC에서 테스트해보니, 더 느리군요. ㅡ_ㅡa... 그래서 태스크의 수를 300개로 줄였습니다. 아무래도 화면에 출력하는 루틴이 시간을 많이 잡아 먹는 듯 하네요. ^^;;;

거의 3주 만에 올라오는 Milestone이군요. ;) 중간 중간에 올릴 수도 있었는데... 일정에 좀 쫓기다 보니 마음이 급해서 그러질 못했네요. ;)

image

<멀티 레벨 큐 스케줄러가 도입된 화면> 

그 동안 MINT64 OS에 많은 변화가 있었습니다. 그 중에서 첫 번째는 라운드 로빈 스케줄러에서 벗어나 멀티 레벨 큐가 도입된 것입니다. 큐는 0~5까지 총 5개의 레벨로 구분되고, 우선 순위에 따라 적당히 레벨을 설정해 주면 스케줄러가 레벨에 따라 회수를 달리하여 열심히 스케줄링 해줍니다. 위의 스크린샷은 현재 수행 중인 태스크의 우선 순위를 변경한 후, 프로세서 사용률을 출력한 화면입니다. 태스크를 Sleep 없이 계속 실행했더니 사용률이 98%까지 올라갔군요. ㅠㅠ

image

<동기화 수행 전, 숫자의 순서가 일정치 않으며 출력된 카운터의 수가 15개가 안됨>

두 번째는 동기화 처리를 위해 뮤텍스(Mutex)가 추가된 것입니다. 동기화 처리에서 빠지지 않는 것이 두 태스크 간에 변수 하나를 공유하면서 덧셈이나 값을 출력하는 예제인데, OS 책을 몇 권 보신 분은 이제 지겨운 예제일 것입니다. 저도 처음에는 왜 이런 단순한 예제를 가지고 설명하는 것일까 하고 생각했습니다만, 반대 입장이 되어 보니 이제서야 알겠더군요. ㅡ_ㅡa... 그것만큼 설명하기 쉽고 간단한 예제가 없더라구요. ^^a... 그래서 결국 태스크 3개가 하나의 변수를 1씩 증가시키면서 5번씩 메시지를 출력하여 1부터 15까지를 출력하는 예제를 작성했습니다. ㅡ_ㅡa...

동기화를 하지 않으면 당연히 위 처럼 제대로 출력이 안되며... 뮤텍스를 이용하면 아래처럼 예쁘게 출력됩니다. 이제 조금만 더 하면, 어느 정도 실행 테스트 가능한 버전을 공개할 수 있겠군요. ;)

image

 <동기화 수행 후, 숫자의 순서가 1씩 증가하며 총 15개의 메시지가 출력됨>

아유~ 이제 이번 주는 스레드에 대한 내용을 정리해야 하는데... 벌써부터 머리가 아프네요. ㅠㅠ 어쨌거나 열심히 해야겠습니다. 호환, 마마보다 무서운 것이 일정이 밀리는 일이니까요. ;)

그럼 다들 좋은 밤 되세요 ;)

MINT64 OS에 대해서는 간만에 포스팅하는 것 같습니다. 그 동안 회사 일도 좀 바빴고, 컨디션 난조로 생각보다 진도가 잘 안 나가는 바람에 조금 늦어 졌습니다. 블로그에 포스팅하는 시간까지 아껴가며 집중해야 했기 때문이지요. ㅠㅠ 결국 어쨌거나 목표했던 기간은 맞췄습니다. ㅎㅎ

이번에는 시간에 관련된 디바이스에 대한 기능을 추가했습니다. 흔히들 많이 쓰는 PIT 컨트롤러와 RTC, 그리고 정밀한 시간 측정 시에 사용하는 Time Stamp Counter(TSC)에 관련된 기능을 추가한 것이지요. 그리고 덤으로 쉘에 이러한 정보를 출력할 수 있는 기능도 추가했습니다.

만들어 놓고 보니 뭔가 재미있는 게 없을까 하는 생각이 들더군요. 그래서 마침 PIT도 있고 TSC도 있겠다 싶어서 프로세서의 클럭을 간접적으로 측정하는 코드를 삽입했습니다. TSC가 프로세서의 클럭을 기반으로 동작하는 특성을 이용해서, 약 10초 동안에 TSC가 변화한 양을 구하고 그것을 10으로 나누면 얼추 비슷하게 클럭을 측정할 수 있습니다. 다음은 MINT64 OS에서 측정에 사용한 코드입니다. 아래 코드로 측정했을 때 2667MHz가 나왔는데 실제 PC의 클럭이 2.6GHz짜리이므로 큰 차이가 나지 않는 다는 것을 알 수 있습니다.



이걸로 또 한 고비를 넘었습니다. ;) 이제부터 몇 주 동안은 멀티 태스킹 기능을 작업하면서 정리해야 하는데, 갈길이 막막하네요. ^^;;;; 코드를 짜는 거야 이미 지겹도록 했으니 아무 문제 없는데... 정리가 만만치 않아서... 쿨럭..;;; 이것 참 큰일입니다. 에혀... 그래도 어쨌거나 해봐야지요. >>ㅑ~울~!!!

에궁~ 빡시게 달릴 이번 주를 위해 오늘은 좀 일찍 자야겠습니다. 다들 좋은 밤 되세요 ;)

드디어 사고를 치고 말았습니다. ㅠㅠ)-b 어제 기안이 결재 되었다는 이야기를 듣고 출판사에 다녀온 것입니다~!!! 왠지 모를 불안감과 기대감에 가슴이 두근두근하더군요. ㅎㅎ 가서 담당하시는 분도 뵙고 이런 저런 이야기를 나눴는데, 너무 인상 좋으시고 성격도 좋으셔서 깜짝 놀랐습니다. “역시 이 바닥은 둥글 둥글한 사람들이 살아 남는구나” 하는 생각이 들더군요. ;)

한 손에 책을 가득 들고 출판사를 나오면서, 이제 진짜 열심히 해야겠다는 생각이 들었습니다. 뭐랄까요... 분위기가 사뭇 다른걸 느꼈다고나 할까... 지금까지 막연히 열심히 해야겠다고 생각한 게 확 깨면서, 언제까지는 뭐 하고 언제까지는 뭐 하고 이런 계산이 팍~!! 되더군요. 크윽... 이제 잠은 다 잤습니다. ㅠㅠ

올해 안에 마무리하는 걸로 목표를 잡고 열심히 달려 보겠습니다. ;) 화이팅~!!!

ps) 위의 스크린 샷은 현재 작업 중인 콘솔 쉘의 화면입니다. ;) 이것도 이제 곧 마무리 되겠군요.


좀 있으면 할머니 댁에 가야함에도 불구하고 일정이 좀 밀린지라 미친듯이 작업했습니다(그것도 설날 새벽에 이 짓을..~!!! ㅠㅠ). 그 결과~!!! 일단 목표치까지는 완성했습니다. ;) 아우 이거 원 노가다가 아주 장난이 아니군요. 그리고 생각 난 김에 MileStone 성 글에는 앞에 [MileStone]을 달기로 했습니다.

예전에 한번 달았다가 별로 효용이 없어서 블로그를 옮기면서 안달았는데... 글을 검색하려니 태그로 검색하는 것 보다는 제목으로 검색하는게 더 눈에 들어오더라구요 ㅎㅎ 앞으로 어떻게 될지는 모르겟지만, 일단 다는 걸로 했습니다.

[MileStone]을 달려고 글을 찾던 도중... 64bit로 최초로 전환해서 올렸던 글을 봤습니다. 작년 7월이더군요. 허허... 그후 가능성을 검토하기 위해 한 3개월 투자해서 GUI까지 후딱 만들고 지금 2번째 만들고 있는 건데... 그간 고생이 참 많았던 것 같습니다. ㅠㅠ 수많은 가상 머신들을 테스트하며 무료로 쓸 수 있고 멀티 코어까지 지원하는 놈을 찾기가 쉽지 않더라구요. 개발 환경은 또 왜이렇게 구축하기가 힘든건지... 지금 생각하면 눈물이 앞을 가립니다. ㅠㅠ

어쨋거나 지금은 검증까지 완료된 상태니 다시 그런 고생은 안하겠지요. ;) 옛날 글을 보니 감회가 새로워서 한자 끄적거려 봅니다. ㅎㅎ

이크~ 더 늦기 전에 이만 자야겠군요. 다들 떡국 많이 드시고, 새해 복 많이 받으세요 ;)

 이번주는 결혼식이다 뭐다해서 그렇게 많은 시간을 투자하지 못했습니다만, 막판 스퍼트해서  파일시스템을 추가하는데 성공했습니다. >ㅁ<)-b 사실 대부분의 코드는 윈도우 환경에서 시뮬레이션하면서 검증했기 때문에, 그냥 컨트롤 C+V 신공으로 끝냈습니다. ㅎㅎ

 그리고 내친김에 GUI 쉘에 dir 기능도 추가했습니다. GUI 쉘을 만든지는 좀 됬지만 귀찮아서 그냥 뒀는데, 점점 불편함이 커지더군요. 쉘 기능이 필요할때는 콘솔 모드 커널로 빌드해서 쉘을 쓰다가 다시 GUI 테스트할때는 윈도우 모드로 빌드해서 부팅하고... 이걸 수백번 정도 반복하다보니 그냥 만드는게 편하겠다는 생각이 들었습니다. 그래서 뚝딱~!!! 만들었습니다(사실 이 일이 더 많이 걸렸다는... ㅠㅠ).

 아래는 GUI 쉘로 루트 폴더와 이미지 폴더를 본 화면입니다. 깔끔하게 잘 나오는 걸 볼 수 있습니다. ㅎㅎ (이미지 윈도우는 /image/image0.img 파일을 읽어서 화면에 표시하도록 수정되었습니다)

 이거 뭐 점점 기능이 추가될수록 갈아 엎는 코드의 양도 많아지는군요. 이번에도 몇군데나 갈아 엎었습니다. ㅠㅠ 처음에는 간단한 OS를 만들자는 생각이었는데, 욕심이 자꾸 생겨서 이것도 추가하고 저것도 추가하게 되네요. 이렇다 언제 거사(?)를 시작하게 될지... ㅡ_ㅡa...

 진짜 내일 동적 메모리 할당쪽 알고리즘만 좀 더 수정하고, 거사를 시작해야겠습니다. 고칠게 있으면 거사를 진행하면서 고치던가 해야겠군요. ㅎㅎ

 내일 교육은... 또 물건너 간 것 같습니다. 푹 자다 올듯... ㅠㅠ
 다들 좋은 밤 되시길 ;)

 아이쿠... 원래 계획은 좀 더 진도를 나가는 거였는데... 그 동안 무리를 좀 했더니 저녁에 잠깐 졸았습니다. 한 40분 잤으니 존거 치고는 시간이 좀 길군요. ^^;;;; 아무리 피곤해도 존적은 별로 없는데... 몸이 좀 피곤하긴 한가 봅니다. 그러거나 말거나 할꺼는 해야하니 세수 한판하고 또 진도 나갔습니다.

 일단 어제 대충 만든 테트리스를 좀 수정해서 블럭 색깔하고, 내부 알고리즘을 좀 정리했습니다. 원래 테트리스가 그리 복잡한 알고리즘이 필요없는 게임이라... 알고리즘이라는 말을 쓰기도 부끄럽습니다만... ㅡ_ㅡa... 발로 짜다보니 도저히 안되겠더군요. ㅎㅎ 내일쯤 정리되면 한번 올리겠습니다. ^^;;;;

 테트리스를 수정한 뒤에 한참을 고민했습니다. 이제 더 뭘 구현해야 하는가.... 가만히 보니 3개 정도가 더 남았더군요. 디지털 시계, 텍스트 뷰어, 이미지 뷰어 정도 남았던데... 디지털 시계는 텍스트로 날짜와 시간만 표시해줄 생각이니 크게 어렵지는 않을 것 같고... 텍스트 뷰어는 말 그대로 뷰어니까 그냥 텍스트만 출력해주면되니 이것도 별로 어렵지 않을 것 같았습니다.

 그렇다면 남은 것은 이미지 뷰어인데, 어떤 파일 포맷을 사용할 것인가가 문제더군요. 가장 쉽게 처리할 수 있는게 BMP 파일 형식인데... BMP도 다양한 버전이 있기 때문에 어떤걸 해야할지 고민이 됬습니다. 그러다가 문득 NDS 홈브루를 개발할때 만들었던 KNG(kkamagui NDS Graphic) 파일 포맷이 생각나서 그걸 사용하기로 했습니다. NDS 홈브루도 16bit Color로 설정되어있고, 마침 지금 만드는 OS도 16bit Color로 설정되어있으니 큰 수정없이 사용할 수 있을 것 같았습니다. KNG를 사용하는 NDS 홈브루는 http://kkamagui.tistory.com/49http://kkamagui.tistory.com/468 에서 보실 수 있습니다.


 위의 화면은 수정된 테트리스와 그 뒤로 이미지 뷰어가 실행된 화면입니다. 이미지는 KNG로 변환해서 OS에 시리얼로 전송하는 방식으로 했습니다. KNG를 사용한 덕분에 작업이 상당히 빨리 끝났습니다. ^^;;; 이것 저것 많이 만들다보니 이런 날도 오는군요~ 좋구로 ㅎㅎ

 작업을 진행하면서 느끼는 QEMU의 장점은 TCPIP로 가상 시리얼을 연결할 수 있어서 굉장히 편리하게 시리얼 통신을 할 수 있는 점입니다. 속도도 굉장히 빠르고 QEMU 내부적으로 버퍼 관리도 해주니 OS에서 구현된 허접한 시리얼 드라이버로도 잘 됩니다. 덕분에 귀찮은 작업이 얼마나 줄었는지... ㅠㅠ)-b QEMU 만세~!!!

 아아... 벌써 또 시간이 이렇게 됬군요. ㅠㅠ 언제쯤 일찍 자려나... 그러려면 집에 굉징히 일찍오던지... 아니면 컴퓨터를 안켜야하는데, 둘다 실현 가능성이 낮군요. ㅠㅠ 거의 다 완료될때까지 잠을 줄이는 수 밖에는 없을 것 같습니다. 아흑....

 그럼 다들 좋은 밤 되세요. ^^)/~

ps) 헛... 이런 잠결에 만들다보니 화면에 있는 이미지 뷰어에 스펠링이 틀렸군요. 이런 ㅠㅠ

 헥헥... 추석 이후에 전주 칼퇴를 목표로 열심히 일찍 퇴근했더니만, 이번주는 꽤 많은 시간을 투자할 수 있었습니다. 덕분에 고민도 많이 했고, 기능도 여럿 추가했습니다. 일단 아래 스크린샷 먼저 보시죠. ^^)/~

 가장 큰 변화는 어플리케이션 패널(Application Pannel)을 추가해서 굳이 GUI Shell을 통하지 않고서도 프로그램을 실행할 수 있게 한 것과, CPU 및 메모리 상황을 표시하는 어플리케이션이 추가된 것입니다.

 어플리케이션 패널은 마우스가 위치했을 때 해당 항목을 붉은 색으로 바뀌게 하여 사용자로 하여금 알기 쉽게 한 것이 포인트입니다. 제가 원래 GUI쪽은 거의 신경을 안쓰는 편인데... 이번은 저 혼자만 볼게 아니라서 신경을 좀 썼습니다.

 CPU 모니터는 일정 시간동안 CPU 부하 및 현재 대기중인 태스크의 수를 표시하도록 되어있습니다. 숫자만 덩그러니 표시하는 건 좀 없어보여서 아래에 그래프도 같이 표시하도록 했습니다.

 메모리 모니터도 CPU 모니터와 비슷한 방식이지만, 좀 다른 점은 아래에 사용량 그래프에 그라데이션 처리가 되어있는 점이랄까요? ㅎㅎ 메모리 사용량이 높아지면 게이지가 점점 올라가면서 붉은 색 계통으로 바뀝니다. 굳이 그럴 필요 없지만... 왠지 뭔가 변화를 줘야할 듯 해서.... 나름 많이 신경썼습니다. ㅡ_ㅡV...

 그외 소소한 변화는... 타이틀 바를 좀 더 진하게 한 것과, GUI쪽에 일부 최적화를 수행한 것 정도입니다. 크게 눈에 보이지는 않지만, 화면을 그리는 속도가 약간(??) 더 빨라졌습니다. ^^  와우~!!!

 아참~ 가운데 보이는 시커먼 화면은 방금 추가된 따끈 따끈한 GUI Shell 입니다. 알맹이는 Console꺼를 그대로 쓰면 되기 때문에, 화면만 먼저 만들었습니다. 처음에는 검은 바탕에 하얀 글씨였는데, 맨 처음 만들었던 32bit OS 생각이 나서 검은색 바탕에 녹색(메트릭스 스타일??)로 바꿨습니다. 한때 선망의 대상이던 모노크롬 모니터처럼 말이지요. ^^;;;;

 어휴~ 만들다보니 상당히 많이 왔습니다. 이제 파일 다운로더 프로그램과 테트리스 정도 만들고 거사(?)를 시작할 생각입니다. 이 정도면 남에게 보여줘도 부끄럽지 않을 것 같으니 말이지요. ㅎㅎ 그나저나 70KByte도 안되는 크기로 참 많은 일을 할 수 있군요. 예전에는 몰랐는데 말입니다. ;) ㅎㅎ

 아래는 지금까지 작업한 내용을 실행해 볼 수 있는 파일입니다. 예전과 마찬가지로 qemu64MyOs.bat 를 실행하시면 됩니다.


 일단 밥 좀 먹고 다시 작업을 해야겠군요. ㅎㅎ
 그럼 다들 좋은 하루 되세요 ^^)/~~~


ps) X 버튼을 눌렀을때 윈도우 및 태스크를 종료하는 기능을 추가했습니다. 그 동안 귀차니즘으로 안했었는데... 더이상 미룰 이유가 별로 없더군요. ㅎㅎ 첨부파일은 최신으로 새로 올렸습니다. ^^)/~

 간단히 시작한 일인데... 버그가 나오는 바람에 연짱 7시간 정도 디버깅한 것 같습니다. ^^;;; 멀티 코어라는걸 자꾸 까먹고 작업을 하다보니 이상한 고정관념에 사로잡혀서 제대로 코딩을 안했더군요. ㅠㅠ)-b 크윽... 오늘은 꼭 기억할껍니다. ㅠㅠ 이렇게 허접할수가...

 멀티 코어임에도 불구하고 CPU가 초기화되는 순서가 0번부터 순차적일꺼라는 말도 안되는 생각을 계속 하고 있었습니다. 그래서 코딩도 순차적으로 CPU가 초기화 되니 스택도 순차적으로 할당해 주도록 했더군요. 허나 실상은... 초기화 되는 순서를 아무도 모른다는... ㅠㅠ 그래서 CPU의 ID를 직접보도록 수정했습니다. 끄응... ㅡ_ㅡa...

 그리고 막판에 짬을 좀 내서 CPU Monitoring Application을 추가했습니다. 원래 이게 목적이었는데, 장난삼아 Dual Core에서 Quad Core로 QEMU 옵션을 변경했다가 버그를 발견하고 디버깅만 주구장창했다는... 내일 출근은 또 어찌할지... 머리도 띵하고... 흑흑....

 아래는 급히 찍은 스크린샷입니다. Quad Core로 만들어 놓고 실행시킨 화면인데, 원체 허접하게 CPU Load를 계산하는지라... 별로 믿음직스럽지 못하군요. ㅎㅎ 그래도 된다는데 의의를... ^^;;; 시험삼에 Hexa Core(16개)까지 QEMU에서 테스트해봤는데, PC도 버벅거리고 QEMU에서 속도가 제대로 안나오더군요. 그나마 Quad Core까지는 쓸만한 것 같습니다.
사용자 삽입 이미지

 어휴... 테스트를 제대로 안해보고 거사를 시작했다면 어찌됬을까 아찔합니다. ㅠㅠ 역시 여유를 갖고 검토하는 시간을 갖길 잘한 듯 합니다. 에혀~

 이제 자야겠군요. 내일 하루종일 좀비모드로 지낼 것 같다는... ㅠㅠ
 다들 좋은 밤 되세요 ;)


 다들 즐거운 추석 연휴를 보내시고 계신가요? ㅎㅎ 저는 할머니댁에 당일치기로 갔다오는 바람에 시간이 많이 남아서 오늘도 어김없이 OS를 만들고 있습니다. 이런 걸 보면 역시 프로그래머가 천직인 것 같네요. ㅎㅎ ^^;;; 다만 좀 아쉬운 점이 있다면 마제스터치 키보드와 함께하지 못하고 허접한 삼성 멤브레인 키보드를 치고있다는 것... 기계식 키보드를 치다가 멤브레인 키보드를 치니 끝까지 눌렸는지를 확실히 알 수 없군요. ㅡ_ㅡa... 오타 작렬입니다. ㅠㅠ

 잡담은 이쯤하고... OS 개발도 거의 막바지로 가고 있어서 그 동안 고민했던 것들을 하나, 둘 마무리하고 있습니다. 옛날부터 OS를 몇번이나 뒤엎고 다시 들고 있지만, FPU 즉 실수 연산에 대해서는 그리 깊게 고민하지 않았습니다. 왜냐하면 finit, fxrstor, fxsave와 같은 멋진 어셈블리어 명령어들이 x387 Coprocessor의 상태를 관리해줬기 때문이지요. 그때는 단순히 이 명령들만 호출하면 된다고 생각했습니다. ^^;;

 그런데 막상 해보니 실상은 좀 다르더군요. ㅡ_ㅡa... fxsave 및 fxrstore를 이용해서 FPU 상태를 저장/복원했을 때 사용되는 메모리의 크기는 총 512Byte 입니다. 이건 상당히 큰 사이즈입니다. @0@)/~!!! 이것을 만약 Task Switching 시마다 저장/복원을 한다고 가정하면 Core에 있는 Register를 저장/복원하는 크기보다 더 크기때문에 거의 2배 정도의 Context Switching 시간이 걸립니다. ㅡ_ㅡa... 무시무시한 시간이지요.

 요 며칠동안 고민을 많이 했었는데, 가만히 생각해보니 뭔가 답이 나오더군요. Task 중에 FPU를 사용하는 Task가 여러개 있다고 가정하면, 인코딩 프로그램과 같은 프로그램을 제외하고는 실수 연산이 그리 빈번하지 않습니다. 즉 Task의 전체 코드에 비해 FPU 연산이 차지하는 비중이 작다는 것이지요. 그리고 또 한가지 포인트는 모든 Task가 FPU를 사용하는 것은 아니라는 겁니다. 경우에 따라 정수 연산으로도 충분한 Task가 있으니까요. ^^

 그래서 OS에서 마지막으로 FPU 연산(mmx, sse, sse2, sse3관련 어셈블리어 명령 사용)을 사용한 Task를 저장하고 있다가, 어떤 Task가 FPU 연산을 수행하면 마지막으로 사용한 Task와 비교해서 처리하는 방식을 생각했습니다. 사실 이 방법은 INTEL 문서(Volume 3)에도 나와있는 방법입니다. ^^;;; CR0 레지스터의 TS bit를 잘 사용하면 FPU 연산이 발생할때마다 7번 Exception이 발생하게 할 수 있고, 이것을 이용해서 처리하도록 가이드가 나와있습니다.

 제가  사용한 간략한 알고리즘은 아래와 같습니다.
  • FPU 연산이 발생했을 때, 마지막으로 FPU를 사용한 Task가 있는지 확인한다.
  • 마지막으로 FPU를 사용한 Task가 현재 Task이면 아무것도 해줄 필요 없다.
  • 마지막으로 FPU를 사용한 Task가 현재 Task가 아니면 마지막으로 사용한 Task에 FPU의 상태를 저장한다(fxsave).
  • 현재 Task가 FPU를 사용한 적이 없으면 FPU 상태를 초기 상태로 설정한다(finit).
  • 현재 Task가 FPU를 사용한 적이 있으면 Task에서 FPU 상태를 복원한다(fxrstor).
  • FPU를 마지막으로 사용한 Task 정보를 현재 Task로 설정한다.

 위와 같은 방식으로 총 300개의 FPU Task를 생성해서 돌려봤습니다. 처음에 FPU 상태를 저장하지 않았을때는 FPU가 여기저기 Task에서 건드려져서 정상적으로 계산 결과가 나오지 않더군요. 하지만 위와 같은 알고리즘으로 구현하고나니 계산 결과가 정확하게 나왔습니다. >ㅁ<)-b

 이렇게 또 한고비가 넘어가니 기분이 좋습니다. ㅎㅎ 잠깐 나갔다 와서 다른 장난(?)도 좀 쳐봐야겠군요. ㅎㅎ
 다들 즐거운 연휴 보내세요. ^^)-b



 
 드디어 응용프로그램을 외부에서 전송하여 실행하는데 성공했습니다. 외부 즉 윈도우와 가상 머신은 Serial Port로 연결했습니다. QEMU의 옵션 중에 가상 Serial Port를 열어주는 옵션이 있는데, 그것을 이용해서 가상머신에 Serial을 만들고 제가 만든 OS에서 그 Serial을 사용함으로써 통신에 성공했습니다. @0@)/~

 QEMU에서 TCP/IP로 Serial Port를 생성할 수 있는데, 아주 편하더군요. 덕분에 간단한 윈도우 소켓 프로그램으로 파일을 OS에 넘겨줄 수 있게 됬습니다. 아래는 제가 사용하는 QEMU 옵션인데, 맨 뒷줄 -serial 부터가 TCP/IP로 Serial Port를 생성해주는 옵션입니다. ^^

qemu-system-x86_64.exe -L . -fda d:/64bitos/disk.img -hda 64BitOS.img -m 32 -localtime -M pc -smp 2 -boot a -serial tcp::4444,server,nowait


 아래는 QEMU에서 돌고 있는 제 OS에 파일 매니져가 응용프로그램 바이너리(elf64 파일 포맷)을 넘겨주는 화면입니다. OS에서 Serial로 열심히 데이터를 다운받아서 "."을  찍고있는 걸 볼 수 있습니다. ^^;;;;
사용자 삽입 이미지

 다운로드가 끝나면 OS에서 ELF64 파일 포맷인가 확인한 뒤, Relocation을 수행합니다. 그후 메모리를 할당받아 Relocation된 실행 파일을 복사하고 프로세스를 생성합니다. 원래는 ELF64 파일 포맷을 가공하려고 했습니다만, Relocation을 분석하는 과정에서 크게 복잡한 부분이 없어서 그냥 쓰기로 했습니다. ^^;;;

 아래는 여러 개의 Application을 OS에 업로드하여 실행한 화면입니다. 각자 자신의 Task ID를 표시하게 되어있습니다.
사용자 삽입 이미지

 어휴... 진짜 이것 저것 많이 했군요. 이제 내일은 GUI 쪽 System Call을 추가하고 좀 복잡한 Application을 로딩해서 정상적으로 동작하나 확인해 봐야겠습니다. >ㅁ<)-b

 이크~ 벌써 시간이 이렇게 됬군요. 그만 자야겠습니다. ㅎㅎ
 그럼 다들 좋은 밤 되세요 ;)


 와우~ 거의 일주일 동안 작업해서 GUI 프로토타입을 완성했습니다. ㅠㅠ 삽질한걸 생각하면 눈물이 앞을... ㅠㅠ 흑흑... 오늘 윈도우 매니져가 개별 윈도우 메시지 큐에 메시지를 전달하는 기능을 추가하면서, 프로토타입을 겨우 완성했습니다.
 
 항상 추가된 기능은 어떻게라도 테스트를 해야하는 법~!! 테스트는 마우스가 윈도우 위를 지날때 윈도우 매니져가 마우스 이벤트를 윈도우 큐에 넣고,  윈도우는 큐에 데이터가 있는지 체크하는 방식으로 했습니다. 만약 마우스 데이터가 큐에 있다면 윈도우 가운데 있는 사각형 색깔을 바꾸도록 말이지요. ^^

 궁금하신 분들은 아래 파일을 다운 받으셔서 압축을 푸신 다음 "qemu64MyOs.bat" 파일을 실행하시면 GUI 프로토타입을 테스트 할 수 있습니다. ^^ 마우스가 클릭되거나 윈도우 위를 지나면 사각형이 반짝이는 걸 보실 수 있습니다.
아래는 스크린샷입니다. ㅎㅎ
사용자 삽입 이미지


 마지막으로... QEMU에서 마우스를 빠져나오게 하려면 Ctrl 과 Alt를 몇번 동시에 누르면 됩니다. ^^;;; 한번에 빠져나오는 경우도 있지만 몇번 눌러야 빠져나오는 경우도 있으니 당황하지 마시고 몇번 더 시도해보세요 ;)

 아아~ 이제 그만 자야겠습니다. 이번 주는 대충 여기까지~!!!
 그럼 좋은 밤 되세요 ^^)/~

 요 며칠간 일이 좀 있어서 소스코드를 깊게 볼 시간이 없었습니다. ㅎㅎ 그러다보니 오늘에서야 겨우 소스를 뒤져볼 수 있게 됬습니다만, 간만에 소스를 보니 너무 테스트 코드가 많아서 눈이 빙빙 돌더군요. @0@ 그래서 코드 정리에 돌입했습니다.

 사실 그동안 PIT(Programmable Interval Timer)때문에 삽질을 좀 많이 했습니다. MP Spec에 따르면 INIT -> SIPI -> SIPI를 보내는 동안 각각 10ms, 200us, 200us 씩 Delay를 하게 되어있습니다. 따라서 이 Delay를 맞추기 위해 생각한게 Timer를 사용하는 것인데... 생각보다 에뮬레이터들이 완벽하지 않더군요.

 Timer의 Interval을 변경할때 종종 문제가 발생했습니다. ㅠㅠ 그래서 Timer이 Interval을 변경하지 않고 Tick을 계속 읽어들여서 Counting하는 방법으로 해결했습니다. 약간 꼼수긴하지만 어쨋든 되긴하니 ^^;;;; 패스~

 정리하는 김에 Dual Processor만 지원하도록 되어있던 부분을 실행 시에 Processor의 수를 읽어서 동적으로 셋팅하는 코드로 변경했습니다. 커널 스택을 1M 정도로 잡아놔서 Processor가 많아지면 많아질수록 할당될 스택의 크기가 줄어드는 문제가 있긴하지만... 커널에서 큰 지역변수를 쓰지 않는다면 괜찮을 것 같습니다.

 현재 QEMU를 이용해서 16개까지 해봤는데, 큰 문제가 없는 것으로 보아 잘되는 것 같습니다. ^^)/~ 물론 더 많이도 지원할 수 있습니다만, 아직까지 그럴 필요성을 못느껴서 16개로 한정했습니다. 아래는 실제 실행한 화면입니다.
사용자 삽입 이미지

 Bootstrap Processor는 Task 1과 Task 2의 Multi-Tasking을 수행중이고, 나머지 15개의 Application Processor는 화면에 자신이 실행된 Count를 출력하도록 되어있습니다. 아래쪽에 각 Processor가 Keyboard Interrupt를 얼마나 처리했는가 하는 값이 출력되어있는데, 여러 Processor가 Interrupt를 처리하고 있음을 볼 수 있습니다. ^^

 아아~ 이제 ELF64에 Relocation만 보면 어느 정도 끝날 것 같습니다. ;) 오늘 저녁에 뚝딱 해치워야겠군요.
 그럼 다들 좋은 주말 보내시길~ ^^)/~


 크윽... 죽는 줄 알았습니다. ㅠㅠ 지난 휴가와 이번주 주말을 모두 투자해서 드디어 Interrupt 처리 부분을 넣고, 나중에 사용할 APIC 와 IO APIC쪽 설정 기능을 넣었습니다. ㅠㅠ 사실 훨씬 더 일찍 끝났어야 하는 일이나... 가상 머신에 불완전함 때문에 코드를 고치고 테스트하다보니 많이 늦어졌습니다.

 현재 테스트 중인 가상머신은 총 3개인데, VMware, Bochs, 그리고 QEMU를 사용하고 있습니다. 재미있는건 각자 BIOS 설정이 조금씩 다르고, 같은 코드라도 동작하는 방식이 다르다는 것이죠. ㅠㅠ 이것 때문에 죽는 줄 알았습니다. 특히 Interrupt 처리부분에서 Bochs와 VMware에 문제가 있는 것 같더군요.

 테스트를 몇시간동안 한 결과 코드에서 Stack을 Align하지 않고 사용하는 경우, 간혹 Stack에 데이터가 덮어써져서 나중에 iretq로 돌아왔을 때 정상적으로 수행되지 않는 문제가 있었습니다. 원래 CPU가 realign을 해주게 되어있습니다만, 정상적으로 동작하지 않는 때가 있는 것 같습니다. 물론 꼼수로 해결했습니다만, 뭔가 좀 씁쓸하네요. ^^;;; 더 웃긴건 QEMU의 경우는 괜찮다는 것이죠. ;) 이 문제 때문에 거의 이틀을 꼬박 날렸습니다. 아흑 내시간...ㅠㅠ

 더 가관인 문제는 VMware에서 생겼습니다. Keyboard Interrupt를 발생하지 못하게 한 뒤에, 키를 마구 입력해서 키보드 버퍼를 체운 후 APIC쪽을 Enable 하니 Interrupt가 발생하지 않는 것이 아니겠습니까? @0@)/~!!! VMware의 APIC쪽하고 PIC쪽에 매치하는 부분에서 문제가 있는 것 같은데, 키보드 버퍼에서 데이터를 다 읽어내면 그때부터 인터럽트가 발생하기 시작합니다. ㅡ_ㅡa;;;;; 이것도 결국 땜빵코드로 해결... ^^;;;

 마지막으로 애교로 넘어가줄 수 있는 문제... Qemu에서 int 13, 즉 Disk Read에 문제가 있더군요. 여러 섹터를 읽도록 요청하면 간혹 덜 읽히고 종료되는 문제가 있었습니다. 이 문제는 어느정도 예상을 하고 있던 것이라 역시나 땜빵으로 해결... 예전에 만들면서 겪었던 문제라서 그냥 애교로 넘어갔습니다. ㅎㅎ

 결국 온갖 삽질 끝에 세가지 에뮬레이터에서 모두 동작시키는데 성공했습니다. 아래는 세가지 에뮬레이터에서 동작시킨 화면입니다.
사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

 이제 대충 멀티 태스킹과 elf64의 재배치(Relocation) 쪽만 해결하면 되겠군요. ㅎㅎ 코어를 하나 더 활성화 시키는 것은 저번에 해봤으니 그냥 붙여넣기만 하면... (설마 이것도 쉽게 안되려나..ㅠㅠ)  그나저나 계속 삽질만 해서 큰일입니다. ㅠㅠ 크윽...

 제발 좀 한번에 가자 ㅠㅠ)/~~

 그럼 다들 좋은 밤 되시길~ ^^)-b



지난 주 목요일부터 휴가입니다만은... 어디 놀러가는 일에 취미가 없는지라 고향에 내려와서 OS를 만들고 있습니다. ㅡ_ㅡa... 누가 들으면 간단한 애플리케이션을 만드는 것 처럼 이야기한다고 욕을 할지도 모르겠습니다. 사실 말은 간단하게 해도 수많은 시행 착오를 거쳤습니다. ^^;;;; Intel 문서에 태그가 안 붙어있는 쪽이 거의 없을 정도고, 코드는 테스트 루틴 때문에 너덜너덜합니다. ㅎㅎ

 일단 64Bit로 부팅시키는 것까지 성공했고, 지금은 Interrupt Descriptor Table(IDT)를 만들어 넣고 있습니다. 이것만 추가되면 이제 키보드로부터 데이터를 받을 수 있으니 좀 더 Active한 작업이 가능해지겠지요. ;) OS 코드들은 기존에 만들어놓은 32Bit OS쪽에서 당겨쓰고 있습니다. 어셈블리어로 짜여진 부분은 일일이 손을 좀 봐야하지만, C 코드 부분은 거의 손댈 것이 없더군요. ㅜ_ㅜ 역시 C 만세.... ㅠ_ㅠ)-b

 이번 휴가 때 어느 정도 동작하는 64Bit OS를 만들어 놓을 생각입니다. 휴가가 며칠 안남았기 때문에 하드한 일정이 예상되나... 역시나 밖에 안나가는 오타쿠(??)적인 기질 때문에 가능할 듯도 합니다. ㅡ_ㅡa... 재미있는 건 어제 밤새도록 코딩해서 오늘 오전쯤에 64Bit Mode로 동작시켰는데, 오후에 후배 녀석이 64Bit OS 제작 중인데 인터럽트를 어떻게 처리하냐고 물어보더군요. ^^;;;; 이것 참... 뭔가 섬뜩한 것이... @0@

 아래는 오늘까지 작업된 따끈따끈한 OS의 스샷입니다. 64Bit인지 어떻게 믿냐구요? 아래의 코드를 실행한 결과를 화면으로 캡쳐했습니다. int 가 4byte, long이 8byte로 나오는 것을 보면 64bit임을 알 수 있습니다. ^^)/~~


사용자 삽입 이미지

 어휴 작업을 너무 오래까지 했더니만 눈이 따갑네요. 이만 자야겠습니다. ^^)/~
 다들 좋은 밤 되세요 ;)


+ Recent posts