책 표지

2008년부터 준비했던 "64비트 멀티코어 OS 원리와 구조"가 드디어 주요 서점에서 판매가 시작되었습니다. ^^)/~ 지난번 글(http://kkamagui.tistory.com/745)에서 다음 주 쯤부터 예약 판매가 될 거라고 말씀드렸는데, 하루만에 예약 판매가 시작되서 깜짝 놀랐네요. ^^;;;; 

제 블로그에 가끔씩 오시는 분들은 알고 계시겠지만, "64비트 멀티코어 OS 원리와 구조"는 제가 2008년에 취미로 시작한 프로젝트에서 시작되었습니다(진행 기록은 http://kkamagui.tistory.com/category/OS%20Kernel/MINT64%20OS를 보시면 확인할 수 있습니다). 물론 가끔 이게 처음으로 만든 OS냐고 물어오시는 분들이 계신데, 2002년도부터 치자면 이 OS가 5번 째입니다. ^^;;;;

최초로 만들었던 32비트 OS가 KKAMA OS(http://kkamagui.tistory.com/251) 이구요, 그 다음에 이걸 이용해서 만든 것이 OS 프레임워크(http://kkamagui.tistory.com/category/OS%20Kernel/32bit%20OS%20Framework) 입니다. 그 후 휴대용 기기쪽으로 넘어가서 OS 같은 펌웨어를 간단히 만들어봤다가 다시 PC로 넘어와서 MINT64 OS의 프로토타입(http://kkamagui.tistory.com/551)도 만들었지요. 그리고 마지막이 바로 MINT64 OS 입니다. 그러고보니 참 많이도 만들었군요. 쿨럭..;;;

MINT64 OS의 동작화면

제가 그동안 OS를 만들면서 느꼈던 점이나 힘든 점을 생각하며 작업 과정을 담은 책이니, OS 제작에 관심이 많거나 멀티코어 OS가 어떻게 동작하는지 궁금한 분들에게 많은 도움이 될 거라 생각합니다. ^^;;;

책은 교보문고를 비롯해서 여러 온라인 서점에서 구매하실 수 있으며, 링크는 아래와 같습니다.

1권 도서 링크 : https://www.yes24.com/Product/goods/65061299(ebook), https://www.yes24.com//24/goods/5270659(종이책)
2권 도서 링크 : https://www.yes24.com/Product/goods/65061297(ebook), https://www.yes24.com//24/goods/5270667(종이책)
1/2권 세트 도서 링크 : https://www.yes24.com//24/goods/5271779(종이책)


종이책은 현재 절판 상태이니 ebook을 이용해주시면 감사하겠습니다. ^^;;;


책을 출판하기까지 도움을 주신 많은 분들께 감사드리며, 앞으로 더 열심히 하겠습니다. ^^
그럼 좋은 하루 되세요 ^^

ps) 아래는 MINT64 OS의 구동화면을 동영상으로 만든 것입니다. 화면을 저장하다보니 끊김이 보이는데, 실제로 실행하면 좀더 부드럽습니다. ^^;;; 

 

<책 표지>


제가 2008년부터 만들기 시작한 MINT64 OS에 대한 책, "64비트 멀티코어 OS 원리와 구조"가 나왔습니다. ㅠㅠ 제 블로그를 방문하시는 분은 이미 알고 계시겠지만, 2008년 말에 취미로 64비트 모드에 발을 담갔다가 그대로 64비트에 멀티코어를 지원하는 OS까지 내리 달렸습니다. 그리고 내친김에 GUI에 응용프로그램까지 제대로 한번 해보자는 생각에 2년 넘게 작업을 했더랬지요. 제가 그간 진행했던 과정은 http://kkamagui.tistory.com/category/OS%20Kernel/MINT64%20OS 에서 보실 수 있습니다. ^^;;;

2008년부터 작업 과정을 올리면서 소스 공개를 바라시는 분들이 많았는데, 조금만 더 정리하고 올린다고 했던게 벌써 3년이나 지났네요. 쿨럭..;; 죄송합니다. ㅠㅠ 그래도 소스코드와 덤으로 제가 했던 작업 내역까지 상세하게 풀어쓴 책까지 공개했으니 너그러이 용서해주세요. ^^;;; 

<MINT64 OS의 실행 화면>


책은 2권으로 이루어져 있고 분량은 대충 2800 페이지 정도 됩니다. 페이지만 봐도 얼마나 내용이 자세한지는 대략 추측할 수 있을 꺼라 생각합니다. OS 만들기가 그렇지만 어셈블리어나 C 코드 한 줄만 틀려도 재부팅되거나 멈추기 때문에, 작업한 내용을 최대한 빼먹지 않도록 노력했습니다. 이 책을 보면 제가 부트로더부터 GUI를 거쳐 응용프로그램을 만들기까지 모두 들어있기 때문에, 장담컨데 이 책만 있으면 누구나 "취미"로 64비트와 멀티코어를 지원하는 OS를 만들 수 있습니다~!! 


글을 올리고 하루만에 판매가 시작되었네요. ^^;;;; 주요 서점에서 구하실 수 있구요, 링크는 아래와 같습니다.


1권 도서 링크 : http://www.yes24.com/Product/goods/65061299(ebook)http://www.yes24.com//24/goods/5270659(종이책) 

2권 도서 링크 : http://www.yes24.com/Product/goods/65061297(ebook)http://www.yes24.com//24/goods/5270667(종이책)

1/2권 세트 도서 링크 : http://www.yes24.com//24/goods/5271779(종이책)


종이책은 현재 절판 상태이니 ebook을 이용해주시면 감사하겠습니다. ^^;;;

그럼 다들 즐거운 하루 되세요 ^^


ps 1) 책이 나오기까지 도움을 주시고 응원해주신 많은 분들께 진심으로 감사드립니다. (__)

      이 책이 나올 수 있었던 것은 다 여러분들 덕입니다.
ps 2) 아래는 MINT64 OS의 구동 화면입니다. 화면 캡쳐를 하다보니 끊기는 부분이 보이는데, 실제로 실행하면 좀더 부드럽습니다. ^^;;;




 

<깔끔하게(?) 정리된 MINT64 OS의 실행 화면>


한동안 정신 없이 바쁘다가 다시 코드를 볼 일이 생겨서 얼마 전부터 코드를 보고 있습니다. :) 코드를 새로 추가하는 것은 아니고 기존 코드를 정리한 것뿐이지만… 어쨌든 내부가 변하긴 했으니 기념 삼아 올려봅니다. ^^;;; 가만히 생각해보니, 그동안 MINT64 OS에 대해서 많이 올리긴 했지만 제대로 된 설명을 한번도 한적이 없는 것 같네요. 코드도 한번 정리한 김에 MINT64 OS에서 실행 가능한 애플리케이션과 커맨드도 같이 정리해둡니다.

MINT64 OS가 기본으로 내장하고 있는 애플리케이션은 5개로 왼쪽 위에 있는 “Application” 버튼으로 실행할 수 있습니다. 각 애플리케이션의 역할은 아래와 같습니다.


  • Base GUI Task : 모든 GUI 애플리케이션의 기본 뼈대 역할을 하는 태스크로 윈도우를 생성하고 윈도우에 관련된 이벤트를 처리하는 단순한 애플리케이션입니다.
  • Hello World GUI Task : 가장 기본적인 GUI 애플리케이션으로 윈도우 시스템이 전달하는 메시지를 화면에 출력하고 자신과 같은 Hello World GUI Task로 유저 이벤트를 전송하는 기능도 같이 가지고 있습니다.
  • System Monitor Task : OS의 상태를 표시하는 애플리케이션이며 프로세서의 상태와 메모리의 상태를 표시합니다.
  • Console Shell for GUI : GUI 모드에서 동작하는 콘솔 셸로 커맨드 라인 해석기(Command Line Interpreter) 입니다. 여기에 대해서는 잠시 후에 설명하겠습니다. ;)
  • Image Viewer Task : JPG 파일을 읽어서 화면에 출력해주는 애플리케이션입니다. 하드 디스크에 image1.jpg와 image2.jpg, 그리고 image3.jpg가 있으니 파일명에 이를 입력하면 이미지를 볼 수 있습니다.


  <MINT64 OS에 내장된 GUI 애플리케이션들>


GUI 애플리케이션도 좋지만 키보드로 커맨드를 입력하는 재미(?)도 무시할 수 없어서, 초반에 MINT64 OS를 개발할 때 쓰던 콘솔 커맨드를 그대로 GUI 애플리케이션으로 만들었습니다. 콘솔 셸에서 테스트할 수 있는 커맨드에는 여러 가지가 있지만, 그 중에서 특히 유용한 몇 가지를 추린다면 아래와 같습니다.


  • help : 콘솔 셸이 지원하는 커맨드 목록을 출력합니다.
  • dir : 하드 디스크에 들어있는 파일을 출력합니다.
  • hddinfo : 하드 디스크의 정보를 출력합니다.
  • filesysteminfo : 파일 시스템의 정보를 출력합니다.
  • exec <application nane> <argument> : 파일 시스템에 저장된 애플리케이션 파일을 실행합니다. 애플리케이션은 ELF 파일 형식을 사용하며, 하드 디스크에 helloworld.elf부터 onelinememo.elf까지 총 6개가 저장되어 있습니다. <Argument> 부분은 옵션으로 애플리케이션마다 필요로 하는 정보가 다르고, 이는 잠시 후에 설명하겠습니다. ;)


콘솔 셸 커맨드 중에서 exec는 아주 특별한 커맨드로 파일 시스템에 저장된 GUI 애플리케이션을 실행하는 역할을 합니다. 파일 시스템에 저장된 애플리케이션은 6가지가 있고 각 애플리케이션마다 필요한 Argument와 역할은 아래와 같습니다.


  • exec helloworld.elf : MINT64 OS에 내장된 helloworld 애플리케이션과 같습니다.
  • exec textviewer.elf asciiart.txt : 파일 시스템에 저장된 파일을 읽어서 화면에 출력해주는 애플리케이션으로, Argument로 넘어온 파일을 읽어서 표시합니다.
  • exec bubble.elf : 풍선을 쏘는 버블 슈터라는 게임입니다. ^^;;;
  • exec hexa.elf : 같은 색깔의 블럭을 없애는 헥사 게임입니다. ^^;;;
  • exec hangulviewer.elf main.c : 파일 시스템에 저장된 파일을 읽어서 화면에 출력해주는 애플리케이션으로, textviewer.elf와 다른 점은 한글을 지원한다는 것입니다.
  • exec onelinememo.elf : 한 줄 메모장으로 간단한 메모를 남길 수 있는 애플리케이션입니다.


  <exec 커맨드로 실행한 애플리케이션들>

 

기능은 얼마 없는데 쭉 나열하고 보니 많은 것처럼 보이는 군요(착시 효과가 엄청난 듯…). ㅠㅠ 실제로 어떤 모습인가 확인하고 싶은 분들은 아래에 있는 압축 파일을 다운로드한 뒤에 MINT64OS.bat 파일을 실행하면 됩니다. 가상 머신에서 동작하는지라 사용하는 PC의 성능에 따라 약간 편차가 있을 수 있는데… 듀얼 코어 정도면 실행하는데 큰 문제가 없을 겁니다. ^^;;;



아우~ 주말 내내 정신 없이 보냈더니 이제 좀 쉬어야겠네요. 그럼 다들 좋은 밤 되시길~ ;)

그동안 여러 크고 작은 문제로 신경을 거의 못쓰다가 이제서야 정신을 좀 차렸습니다. 물론 아직 처리해야 할 문제는 많지만 사고가 났을 당시에 비하면 아무것도 아니지요. ㅎㅎ 여러분들이 많이 걱정해주신 덕분에 여자친구가 빨리 회복하고 있습니다. ^^)-b 많이 감사 드립니다. ㅎㅎ

에궁… 집 –> 병원 –> 회사 –> 병원 –> 집만 반복하다 보니 본의 아니게 블로그를 오래 버려두었네요. 여러분의 댓글에 일일이 댓글을 달아드리지 못한 점 죄송하게 생각하고, 시간 날 때마다 차근차근 답글을 드리겠습니다. ㅠㅠ 회사 일도 요즘 한참 마무리 중이라서 더 신경을 쓰지 못한 것 같네요. ㅎㅎ

그래도 마냥 시간만 보낸 것은 아닙니다. ;) 주말 동안은 병원에서 틈틈이 MINT64 OS를 손봐서 이제 나름대로 그럴듯한(?) 모습이 됐습니다. 아래는 바뀐 MINT64 OS의 인증샷입니다. ;)

image <한글 입출력 기능과 각종 게임이 추가된 MINT64 OS의 구동 화면>

사실 별것 아니지만 난리가 난 통에 여기까지 오는데도 상당히 오래 걸렸네요. ㅠㅠ 중간에 몇 번이나 고비를 넘었는지… 숨겨져 있던 버그가 나오는 바람에 크로스 컴파일러를 새로 만들었는데 새로 만든 크로스 컴파일러 때문에 다시 다른 버그가 나오는 문제가… 쿨럭..;;; 정말 환장하는 줄 알았습니다. ㅠㅠ 그래도 여기까지 오고 나니 나름대로 뿌듯하네요. ;)

이제 사는 소식도 좀 전할 겸 해서 슬슬 다시 블로깅을 할 예정이니 앞으로 자주 MINT64 OS에 대한 소식을 전하겠습니다. ;) 그리고 그 외에 여러 가지에 대해서도 말이죠. ㅎㅎ

그럼 좋은 밤 되시고, 또 뵙겠습니다. ;)

 

<이미지 뷰어와 콘솔 셸이 추가된 MINT64 OS>

 오늘 너무 황당한 일이 있어서 오랜 적막(?)을 깨고 한자 적어 올립니다(사실 다시 삽질 안 하려고 잊기 전에 올리는 것이지만... ㅡ_ㅡ;;;). 요즘 유저 레벨 응용 프로그램을 추가하려고 시스템 콜 부분을 구현하고 있는데, 인터럽트나 콜 게이트 방식 말고 다른 방식이 아닌 새로운 방식을 한번 도입해봤습니다. 이미 이 글의 제목에도 나와있지만 SYSCALL과 SYSRET 명령어를 사용하는 것이지요.;)


SYSCALL과 SYSRET 명령어는 INTEL과 AMD 양쪽에서 모두 사용할 수 있으며, IA-32e 모드에서 Ring 0와 Ring 3을 순식간에 오가는데 아주 유용하....다고 적혀있습니다. ㅡ_ㅡa... 실제로 얼마나 빠른지는 잘 모르겠지만 콜 게이트나 인터럽트처럼 스택에 데이터를 저장하고 특권 레벨을 체크하는 부분이 없으므로, 이전 것들(?)보다는 빠를 듯 합니다. ^^;;;;


뭐, 일단 SYSCALL과 SYSRET 명령어를 사용하려면 어떻게 환경을 설정해야 하는지는 INTEL 문서 Volume 3에 4.8.8 부분에 잘 나와있으니 생략하고... 실제로 SYSCALL과 SYSRET를 NASM으로 사용할 때 주의할 점만 한 줄로 정리해보면 다음과 같습니다.


IA-32e 모드의 64bit 서브 모드를 사용할 경우
SYSRET 명령어 앞에 REX.W 비트를 반드시 명시적으로 켜줘야 한다.


위의 사실을 찾는 데만 무려 3시간이 걸렸습니다. ㅠㅠ INTEL 문서를 보면 SYSRET의 경우 IA-32e 모드의 서브 모드 중에서 호환 모드(Compatibility Mode)와 64 비트 모드 중에서 선택해서 돌아갈 수 있으며, 그 핵심은 REX.W 비트라고 적혀있습니다. MINT64 OS는 64비트 서브 모드를 사용하니 REX.W 비트를 켜줘야 하는데, REX.W 비트가 켜지지 않아서 시스템 콜을 호출하고 돌아올 때 문제가 계속 생겼습니다.


코드를 생성할 때 64bit로 생성했기 때문에 NASM이 알아서 붙여 줄거라 생각했는데... 확인 결과 아무것도 없이 그냥 SYSRET 커맨드만 덩그러니 있었습니다. 그래서 시스템 콜을 호출한 뒤에 돌아오면... 잘못된 명령어라는 예외가 발생하더군요. ㅠㅠ 그래서 REX.W 비트를 키려고 봤더니... 


얼래... NASM에는 SYSRET 명령어 앞에 REX.W 비트를 명시적으로 붙이는 접두사나 키워드가 없었습니다~!!! (여운산님이 o64 키워드가 있다는 사실을 제보해주셨습니다. o64 키워드를 붙이니까 잘 되더군요 >ㅁ<)-b 완전 감사합니다). ㅠㅠ 오퍼랜드가 있는 다른 명령어들은 뒤에 오는 오퍼랜드의 크기에 따라 REX.W 비트를 켜주는 모양이던데, SYSRET는 오퍼랜드가 없으니 그냥 넘어간 모양입니다. ㅠㅠ 그래서 아래처럼 설정해줬습니다.


DB 0x48  <== REX Prefix로 W 비트가 1로 설정된 상태입니다. ^^;;;; (제가 해결한 무식한 방법입니다)
SYSRET

o64  <== REX.W 비트를 1로 설정하는 키워드 입니다. ;) (여운산님이 제보해주신 방법입니다, 아주 깔끔하네요 ;) )
SYSRET


이걸 해놓고 나니까 겨우 정상적으로 동작하네요. 이제야 겨우 유저 레벨 코드를 작업할 수 있게 되었습니다. ㅠㅠ)-b 안 그래도 할 일이 산더미 같은데... 이런 일로 시간 낭비(?)를 하고 나니 머리가 어찔하네요. ㅠㅠ 에휴... 이제 다시 작업하러 가야겠습니다.


ps) 위의 화면은 MINT64 OS에 이미지 뷰어와 콘솔 셸이 추가된 화면입니다. ㅎㅎ 조만간 또 테스트할 수 있는 바이너리... 보다는 동영상으로 한번 올리겠습니다. ;)

요즘 회사일 때문에 눈코 뜰새 없이 바쁜지라 거의 블로그를 버려뒀습니다. ㅠㅠ 회사에서 머리를 풀 회전시키고 집에 와서 잠시 쉬었다가 다시 작업하고 이런 날들을 거의 추석 근처부터 반복했더니만... 머리가 타는 듯(?) 하네요. ㅠㅠ 그래도 작업은 꾸준히 해야 하는지라 틈틈이 기능을 추가해서 화면 그리기 알고리즘 업그레이드 + 작업 표시줄 + 시스템 모니터까지 진행되었습니다. 아래는 진행된 것을 캡쳐한 화면입니다.

<작업 표시줄과 시스템 모니터가 추가된 화면>


이제 조금만 더 만들어서 콘솔 쉘까지 추가하면 그럴듯해지겠군요. ㅎㅎ 이번에는 동영상보다 직접 실행할 수 있는 QEMU의 이미지를 올렸습니다(절대 동영상을 찍기 싫어서가 아닙니다. ㅠㅠ). 어떻게 돌아가는지 궁금하신 분들은 한번 다운 받아서 실행해보시면 얼마나 허접한지(?) 볼 수 있을 겁니다. ㅎㅎ 파일을 다운받아서 압축을 푼 후 디렉터리 안에 있는 MINT64OS.bat를 실행하시면 됩니다.



아우... 새벽형 인간으로 거듭난지 꽤 되었지만 아침에 일찍 일어나는 건 여전히 힘드네요 ㅎㅎ 이제 그만 또 작업하러 가봐야겠습니다. ;) 다음 글이 또 언제 올라올지 모르겠지만, 틈나는 대로 진행상황을 올리겠습니다. 그럼 다들 좋은 하루 되세요 ;)

<현재 진행 중인 GUI 시스템의 화면> 

추석 연휴 때부터 이것 저것 일이 많아서 미친 듯이 달려왔더니 이제야 블로그에 한자 적어 올립니다. ㅠㅠ 아흑... 요즘 회사에서도 신경 쓸게 많다 보니 점점 작업시간이 줄어들어서 이러다가 큰일(?)나게 생겼네요 ㅠㅠ. 그래도 작업은 해야 하는지라 아침에 좀 무리해서 진행하고 있습니다(이러다 쓰러지는 게 아닌가 모르겠군요. 쿨럭..;;;)

그동안 아주 쉬운 알고리즘을 사용해서 GUI 시스템 작업을 했는데... 이제야 어느 정도 모양이 나와서 올려봅니다. ^^;;; 이제 조금만 더 있으면 바이너리 정도는 공개할 수 있는 퀄러티가 나오겠군요. 일단 윈도우 생성, 닫기, 선택/선택 해제, 이동 정도 구현된 상태입니다. 크기 변경이랑 화면을 좀더 효율적으로 그리는 부분은 좀더 진행되어야 할 수 있을 것 같군요. 아래는 지금까지 구현된 MINT64 OS의 구동 화면입니다. ;)


 



어휴... 이제 또 달려봐야겠네요. ㅠㅠ 다음 포스팅은 언제가 될지 모르겠지만... 조만간(?) 다시 하나 올리겠습니다.

ps) 어휴... 이것 참... 언능 해야 될 텐데... 큰일이군요. ㅠㅠ

지난 주에 아우~ 새벽형 인간으로 바꾼지 일주일쯤 지났습니다. 그리고 아침에 꾸준히 작업한 결과 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) 참고로 이미지의 저작권은 디자이너 준에게 있습니다. ㅠㅠ 무단으로 도용하면 미워할꺼에요 ㅠㅠ

태스크 부하 분산(Task Load Balancing)을 구현하는 중인데... PIT 컨트롤러의 인터럽트에서 스케줄러의 상태를 보고 태스크가 적은 곳에 집어 넣는 방법을 사용했습니다. 그런데 ㅡ_ㅡa... 이게 문제가 있네요. 난데없이 집어 넣은 스케줄러에서 실행되는 것이 아니라 다른 스케줄러에서 튀어나오질 않나... 같이 스핀락을 획득하는 부분이 없는데 데드락이 발생하지 않나... ㅡ_ㅡa... 그것 때문에 어제 밤 9시경부터 오늘 아침 8시까지 디버깅했습니다. 결과는 GG ㅠㅠ

디버깅을 미친 듯이 한 덕분에 오후 3시쯤 느즈막하게 일어났군요. 당췌... 이게 무슨 일인지... 다 해 놓고 막판에 테스트할 때 이런 문제가 나오면... 어흑... ㅠㅠ 그나마 GUI로 넘어가기 전에 발견했기에 망정이니... 아니면 큰일날 뻔 했습니다.

어휴 진짜... 증상은 있는데... 원인을 정확히 알 수가 없네요. ㅠㅠ 스핀락에 문제가 있는 것도 아니고... 코어가 많아서 그런 현상이 발생한다고 보기에는 뭔가 미심적인 부분이 있습니다(16개 코어 + 800개 태스크로 테스트를 하고 있답니다. ㅎㅎ). 그래서 방향을 선회해야겠는데... 시간이 좀 촉박한지라 고민을 계속 하고 있습니다. 오늘 안에 결과가 나오면 좋겠는데... 과연 잘 될지 모르겠네요. ^^;;;;

일단 또 작업을 시작해야겠습니다. ㅎㅎ 저녁쯤에는 글 하나를 더 쓸 수 있으면 좋겠군요 ㅠㅠ)-b

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

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

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

 


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

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


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

이번 주는 휴가도 있었고 해서 금방 주말이 오더군요. 그래서 그런지 주말이 아주 짧은 것 같습니다. ㅠㅠ 뭐 어제가 금요일인 것 같은데... 벌써 일요일 오후군요. ㅠㅠ(이 짧은 문장 치는데 ㅠㅠ가 몇 번이나 들어갔는지... 어흑... ㅠㅠ)

“회사일 + 프로그램 개발 + 드라이버 업데이트”이 세 가지가 한꺼번에 들이 닥치는 바람에 한 주가 정말 정신 없이 지나갔습니다. 하루는 해 뜨는 거 보고 바로 출근하는 기염을 토하기도 했지요. ㅠㅠ 어흑... 그래서 주말은 내내 잠만 잔 것 같습니다(헉... 그래서 주말이 짧은 건가...^^;;)

아무리 피곤해도 MINT64 OS는 진행해야 하는지라... 졸린 눈을 비비며 작업한 결과~!!! 일단 대칭 I/O 모드(Symmetric I/O Mode)로 전환은 시켰습니다. 대칭 I/O 모드가 무엇인고 하니, 멀티 프로세서나 멀티코어 프로세서를 사용할 때 여러 코어에 인터럽트를 전달하는 방식을 말합니다. 이렇게 하려면 PIC 컨트롤러가 아닌 I/O APIC와 로컬 APIC를 사용해서 인터럽트를 처리해야 합니다. ㅎㅎ 이제 다른 OS들처럼 인터럽트 로드 밸런싱(Interrupt Load Balancing) 정도는 할 수 있는 거죠. ;)

image

<대칭 I/O 모드(Symmetric I/O Mode)> 

예전에 프로토타입을 만들 때는 인터럽트 로드 밸런싱 처리가 상당히 복잡했는데... 이번에는 아주 간단하게 끝냈습니다. ㅡ_ㅡa.. 역시 두어번은 짜봐야 제대로 된 로직이 나오는가 봅니다(사실 제가 허접해서... ㅡ_ㅡa...). 자세한 방법은 인터럽트 로드 밸런싱까지 처리되면 Milestone에 올리겠습니다. ㅎㅎ

아흐~ 오늘은 집 정리도 하기로 했는데... 시간이 좀 촉박할 것 같기도 하군요. 일단 또 한번 달려 봐야겠습니다. 다들 남은 주말 마무리 잘하세요 ;)

ps) 그냥 아무것도 안올리기가 뭐 해서, 대칭 I/O 모드로 전환해서 하드 디스크를 읽은 화면을 올립니다. ㅡ_ㅡa...

image

헥헥... 이번에는 거의 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에서 쓸 바탕 화면을 디자인해 줬습니다.이 중에 하나를 택해야 할 것 같은데... 어떤 것이 좋을까요? ;)

 

 

드디어 긴긴 Single Core Processor 관련 부분을 마무리하고 Multicore Processor쪽으로 들어갔습니다. 이번에는 가장 기본이 되는  MP Configuration Table을 분석하는 기능을 추가했습니다. MP Configuration Table은 BIOS에서 만드는 것으로, 코어의 개수와 인터럽트 연결에 관련된 포괄적인 정보를 담고 있습니다. ;) 아래 그림을 보는 게 더 빠를 듯...

MP Configuration Table을 분석하는 이유는 실제 Core의 개수를 찾는 것과 나중에 인터럽트를 모든 Core로 전달하기 위해서입니다. BIOS는 부팅 과정에서 부팅을 담당하는 프로세서인 BSP(Bootstrap Processor)로 PIC 컨트롤러의 인터럽트 라인을 연결하므로, AP(Application Processor)를 깨운다 해도 PIC 컨트롤러의 인터럽트는 전달되지 않습니다. ;) 전달된다 하더라도 PIC 컨트롤러는 Multicore Processor를 지원할 능력이 없으므로 오동작하겠지요. ;)

따라서 Local APIC와 I/O APIC를 이용해서 모든 Core로 전달되도록 설정해야 하는데, 이때 MP Configuration Table에 저장된 정보가 아주 중요한 역할을 합니다. 실제 메인보드 제조사는 인터럽트를 어떻게 연결했는지를 알고 있으므로, BIOS에 그 정보를 저장해 둡니다. 이 정보가 MP Configuration Table에 들어 있는 것입니다. 만약 MP Configuration Table을 사용하지 않는다면... ㅎㄷㄷ... 생각만 해도 이건... ㅠㅠ

여튼~!!! 분석하는 게 끝났으니 이제 깨워서 일 시키는(?) 일만 남았군요. ㅎㅎ 아우 진짜 죽겠습니다. 이것만 끝나면 GUI로 바로 날아갈 텐데... ㅠㅠ  좀이 쑤셔 죽겠군요. ㅎㅎ 다음 작업도 끝나는 대로 인증 샷을 올리겠습니다. 다음 인증 샷에는 쌍둥이(?)가 열심히 일을 하는 화면이 나오겠군요. ;)

그럼 다들 좋은 저녁 되세요 ;)

ps) 아래는 QEMU의 MP Configuration Table의 내용입니다. 실제 PC와는 좀 다른 모습이군요. ;)



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


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


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

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



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

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


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


이번 포스팅은 거의 2주 만에 하는 것 같군요. ;) 이번에는 파일 시스템을 구현하다 보니 양이 많아서 이제야 겨우 끝났습니다. 일단 인증샷부터 보시죠. ;)

<MINT 파일 시스템을 구동한 동영상>

MINT 파일 시스템은 FAT 파일 시스템처럼 클러스터를 링크로 연결하는 형태로 되어 있습니다. 사실 FAT 파일 시스템을 쓸까도 고민했었는데, FAT 파일 시스템을 정리하고 구현하려면 양이 많아질 것 같고, 그렇다고 정리를 안 할 수는 없으니 그냥 간단한 파일 시스템을 만드는 것으로 했습니다. 그래서 나온 것이 MINT 파일 시스템인데 아래와 같은 구조로 만들었습니다.

 

<MINT 파일 시스템의 전체적인 구조>

척 봐도 FAT 파일 시스템과 아주 유사하다는 것을 알 수 있습니다. 디렉터리 엔트리 구조도 아주 단순합니다. 디렉터리 엔트리는 32 byte이며 파일 이름 24 byte와 파일 크기 4 byte, 그리고 파일 시작 클러스터 4 byte가 전부입니다. 클러스터 크기가 4Kbyte이므로 한 클러스터에 최대 128개의 파일을 생성할 수 있습니다.

<디렉터리 엔트리(Directory Entry)의 형식과 루트 디렉터리(Root Directory)의 구조>

이쯤되면 FAT 파일 시스템을 구현하는 게 더 낫지 않냐고 생각할지도 모르겠지만... MINT 파일 시스템은 극단(?)의 제약 사항을 걸어서 구현할 코드의 량을 대폭 줄였습니다. 그 제약 사항이 뭐야 하면...

디렉터리는 클러스터 하나만 사용할 수 있다
디렉터리는 루트 디렉터리만 존재한다

그렇습니다~!!! 서브 디렉터리를 제공하지 않고, 루트 디렉터리의 크기를 고정함으로써 경로(Path)처리나 디렉터리 처리에 관련된 코드를 대폭 줄인 것입니다. 실제로 예전에 FAT 파일 시스템을 구현했을 때와 비교한다면, 1/3 수준입니다. 물론 아쉬운 부분이 있긴 하지만... MINT64 OS처럼 간단한 OS에서 쓰기에는 충분한 것 같습니다. 어렵게 구현하는 것 보다 일단 구현하기 편하고 잘 돌면 되지요. ;)

구현할 양이 작아진 덕분에 C 언어 표준 입출력 함수, 즉 fopen(), fread(), fwrite(), fclose(), fseek(), opendir(), readdir(), rewindir(), closedir() 함수도 구현할 수 있었습니다. 마치 윈도우나 리눅스에서 콘솔 프로그램을 작성하듯이 MINT64 OS에서도 가능하다는 이야기지요. ㅎㅎ 실제로 아래는 위의 동영상에서 파일을 쓰고 읽는데 사용된 코드입니다.



아아~ 이제 파일 시스템에 캐시(Cache)를 넣고 램 디스크를 추가해야겠군요. 원래 이번 주 월요일에 시작해야 했는데 파일 시스템을 만드는 것이 늦어져서 이제야 시작합니다. ㅠㅠ 아흑... 또 주말을 반납해야 한다는... ㅠㅠ 열심히 만들어서 곧 Milestone을 하나 올리겠습니다. ;)

그럼 다들 즐거운 주말 되세요. ;)

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


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

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

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


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


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

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

와아~ 드디어 또 기다리던 주말이군요. ㅠㅠ)-b 이번 주도 컨디션 난조로 거의 버리다시피 해서 주말에 작업을 많이 해야 하지만... 고향에 가야 돼서 이번 주도 좀 어렵겠군요. ㅠㅠ 요즘 날씨가 이상해서 그런지 영 컨디션이 좋지 않습니다. 머리가 마치 굳어 있는 듯한 느낌이랄까요? 귀도 머엉~ 하게 울리고... ㅠㅠ

그냥 다 때려치우고 잠시 쉬고 싶은 마음도 있지만... 영 쉽지 않네요. 지금 쉬면 뒷탈이 생길 것 같아서 어떻게든 작업을 하려고 노력 중입니다.(누가 상 안주나요? ㅎㅎ) 열심히 해서 이번 주도 Milestone 하나를 올려야 할 텐데... 벌써 걱정이 태산이군요. ㅠㅠ

또 끄적 끄적거려 봐야겠습니다. ㅠㅠ 다들 즐거운 주말 되세요 ㅠㅠ)/~

<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개로 줄였습니다. 아무래도 화면에 출력하는 루틴이 시간을 많이 잡아 먹는 듯 하네요. ^^;;;

에궁~ 8시 경에 집에 와서 시간까지 작업을 강행한 결과~!!! 드디어 프로세스와 스레드 관련 부분도 어느 정도 마무리되었습니다. ;) 와아~ 짝짝짝~!!!

거의 끝난 기념으로 무엇을 할까 고민을 많이 했었는데~ 후배가 매트릭스 화면을 만들어 보는 게 어떻겠냐는 이야기를 해서 프로세스 1개와 1021개의 스레드를 이용해서 매트릭스 화면을 만들어 봤습니다. 아래는 인증샷 입니다.

사실 실제로 보면 글자가 줄줄 흘러 내리는 것이 보이는데... ㅡ_ㅡa... 스크린 샷으로는 그런 느낌이 나질 않아서 약간 아쉬움이 남는군요. ㅎㅎ 조만간 실행 파일을 정리해서 한번 올리겠습니다.

아우 벌써 또 이만큼 시간이 지났네요. ;) 일단 오늘은 자고 내일 정리해서 올리겠습니다. ㅎㅎ 다들 좋은 밤 되세요 ;)

거의 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개의 메시지가 출력됨>

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

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

크윽... 이번 달은 지출이 많아서 자제를 하려 했지만... 도저히 불편해서 질러야겠습니다. 아시는 분은 아시겠지만, 전 이미  24인치 모니터를 쓰고 있습니다. 아래처럼 말이지요. ㅎㅎ

image

<저의 절친... 24인치 모니터에 MINT64 OS를 구동한 화면입니다. ㅎㅎ>

그런데 이렇게 넓디 넓은 24인치 모니터도 자료를 정리할 때면 한없이 좁아지더군요. 문서 정리하랴 스펙 보랴 코드 붙여 넣으랴... ㅠㅠ 창을 전환하느라 정신이 없을 지경입니다. 사실 이렇게 작업하면서도 지금까지 뭐가 불편한지 모르고 있다가, 얼마 전에 코드를 붙여 넣는 중에 짜증이 나서 알게됬습니다. 도저히 안되겠다 싶더군요. 그런데 이때 문득 떠오른 것이 있었으니... 바로 삼성에서 만든 노트북용 모니터 랩핏(Lapfit, LD190)입니다. ㅠㅠ)-b

어떻게 생겼냐하면 아래 사진의 우측처럼 생겼습니다. 기존 모니터와의 차이점이라면 목이 일단 없고 전력 소모가 22W까지 떨어졌다는 것입니다. 그리고 USB로 연결할 수 있다는 것도 하나의 장점입니다. ;) 옛날 멤버십 과제에 비슷한 게 있었는데... 혹시 그분들이 만든 게 아닌지 모르네요. ^^;;;;

image

안그래도 모니터가 너무 커서 일반 모니터를 두기가 애매했는데, Lapfit은 24인치 모니터 바로 아래에 둘 수 있어서 좋은 것 같습니다. 특가로 파는 곳이 있어서 좀 싸게 샀는데... 단점이라면 배송이 늦다는 것 정도...(ㅠㅠ 아흑~ 이쁜아 빨리와라~ ㅠㅠ 니가 빨리 안와서 오빠가 불편하잖니 ㅠㅠ)

아아~ 실력에 비해 작업 환경이 너무 좋군요. ㅠㅠ 살짝 반성을 해야겠습니다. ㅠㅠ 뭐~ 열심히 하려고 산거니 열심히 하면 되지 않을까요? ㅎㅎ ;) 나중에 배송되면 설치해서 다시 인증 샷을 올리겠습니다. 그리고 성능도 같이 말입니다. ㅎㅎ

이궁~ 그럼 오늘도 슬슬 작업을 시작해야겠군요. 다들 좋은 밤 되세요 ;)

이번에는 정말 아슬 아슬하게 기한을 맞췄군요. ㅠㅠ

시간이 너무 늦었으니 오늘은 그냥 화면만 올리고, 자세한 것은 내일 올리겠습니다. ;)

아래는 실행 화면입니다. ㅎㅎ 5개의 우선 순위를 설정할 수 있도록 수정 되었고, 그 외에 뭐 태스크 종료 기능과 우선 순위 변경 기능, 그리고 프로세서 사용률 측정 기능이 추가되었습니다. ;)

clip_image002

이크~ 이만 자야겠군요. 내일 또 회식이 있어서... ^^;;; 다들 좋은 밤 되세요. ;)

clip_image002[8]

에휴~ 이번 주부터 2주 동안은 MINT64 OS에 스케줄러를 구현할 예정입니다. 이번 주는 다음 주에 구현할 멀티 레벨 큐 스케줄러(Multi Level Queue Scheduler)를 위해 간단한 라운드 로빈 스케줄러를 넣고 있습니다. 좀 있으면 주말인데, 주말에 약속이 좀 있어서 과연 이번 주 안에 끝낼 수 있을지 모르겠군요. ^^;;;;

시간은 점점 흘러만 가고 진도는 잘 나가지 않는 가운데... 뭐 회사에 대한 고민들과 퇴사하는 후배의 모습이 겹쳐서 머리가 좀 뒤죽박죽입니다. ㅠㅠ 이거 원... 이런 불경기에 월급 안 깎이는 것만해도 고마워 해야 할 텐데 말입니다. ㅠㅠ 아무래도 배가 부른 것 같군요. 개구리 올챙이적 모른다고 병특 때 고생한 건 생각도 안 하는 듯... ㅠㅠ

에궁... 정신 똑바로 차려야겠습니다. 홧팅~!!! >ㅁ<)-b

ps) 위의 화면은 라운드 로빈 스케줄러를 구현해서 20개의 태스크를 생성한 화면입니다. 대부분의 OS가 그렇듯이 PIT Interrupt를 통해 태스크를 전환합니다. ^^;;; 원래 각 태스크가 화면 주변을 돌게 되어 있는데, 스크린 샷을 찍다보니 그냥 잡다한 글자만 보이는 군요. 약간 슬프다는(?)...

image 

헥헥... 이번 주와 지난 주에 좀 많이 놀았더니 진도 맞추기가 힘드네요. ^^;;;; 어쨌거나 겨우 맞췄습니다. 아슬아슬 했다랄까요 ^^;;;; 자칫 잘못했으면 오늘 밤도 거의 못 잘 뻔 했습니다. ㅠㅠ 크윽... 이게 뭐 하자는 짓인지... ㅠㅠ

이번 주는 멀티 태스킹에 관련된 기능을 정리했습니다. 멀티 태스킹의 핵심이라하면 당연히 컨텍스트(Context) 관리 기능이므로, 컨텍스트 처리에 대한 함수 위주로 작성했습니다. 결과는 위에서 보시는 것과 같이 대~성공~!!!! 두 개의 태스크가 전환하면서 서로 자기 차례라고 메시지를 우기고(?) 있는 모습입니다. ^^;;;; (사실 예전에 다 만들었던 코드를 붙여 넣은 것 밖에는 없어요 ㅠㅠ)

다음 주는 이것을 확장해서 스케줄러도 추가하고 태스크 생성 및 종료에 대한 API도 추가해서 나름 괜찮은 시분할 멀티 태스킹 기능을 추가할 예정입니다. 점점 회사 일에 압박이 들어오고 있어서 생각대로 잘 될지는 알 수 없지만, 그래도 열심히 하는 것 말고는 방법이 없군요. ^^;;;; 제 유일한 장점이 책상에 오래 앉아 있는 거니 이거라도 살려야지요 ㅎㅎ

아아~ 이제 다음 주를 위해 준비를 좀 해야겠습니다. 다들 그럼 좋은 밤 되세요 ;)

ps) 크윽... 귀신보다 무섭다는 일요일 밤이군요. ㅠㅠ 눈물납니다. 아주 그냥 ㅠㅠ

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

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

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



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

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

이번 주 금요일에 급히 쉘 관련 파트를 끝내고, 주말 내내 PIT 컨트롤러쪽 작업을 하면서 문서를 정리하고 있었습니다. 처음에는 진도가 꽤나 잘 나가는 듯 했으나, 언제나 그렇듯이 문제에 봉착했습니다.

PIT 컨트롤러의 카운터 0를 사용하는 경우, IRQ 0 인터럽트가 발생하기 때문에 인터럽트를 통해 간접적으로 타이머가 완료되었음을 알 수 있습니다. 하지만 인터럽트가 "언제나" 가능하지는 않기 때문에, 직접 카운터 0를 읽어서 처리하는 함수를 만들었습니다. 처음 작성한 코드는 대략 아래와 같았습니다.


실행해보니 뭔가 이상했습니다. 함수를 실행하자마자 루프를 바로 빠져나왔기 때문입니다. 이상해서 곰곰히 코드를 보고 있었는데 도무지 감을 잡을 수가 없었습니다. 그러던 중... 갑자기 머리를 팍~!! 하고 뭔가 스쳤습니다. 차를 구할 때 이전 값보다 현재 값이 크다고 생각했기 때문에, (현재 값 - 이전 값)으로 구했는데.... 타이머의 카운터는 증가하는 것이 아니라 1씩 감소했던 겁니다. 즉 이전 값이 현재 값보다 더 크다는 것이지요. ㅠㅠ 코드가 제대로 동작하려면 아래와 같이 순서를 바꿔야 합니다.


어흑... 이것 때문에 몇시간을 날렸는지 모르겠네요. 이것 말고도 손가락으로 초를 쟀다가 시계의 초보다 1.5배는 빨리 카운팅해서... ㅠㅠ 디버깅을 계속한 걸 생각하면... 흑흑... ㅠㅠ 왜 손가락으로 카운팅하는 속도와 초침이 움직이는 속도가 같다고 생각했는지... ㅠㅠ

그래도 어떻게든 해결했으니 다행입니다. 에궁... 이번 주 안에 RTDSC랑 RTC 쪽도 끝내려고 하는데... 시간이 될런지 모르겠군요. 이번 주도 미친듯이 집에 일찍 와야겠습니다.

다들 좋은 밤 되시고, 이번 주도 무사 칼퇴근하시기 바랍니다. ;) 야근불가~!!!

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

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

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

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

+ Recent posts