얼마 전에 쟁이님께서 최흥배님의 블로그를 소개시켜주셨습니다(쟁이님 감사합니다 ^^). 쟁이님의 블로그를 구경하다보니 Boost에 얼마나 심취해 계시는지 알겠더군요. C++11에도 관심이 많으신 것 같았습니다.


흥배님의 블로그를 둘러보다가 재미있는 링크를 발견했는데요, 온라인 게임 서버 개발자 모임이 바로 그 곳입니다. 게임 개발하시는 분들이 모여서 서로 정보를 공유하는 곳 같은데... 오프라인 세미나를 진행하고 그 내용도 차곡차곡 모아두었습니다. 나름 신선한 내용들이 많네요. ㅎㅎ


아래는 저를 충격에 빠뜨린 C++ 11에 대한 내용입니다. 여기서 C++ 익명 함수에 대한 내용을 처음봤는데, 자바나 루비와 비슷한 모습이어서 상당히 충격적이었습니다. 사실 자바나 루비에서 작업이 완료되었을 때 호출될 콜백 함수를 함수 파라미터로 전달하는 방식을 보고 C도 그런 방식으로 할 수 있으면 좋겠다는 생각을 했거든요. ^^



음... 언어가 서로 닮아가는 듯한 느낌도 들고... 재미있네요. ^^ 이제 언어 하나만 제대로 이해하면 다른 언어도 그냥 이해할 수 있는 세상이 열릴려나 봅니다(사실 그랬으면 좋겠어요 ㅠㅠ).


시간나실 때 한 번씩 보시면 좋을 것 같네요. >ㅁ<)-b

 에구에구... 오늘 교육 끝나고 집으로 쏜살같이 달려와서는 그 동안 마음에 걸렸던 부분들을 수정했습니다. 사실 더이상 손대기에는 시간도 부족하고, 목표로 정한 것이 있어서 더이상 구현만 할 수는 없었다는... ㅠㅠ 그래서 완성도는 약간 떨어지지만, 프로토타입을 완료했습니다. ㅎㅎ

 지금까지 진행된 것은 멀티 태스킹 + 파일 시스템 + 동적 메모리 관리 + GUI 시스템 + 기타 시리얼, 마우스, 하드 디스크 드라이버 등등 정도 입니다. 뭐 많이 하긴했는데, 적어놓고보니 별거 없군요. ㅠㅠ 아래는 1.0 버전의 스크린샷입니다.

 파일 시스템이 추가되어서 시리얼로 실행파일을 매번 전송해서 실행하는 번거로움이 없어졌습니다. "Application Pannel"에서 "GUI Shell"을 실행한 다음 루트 디렉토리에 있는 테트리스 실행파일을 load 명령으로 실행하면 테트리스가 실행됩니다. ^^)-b GUI 쉘은 화면을 지우는 cls 명령과 디렉토리를 표시하는 dir 또는 ls 명령만 가지고 있습니다. 

 기념삼아 프로토타입을 테스트할 수 있는 파일을 올립니다. 아래 파일을 다운 받으셔서 압축을 푸신 다음 "qemu64MyOs.bat" 파일을 실행하시면 됩니다. 


 아아~ 오늘도 늦게까지 작업했더니 피곤합니다. ㅠㅠ. 일찍 끝낼 수 있었는데 QEMU가 Single Core 모드로 동작할때 IOAPIC 쪽을 사용하지 않는 걸 몰라서 한참 삽질했습니다. ㅡ_ㅡa... 커널이 잘못된 줄 알고 2시간동안 갈아 엎었습니다. 디버그 코드 덕에 겨우 알았다는... 싱글 코어일때는 PIC를 그대로 쓰도록 바꿔놔야겠군요. ㅎㅎ

 이크~ 저는 이만 자야겠습니다. 다들 좋은 밤 되세요~ ㅎㅎ

 

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

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

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

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

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

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

 오늘도 집에 오자마자 컴퓨터를 키고 열심히 파일 시스템에 캐시를 추가하는 작업을 했습니다. 일단 어제 고민했던 문제 중에 FAT 영역 즉 클러스터 맵이 있는 영역에서 이상하게 캐시 히트가 낮게 나오는 문제를 뒤져봤는데... 역시나 문제가 있더군요. ㅎㅎ

 클러스터를 할당하는 코드가 클러스터 맵의 첫번째부터 마지막까지 검색하며 빈 클러스터를 찾게 되어있는데, 이런 경우 하드에 용량이 어느정도 차게되면 앞부분은 이미 대부분의 클러스터가 할당되어있음에도 불구하고 우직하게(?) 검색합니다. 따라서 클러스터 맵 영역의 캐시 또한 순차적으로 플러시되면서 거의 재사용되지 못하고 버려지게 되더군요.

 위와 같은 문제가 있어서 마지막으로 할당한 클러스터가 있는 클러스터 맵 인덱스를 저장하고, 클러스터 할당 요청이 올 때마다 가장 마지막으로 클러스터를 할당해준 클러스터 맵부터 검색을 시작하도록 수정했습니다. 이렇게 하니 거의 대부분 마지막으로 할당한 클러스터 맵에서 할당되서 거의 90%에 해당하는 캐시 히트가 나오더군요. 클러스터 맵을 쓰는 경우는 클러스터 할당/해제의 특성상 클러스터를 할당하려면 해당 맵을 읽어서 검색한 후, 할당했다고 마크를 해야하기 때문에 쓰는 경우는 100% 가 나왔습니다. 실로 엄청난 결과~!!! 이걸 실제 HDD에 적용할 경우 10번당 1번 하드를 읽는 것과 마찬가지기 때문에 시간을 엄청나게 절약할 수 있을 것 같습니다. >ㅁ<)-b

 하지만 이 기쁨도 잠시... 클러스터 영역을 캐시하는 기능도 추가했는데, 캐시 히트가... 20% 정도... ㅠㅠ 캐시 블럭의 개수를 128개 정도로 설정한 상태인데, 이를 더 늘리면 히트는 올라가겠지만 메모리 소모가 늘어나는 문제가 있기에 적당히 타협을 해야할 것 같습니다. 테스트 환경에서 캐시 블럭의 수를 2048개까지 늘리니까 40%까지는 히트가 올라가던데, 메모리 소모에 비해서 히트의 상승폭이 좀 낮아서 일단 다시 낮춰 놨습니다. 테스트는 가상으로 파일 3개를 만들고 랜덤한 파일 오프셋에서 랜덤한 사이즈를 읽고 쓰도록 하는 방법으로 하고 있는데, 아무래도 랜덤하게 읽고 쓰다보니 같은 클러스터가 다시 쓰이는 경우가 적은 것도 하나의 이유인 듯 합니다. 좀 더 고민해보고 캐시 블럭의 개수를 결정해야겠습니다. >ㅁ<)-b

 뭐든 구현하고 테스트할 때가 제일 재미있는 것 같습니다. 특히나 오늘처럼 예상하지 못한 결과가 나왔을 때는 더 즐겁습니다. 하핫~!!!
 헛.. 글고보니 내일은 고향에 가야되는데... 또 이렇게 시간이... ㅠㅠ 그만 자야겠습니다
 다들 좋은 밤 되세요. >ㅁ<)/~~


 어이쿠 또 시간이 이렇게나 흘렀군요. ㅠㅠ 방금 파일 시스템에 FAT(File Allocation Table) 영역에 해당하는 부분에 캐시 버퍼를 추가했는데, 대충 캐시 히트률이 60% 정도 나왔습니다. 생각보다 좀 저조한듯 하기도 하고... 일단 Sequential Write를 랜덤하게 돌려서 쓰고 읽고 검증하는 테스트를 돌리고 있는데, 에러가 안나오는거 보면 큰 문제는 없는 것 같습니다. 약간 문제라면... 캐시 히트률이 좀 낮은 게 문제라면 문제랄까요? ^^;;;;

 일단 캐시 알고리즘은 LRU(Least Recently Used)을 선택했고, Dirty 비트를 추가해서 Dirty 또는 Clean 중에 왠만하면 Clean인 놈을 선택하도록 했습니다. 물론 단순히 Age 만을 비교하는 것도 괜찮지만, 만약 쓰기가 수행된 캐시 버퍼 즉 Dirty 비트가 켜진 캐시 버퍼를 선택하게 되면 하드에 한번 더 써야하는 문제가 발생할 수 있어서 Clean을 우선적으로 선택하게 만들었습니다. Clean 인 놈은 쓰기가 수행되지 않고 읽기만 수행된 버퍼기 때문에 플러쉬(캐쉬에서 내보낼때)할 때 HDD에 안써도 되기 때문이지요. ㅎㅎ

 아흑... 원래는 더 일찍 끝났어야 하는데, lseek를 추가한다고 시간이 이렇게 흘러버렸군요. 처음에 예상했던 크기보다 점점 커지고 있어서 살짝 걱정이 됩니다. 어휴... 이걸 어떻게 해야될지... ㅠㅠ 그래도 일단 하던 작업은 끝내는게 맞는 듯 하니 이것까지만 해야겠습니다. ^^;;;

 내일은 알고리즘을 좀 손보고 데이터가 있는 클러스터 영역을 캐싱하는 기능도 추가해야겠습니다. 그리고 OS에 바로 옮겨봐야겠군요. ㅎㅎ 살짝 기대가 된다는... 과연 캐시를 사용하는 것과 사용하지 않는 것이 가상 머신에서 어떻게 차이가날지... 완전 기대됩니다. ㅎㅎㅎ

 그럼 내일 출근을 위해 전 이만 취침하러... ㅎㅎ
 다들 좋은 밤 되시길~ ;)


 주말 동안 쉬엄 쉬엄 파일 시스템을 설계했습니다. FAT 파일 시스템처럼 클러스터의 링크 형태로 말이지요. ^^ 최대한 간단하게 구현하려고 디렉토리 구조는 더욱 더 단순화시켰습니다. 그리고 코딩에 들어갔는데, 구현 초기에는 쉽게 쉽게 끝나는가 싶더니... 결국 또 복잡해지더군요.

 일단 멀티 태스크나 멀티 코어 환경에서 동기화 문제는 고려하지 않고, 단순히 파일 및 디렉토리 관련 API 만 만드는데, 꼬박 이틀이 걸렸습니다. 사실 API는 간단하게 만들고, 응용 프로그램이 잘 알아서 쓰도록하면 정말 간단한 구조를 유지할 수 있는데... 욕심이 생기다보니 이것 저것 많이 만들었습니다. 끄응.... ㅡ_ㅡa...

 덕분에 쓰기는 편해졌습니다만... 설명할게 많아져서 고민입니다. 현재 opendir, readdir, rewinddir, closedir, openfile, readfile, writefile, closefile, rewindfile, createfile, deletefile, createdirectory, deletedirectory까지 만들어져 있는데, 소스가 장난이 아니네요. 클러스터를 걸치는 녀석들 읽는거 처리하랴, Path 관련 처리하랴... 어휴... ㅠㅠ 하는 김에 rewindfile은 좀 더 고민해서 lseek로 만들어야겠습니다. 원래 lseek는 고려하지 않았지만... 만들다 보니 lseek 빼고는 다 만들었군요. ㅡ_ㅡa...

 만들긴 했는데... 과연 이 API가 얼마나 사용될지.... 삽질한건 아닌가 걱정이됩니다. ㅠㅠ
 억... 또 벌써 시간이 이렇게 됬군요.

 다들 좋은 밤 되시길.... ^^)-b

 ps) 아흑... 파일 동기화 문제는 또 어떻게 해결하지... ㅠㅠ


 아이쿠... 원래 계획은 좀 더 진도를 나가는 거였는데... 그 동안 무리를 좀 했더니 저녁에 잠깐 졸았습니다. 한 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) 헛... 이런 잠결에 만들다보니 화면에 있는 이미지 뷰어에 스펠링이 틀렸군요. 이런 ㅠㅠ

 헉헉... 아이구 머리야... 예전에 만든 소스를 긁어다 붙이는 것도 힘들군요. ㅎㅎ 금방 끝날줄 알았는데... 벌써 시간이 이렇게... 일단 아래는 실행한 화면입니다. 아직 프로토타입의 형태라서 버그도 좀 있고, 상태도 별로 안좋습니다. ㅎㅎ


 자세한 내용은 내일 올리겠습니다. 좀 늦어서... ㅠㅠ)-b
 그럼 다들 좋은 밤 되세요 >ㅁ<)-b



 다들 즐거운 추석 연휴를 보내시고 계신가요? ㅎㅎ 저는 할머니댁에 당일치기로 갔다오는 바람에 시간이 많이 남아서 오늘도 어김없이 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



 
 삽질을 끊임없이 한 결과(??) 64bit + Dual Core + Symmetric I/O System 까지 진행했습니다. 일단 다른 Core도 깨워서 64bit Mode로 전환시켜놨고, Interrupt 처리는 IO APIC와 APIC를 손봐서 두 Core에 Broadcasting 하도록 설정했습니다.

 Interrupt가 두 Core에 모두 전달되니, 서로 Interrupt를 처리하겠다고 경쟁하게 되더군요.  키보드 버퍼에 이상한 값이 들어가고 버퍼를 잘못 건드려 엉망이 됬습니다. 그래서 Spin Lock으로 먼저 Interrupt Handler에 접근한 Core가 처리하고 다른 Core는 그냥 End Of Interrupt만 송신하도록 했더니 나름대로 잘 동작합니다. >ㅁ<)/~ 이렇게 하는게 정석인지는 모르겠습니다만... 별 문제 없으니 그냥 패스.. ^^;;; 나중에 시간나면 Linux쪽에서 처리하는 방식을 한번 봐야겠군요(혹시 Linux의 Symmetric I/O 처리에 대해서 아시는 분 덧글 부탁드립니다 ㅠㅠ)-b ).

 아래는 Qemu에서 동작시킨 화면입니다. "showinterruptcount" 명령으로 각 Core가 Keyboard Interrupt를 얼마나 처리했는가를 표시했는데, 비슷하게 나오는군요. 의도하지 않은 Load Balancing이... ^^;;; 아직은 Cache 관련 부분이 Disable 되어 동작합니다.
사용자 삽입 이미지

 여기까지 해놓고 Cache를 Enable 하려니 IO APIC 및 APIC가 Memory Mapped I/O 방식으로 되어있어서 이 영역을 Cache가 불가능하게 설정해야 하더군요. 그래서 INTEL 문서를 뒤져보니 MTRR(Memory Type Range Register)를 사용해야한다고 나와있었습니다. ㅡ_ㅡa... 이것만 할게 아니라 CR0와 Page Table쪽도 다 같이 변경해줘야하고, 다른 쪽 Core 또한 같은 MTRR 설정값을 공유해야하는 문제가... 그래서 잠시 보류했습니다. ^^;;;;

 이거 생각 좀 해보고 넣어야겠군요. Cache를 활성화한다고 가상머신에서 돌아가는 OS가 크게 빨라질까 하는 생각도 들고... 차라리 Cache를 다 날려버리고 간단하게 구현하는게 더 나을지도 모른다는 생각이 계속 머리에서 맴돌아서... ㅠㅠ...

 자료가 별로 없어서 무한 테스트로 자료를 만드는데... 완전 죽음입니다. ㅠㅠ 아흑... 진도도 빨리 안나가고... 그래도 많이 왔네요. ㅠㅠ)-b 조금만 더 파보면 본격적인 작업(??)을 진행할 수 있을 것 같습니다. ;)

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



 

몇시간 삽질 끝에 드디어 가상 HID(Virtual HID)를 완성했습니다. ^^)/~ 약간 문제가 있긴 하지만 그래도 동작은 하니... ^^;;;;; 하나의 드라이버로 동작하게 할 생각이었습니다만은 보안 프로그램에 따라 특색이 조금씩 달라서 결국 포기했습니다.

이게 희한한게... 하나는 완전히 내렸다가 새로 올리고 다른 하나는 아예 그냥 잘라버립니다. ㅡ_ㅡa... 이것 참... 그래서 한쪽에 맞춰두면 다른 한쪽에서 문제가 발생하더군요. 결국 두가지 버전으로 구성했습니다. 이렇게 되면 버전관리가 힘든데... 흑흑.... ㅜ_ㅜ 어쩔수 없지요 ㅜ_ㅜ...

대충 키보드/마우스 이벤트를 넣어보고 정리하려고 키보드 쪽을 유심히 봤더니, HID 키보드의 값과 전통적으로 사용하는 스캔 코드(Scan Code)의 값이 서로 다르더군요. @0@)/

결국 기존의 LIbrary가 스캔 코드 값을 받도록 되어있었기에, 호환성 유지를 위해 HID 값으로 바꿔줘야 했습니다. 결국 Mapping Table을 만들어야 한다는 이야기!!! 그래도 구글신이 도와주셔서 괜찮은 문서를 구했고, 삽질 끝에 맵핑 테이블을 완성했습니다. ^^)/~

아아~ 일단 만들었으니 내일 테스트 해야겠습니다. ^^)/~ 다들 좋은 밤 되시길~

translate.pdf
0.13MB

문서와 Mapping Table 첨부합니다. ^^)/~

/*Key Name        PS/2 Set 1 Make*        HID Usage ID */    
{/*    DO NOT USE    0x00    */    0x00    ,
/*    Escape    0x01    */    0x29    ,
/*    1 !    0x02    */    0x1E    ,
/*    2 @    0x03    */    0x1F    ,
/*    3 #    0x04    */    0x20    ,
/*    4 $    0x05    */    0x21    ,
/*    0.05    0x06    */    0x22    ,
/*    6 ^    0x07    */    0x23    ,
/*    7 &    0x08    */    0x24    ,
/*    8 *    0x09    */    0x25    ,
/*    9 (    0x0A    */    0x26    ,
/*    0 )    0x0B    */    0x27    ,
/*    - _    0x0C    */    0x2D    ,
/*    = +    0x0D    */    0x2E    ,
/*    Backspace    0x0E    */    0x2A    ,
/*    Tab    0x0F    */    0x2B    ,
/*    q Q    0x10    */    0x14    ,
/*    w W    0x11    */    0x1A    ,
/*    e E    0x12    */    0x08    ,
/*    r R    0x13    */    0x15    ,
/*    t T    0x14    */    0x17    ,
/*    y Y    0x15    */    0x1C    ,
/*    u U    0x16    */    0x18    ,
/*    i I    0x17    */    0x0C    ,
/*    o O    0x18    */    0x12    ,
/*    p P    0x19    */    0x13    ,
/*    [ {    0x1A    */    0x2F    ,
/*    ] }    0x1B    */    0x30    ,
/*    Return    0x1C    */    0x28    ,
/*    Left Control    0x1D    */    0xE0    ,
/*    a A    0x1E    */    0x04    ,
/*    s S    0x1F    */    0x16    ,
/*    d D    0x20    */    0x07    ,
/*    f F    0x21    */    0x09    ,
/*    g G    0x22    */    0x0A    ,
/*    h H    0x23    */    0x0B    ,
/*    j J    0x24    */    0x0D    ,
/*    k K    0x25    */    0x0E    ,
/*    l L    0x26    */    0x0F    ,
/*    ; :    0x27    */    0x33    ,
/*    ' "    0x28    */    0x34    ,
/*    ` ~    0x29    */    0x35    ,
/*    Left Shift    0x2A    */    0xE1    ,
/*    \ |    0x2B    */    0x31    ,
/*    Europe 1 (Note    0x2B    */    0x32    ,
/*    z Z    0x2C    */    0x1D    ,
/*    x X    0x2D    */    0x1B    ,
/*    c C    0x2E    */    0x06    ,
/*    v V    0x2F    */    0x19    ,
/*    b B    0x30    */    0x05    ,
/*    n N    0x31    */    0x11    ,
/*    m M    0x32    */    0x10    ,
/*    , <    0x33    */    0x36    ,
/*    . >    0x34    */    0x37    ,
/*    / ?    0x35    */    0x38    ,
/*    Right Shift    0x36    */    0xE5    ,
/*    Keypad *    0x37    */    0x55    ,
/*    Left Alt    0x38    */    0xE2    ,
/*    Space    0x39    */    0x2C    ,
/*    Caps Lock    0x3A    */    0x39    ,
/*    F1    0x3B    */    0x3A    ,
/*    F2    0x3C    */    0x3B    ,
/*    F3    0x3D    */    0x3C    ,
/*    F4    0x3E    */    0x3D    ,
/*    F5    0x3F    */    0x3E    ,
/*    F6    0x40    */    0x3F    ,
/*    F7    0x41    */    0x40    ,
/*    F8    0x42    */    0x41    ,
/*    F9    0x43    */    0x42    ,
/*    F10    0x44    */    0x43    ,
/*    Num Lock    0x45    */    0x53    ,
/*    Scroll Lock    0x46    */    0x47    ,
/*    Keypad 7 Home    0x47    */    0x5F    ,
/*    Keypad 8 Up    0x48    */    0x60    ,
/*    Keypad 9 PageUp    0x49    */    0x61    ,
/*    Keypad -    0x4A    */    0x56    ,
/*    Keypad 4 Left    0x4B    */    0x5C    ,
/*    Keypad 5    0x4C    */    0x5D    ,
/*    Keypad 6 Right    0x4D    */    0x5E    ,
/*    Keypad +    0x4E    */    0x57    ,
/*    Keypad 1 End    0x4F    */    0x59    ,
/*    Keypad 2 Down    0x50    */    0x5A    ,
/*    Keypad 3 PageDn    0x51    */    0x5B    ,
/*    Keypad 0 Insert    0x52    */    0x62    ,
/*    Keypad . Delete    0x53    */    0x63    ,
/*    UNASSIGNED    0x54    */    0x00    ,
/*    UNASSIGNED    0x55    */    0x00    ,
/*    Europe 2 (Note    0x56    */    0x64    ,
/*    F11    0x57    */    0x44    ,
/*    F12    0x58    */    0x45    ,
/*    Keypad =    0x59    */    0x67    ,
/*    UNASSIGNED    0x5A    */    0x00    ,
/*    UNASSIGNED    0x5B    */    0x00    ,
/*    Keyboard Int'l 6    0x5C    */    0x8C    ,
/*    UNASSIGNED    0x5D    */    0x00    ,
/*    UNASSIGNED    0x5E    */    0x00    ,
/*    UNASSIGNED    0x5F    */    0x00    ,
/*    DO NOT USE    0x60    */    0x00    ,
/*    DO NOT USE    0x61    */    0x00    ,
/*    UNASSIGNED    0x62    */    0x00    ,
/*    UNASSIGNED    0x63    */    0x00    ,
/*    F13    0x64    */    0x68    ,
/*    F14    0x65    */    0x69    ,
/*    F15    0x66    */    0x6A    ,
/*    F16    0x67    */    0x6B    ,
/*    F17    0x68    */    0x6C    ,
/*    F18    0x69    */    0x6D    ,
/*    F19    0x6A    */    0x6E    ,
/*    F20    0x6B    */    0x6F    ,
/*    F21    0x6C    */    0x70    ,
/*    F22    0x6D    */    0x71    ,
/*    F23    0x6E    */    0x72    ,
/*    UNASSIGNED    0x6F    */    0x00    ,
/*    Keyboard Intl'2    0x70    */    0x88    ,
/*    UNASSIGNED    0x71    */    0x00    ,
/*    UNASSIGNED    0x72    */    0x00    ,
/*    Keyboard Int'l    0x73    */    0x87    ,
/*    UNASSIGNED    0x74    */    0x00    ,
/*    UNASSIGNED    0x75    */    0x00    ,
/*    F24    0x76    */    0x73    ,
/*    Keyboard Lang 4    0x77    */    0x93    ,
/*    Keyboard Lang 3    0x78    */    0x92    ,
/*    Keyboard Int'l4    0x79    */    0x8A    ,
/*    DO NOT USE    0x7A    */    0x00    ,
/*    Keyboard Int'l5    0x7B    */    0x8B    ,
/*    DO NOT USE    0x7C    */    0x00    ,
/*    Keyboard Int'l2    0x7D    */    0x89    ,
/*    Keypad ,Brazilian Keypad    0x7E    */    0x85    ,
/*    DO NOT USE    0x7F    */    0x00    }

 오늘 무슨 행사를 한다길래 그냥 앉아 있으면 되는 줄 알고 어제 2시까지 코드를 만지다가 잤습니다. ㅡ_ㅡa... 아 이거 원... 거의 다 됬는데 진짜 한끗 차이로 모 보안 프로그램에 걸리더군요. ^^;;; 사실 걸린다는 표현보다는 이녀석이 HID Keyboard Driver를 내려버린다는 말이 더 맞는 것 같습니다. 그래서 키보드 입력이 안되는 문제가.... ^^;;;;

 그래서 이걸 해결하려고 이것 저것 손보다보니 2시 넘어서 잤습니다. 그래도 일은 안하니까 좀 편한 마음으로 잤지요. 그런데 이게 왠일입니까? 노가다를 시키는 것이 아니겠습니까? ㅜ_ㅜ)/~ 아흑... 잠도 별로 못잤는데 땀 뻘뻘 흘리면서 이상한 걸 했더니 나중에는 머리가 다 아프더군요. 지금도 지끈 거리는 상탭니다. ㅜ_ㅜ....

 불행은 이 상태에서 다시 코드를 보고 있다는 것이고, 그나마 다행인 점은 칼퇴근을 해서 좀 쉬었다는 겁니다. ㅎㅎ 아유... 진짜 머리 아프네요. ^^;;; 당췌 어떻게 해야 해결할 수 있을지....

 오늘도 열심히 한번 파봐야겠습니다. 뭐라도 나오겠지요 ^^)/~
 그럼 다들 좋은 밤 되시길~


 흑흑... 이게 얼마만인지 모르겠습니다. ㅜ_ㅜ)-b 쌩판 모르는 상태로 HID 드라이버를 손보기 시작해서 키보드와 마우스를 생성하기까지 한참 걸렸고, 보안 프로그램에 걸려서 이걸 피해 가는데 또 한참 걸렸네요.

 ㅜ_ㅜ 아아~ 진짜 ㅡ_ㅡa... 간단히 쓸 수 있는 API를 막아놔서 다른 방법을 찾는다고 고생했습니다.  ㅜ_ㅜ 제가 아는 범위에서 테스트 안해본 케이스가 거의 없을 정도로 오만가지를 다 썼는데... 결국 간단한 아이디어로 해결... ^^;;; 그것도 놀다가 깜짝 떠올라서... ㅎㅎㅎ(역시 인생은 타이밍~!!!). 아이디어는 어쩔 수 없이 비공개... 왠지 하면 큰일날듯해서 ^^;;;;;

 가상 HID 드라이버가 HID miniport 드라이버이다 보니 이것저것 제약사항이 많더군요. 뭐 하나 제대로 할 수 있는 것도 없고... 툭하면 재부팅되기 일수이고... 평일 저녁시간과 주말 일부를 올인해서 겨우 해결했습니다. 방금 테스트했는데 큰 문제가 없는 것 같네요. ^^)/~~~

 이제 더러워진 드라이버 코드를 좀 정리하고, 약간 테스트만 더하면 끝날 것 같습니다. 어휴~ 이번 주는 따로 스케줄이 있어서 내일 말고는 시간이 없을 듯한데, 내일 저녁에 완전히 끝내 놓야겠군요. ^^;;;; 어휴... 죽는 줄 알았습니다. 어휴~ 진짜... @0@)/~!!!

 덕분에 HID에 대해서 공부 한번 제대로 했습니다(정말? ㅡ_ㅡa..). 역시 DDK만한게 없군요. 최고입니다. ㅎㅎ DDK 만세~~
 그럼 다들 좋은 밤 되세요 ;)

ps) 이런... ㅡ_ㅡa... 한쪽은 또 다른 수를 써놓았군요. ㅡ_ㅡ;;; 좀 더 파봐야 할 것 같습니다. ㅜ_ㅜ 아우~ 진짜... ㅜ_ㅜ)/~

 어제 갑자기 책 한권 써보는게 어떨까하는 생각이 들었습니다. 뭐 미치지 않고서야 이런 생각을 하겠냐만, 마이크로소프트웨어에 올리기에는 좀 복잡하고 양이 많다고 생각하고 있던 주제라서... ^^;;;; 해당 주제에 관한 자료가 인터넷에서 찾기 힘들 뿐더러, 실제로 구현된 사례도 그리 많지 않은 것 같더라구요. ^^;;;;

 일단 될지 안될지는 모르겠지만 한번 출판사에 연락을 취해볼 생각입니다. 기획쪽이나 그런 곳에 연락을 취하면 되겠지요. ㅎㅎ 주제나 자세한 내용은 일단 결정이 나면 올리겠습니다. ^^;;;;

 아아~ 이거 오늘은 작업을 하나도 못하고 그냥 자겠군요. 빨리 가상 HID 드라이버도 완성해야하는데... ㅎㅎ 내일 해야겠습니다. ^^)/~

 그럼 다들 좋은 밤 되세요 ^^)/~
 오늘 테스트하는데 스캔 코드(Scan Code)가 필요해서 찾다보니 아주 깔끔하게 정리된 내용을 발견했습니다. 원문은 http://blog.naver.com/jesuskth?Redirect=Log&logNo=20005262457에서 보실 수 있습니다.

Const SCANKEY_ESC = 1

Const SCANKEY_1 = 2             ' 1
Const SCANKEY_2 = 3             ' 2
Const SCANKEY_3 = 4             ' 3
Const SCANKEY_4 = 5             ' 4
Const SCANKEY_5 = 6             ' 5
Const SCANKEY_6 = 7             ' 6
Const SCANKEY_7 = 8             ' 7
Const SCANKEY_8 = 9             ' 8
Const SCANKEY_9 = 10            ' 9
Const SCANKEY_0 = 11            ' 0
Const SCANKEY_MINUS = 12        ' -
Const SCANKEY_EQUAL = 13        ' =
Const SCANKEY_BS = 14           ' ←

Const SCANKEY_TAB = 15          'TAB
Const SCANKEY_Q = 16            ' Q
Const SCANKEY_W = 17            ' W
Const SCANKEY_E = 18            ' E
Const SCANKEY_R = 19            ' R
Const SCANKEY_T = 20            ' T
Const SCANKEY_Y = 21            ' Y
Const SCANKEY_U = 22            ' U
Const SCANKEY_I = 23            ' I
Const SCANKEY_O = 24            ' O
Const SCANKEY_P = 25            ' P
Const SCANKEY_SQUARE_OPEN = 26  ' [
Const SCANKEY_SQUARE_CLOSE = 27 ' ]
Const SCANKEY_ENTER = 28        ' ENTER

Const SCANKEY_CTRL = 29         ' CTRL
Const SCANKEY_A = 30            ' A
Const SCANKEY_S = 31            ' S
Const SCANKEY_D = 32            ' D
Const SCANKEY_F = 33            ' F
Const SCANKEY_G = 34            ' G
Const SCANKEY_H = 35            ' H
Const SCANKEY_J = 36            ' J
Const SCANKEY_K = 37            ' K
Const SCANKEY_L = 38            ' L
Const SCANKEY_SEMICOLON = 39    ' ;
Const SCANKEY_QUOTATION = 40    ' '

Const SCANKEY_QUOTATION2 = 41   ' `
Const SCANKEY_LSHIFT = 42       ' LEFT SHIFT
Const SCANKEY_WON = 43          ' \

Const SCANKEY_Z = 44            ' Z
Const SCANKEY_X = 45            ' X
Const SCANKEY_C = 46            ' C
Const SCANKEY_V = 47            ' V
Const SCANKEY_B = 48            ' B
Const SCANKEY_N = 49            ' N
Const SCANKEY_M = 50            ' M
Const SCANKEY_COMMA = 51        ' ,
Const SCANKEY_PERIOD = 52       ' .
Const SCANKEY_SLASH = 53        ' /
Const SCANKEY_RSHIFT = 54       ' RIGHT SHIFT

Const SCANKEY_PRTSC = 55        ' PRINT SCREEN SYS RQ
Const SCANKEY_ALT = 56          ' ALT
Const SCANKEY_SPACE = 57        ' SPACE
Const SCANKEY_CAPS = 58         ' CAPS
Const SCANKEY_F1 = 59           ' F1
Const SCANKEY_F2 = 60           ' F2
Const SCANKEY_F3 = 61           ' F3
Const SCANKEY_F4 = 62           ' F4
Const SCANKEY_F5 = 63           ' F5
Const SCANKEY_F6 = 64           ' F6
Const SCANKEY_F7 = 65           ' F7
Const SCANKEY_F8 = 66           ' F8
Const SCANKEY_F9 = 67           ' F9
Const SCANKEY_F10 = 68          ' F10
Const SCANKEY_NUM = 69          ' NUM ROCK
Const SCANKEY_SCROLL = 70       ' SCROLL ROCK

Const SCANKEY_GRAY_HOME = 71    ' 키패드
Const SCANKEY_GRAY_UP = 72
Const SCANKEY_GRAY_PGUP = 73
Const SCANKEY_GRAY_MINUS = 74
Const SCANKEY_GRAY_LEFT = 75
Const SCANKEY_GRAY_CENTER = 76
Const SCANKEY_GRAY_RIGHT = 77
Const SCANKEY_GRAY_PLUS = 78
Const SCANKEY_GRAY_END = 79
Const SCANKEY_GRAY_DOWN = 80
Const SCANKEY_GRAY_PGDN = 81
Const SCANKEY_GRAY_INS = 82
Const SCANKEY_GRAY_DEL = 83

Const SCANKEY_F11 = 87          ' F11
Const SCANKEY_F12 = 88          ' F12


 와우~ 이번에 모 드라이버들이 업데이트가 좀 되서 애를 좀 먹었습니다. ^^;;; 리버싱을 해서 분석하는게 아니라 윈도우 커널이 어떻게 변경되는가를 보고 추측(?)해서 작업하기 때문에 테스트 케이스를 상당히 많이 만들어두는 편입니다.

 어떤 케이스가 무사히 통과할지는 모르는거니까, 상당한 노가다가 필요한 작업이지요. ㅜ_ㅜ)/~ 이거 테스트할려고 오늘 퇴근도 일찍했는데, 나름 보람있군요. ㅎㅎ 잘 돌아가는 걸 확인하고 나니 뿌듯합니다.

 이제 슬슬 정리하고 쉬어야겠습니다. 간만에 머리를 굴렸더니 다리(??)가 아프네요(저도 이유를 모르겠습니다. 이게 무슨... ㅡ_ㅡa...).

ps) 이럴줄 알았으면 툴을 좀 많이 만들어 두는 건데... 이번 주말에 신경 좀 써서 노가다를 피하는 방향으로 좀 가야겠군요. ;)
 아아~ 이거 힘드네요. ㅜ_ㅜ 일단 RSS를 통해 티스토리에서 댓글만 뽑아내려고 했는데, 잘 안되서 파이썬으로 파싱하는 걸로 방향을 바꿨습니다. 파이썬 라이브러리 중에 Beautiful Soup를 사용해서 간단히 파싱하여 댓글을 추출하는 것까지는 금방했습니다.

 그런데 문제는 UTF-8로 인코딩된 웹페이지를 파일로 저장하려니 ASCII로 저장하는 것이 기본인지 저장할 수 없다는 에러가.... 이렇게 황당한 일이... ㅡ_ㅡa... 파이썬을 쓰면서 한글 처리를 별로 안해서 크게 불편함을 몰랐는데, 이번에 제대로 걸렸네요. ㅜ_ㅜ

 이래 저래 해보다가 결국 포기 ㅜ_ㅜ)/~ 차라리 티스토리에 웹페이지를 하나 더 넣어서 댓글만 표시하게 하는게 더 편하겠습니다. ㅜ_ㅜ)/~

 댓글 추출하는 소스는 만든게 아까워서 올려놓습니다. 애휴... 밥이나 먹어야겠군요. ㅜ_ㅜ)/~




 ps) 아아... 이게 무슨 삽질인지... 쉽게 처리하는 방법을 아시면 댓글로 제보 부탁드립니다.


 윈도우즈 업데이트 파일에서 실제 패치 파일을 추출할 수 있다고 합니다. 지금까지 윈도우즈 업데이트 파일은 파일을 직접 덮어쓰거나 수정해주는 통짜 덩어리인줄 알았더니, 그 안에 세부파일이 나누어져 있나보군요. ;)

 원문은 http://fullc0de.egloos.com/3645611 에서 보실 수 있으며, 중요한 내용만 인용하면 아래와 같습니다.
1. MS 보안업데이트 사이트를 방문해서 패치 인스톨러(보통 실행파일 형태죠)를 다운로드 합니다.
2. 커멘드 라인에서 /x:output 파라메터를 주고 실행합니다. 그럼 패치가 실행되지 않고 압축이 풀립니다.
3. 크게 두 개의 디렉토리가 있는데 SP2GDR 디렉토리로 들어가시면 됩니다. 아.. 물론 제 컴이 SP2라서 -_-;;;
   (GDR은 retail이나 OEM버전을 뜻하고 QFE는 checked/debug 버전을 뜻합니다.)
4. GDR 디렉토리에 들어가시면 패치되는 파일의 목록을 만나실 수 있습니다. ㅋㅋㅋ
5. 그다음 분석 고고씽~
 
 패치 파일을 잘 분석하면 역으로 패치 이후 취약해진 점을 빨리 찾을 수 있을지도 모르겠군요. ^^  이미 다른 분들은 다 아시는 내용인데, 왠지 뒷북성 포스트일지도... ㅎㅎ

 그럼 다들 좋은 밤 되시길~ ;)



 오늘 블로그 스킨을 바꾸고 나니 다른 것은 그럭저럭 마음에 드는데, 사이드바와 본문의 위치가 마음에 들지 않았습니다. 스킨 위저드에서 사이드바와 본문의 위치를 바꾸는 항목은 없더군요. 그래서 스킨 편집HTML/CSS 수정으로 가서 style.css 파일을 조금 손봤습니다.

 의외로 아주 간단하게 되어있더군요. 아래의 소스코드에서 content.sidebar 항목의 left와 right만 바꾸면 원하는 위치에 본문과 사이드바를 둘 수 있습니다.

 content는 본문의 위치를 나타내고 .sidebar는 사이드바의 위치를 나타냅니다. ;)
 진작 바꿀껄~ 괜히 마음 고생만 했네요 ^^)/~


 어제 밤부터 DevkitPro와 VS2005 간의 DLL 문제(아마..) 때문에 시름하고 있습니다. ㅜ_ㅜ... 분명 Visual Studio 2005를 설치하기전에는 괜찮았는데 설치하고 난 뒤에 컴파일을 했더니 아래와 같은 오류가 발생합니다. ㅜ_ㅜ DLL을 덮어씌워보고 했는데도 계속 같은 오류가 발생하는군요.

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

 아아... 이거 원... ㅡ_ㅡa... 어떻게 해결해야할지... 답답합니다. ㅜ_ㅜ)/~ 혹시 누가 아시는분 있으시면 답글로 제보 부탁드립니다. ^^)/~

 그럼 좋은 주말 보내세요 ;)


 화요일쯤에 RSS를 돌다가 재미있는 글을 찍어놨는데, 오늘에야 겨우 읽어봤습니다.Cell Processor를 제대로 활용하기 위해서 프로그래밍을 어떻게 해야하는가에 대한 내용을 간략하게 설명해 놓은 글인데, 원문은 http://www.ddj.com/hpc-high-performance-computing/197801624 에서 볼 수 있습니다.
사용자 삽입 이미지

Mercury사에서 팔고있는 PCI Cell Accelerator Board


 PS3에 사용된 Processor가 Cell Processor인 관계로 한번쯤은 다들 들어보셨을 것이라 생각합니다. 저도 "엄청난 성능을 내는 괴물" 정도로 생각하고 있었는데, 찾아보니 자세한 Spec이 나오더군요(Spec은 http://www.mc.com/uploadedfiles/Cell_accelerator_board.pdf 에서 볼 수 있습니다). 문서를 보면 총 9개의 Processor와 그것들을 연결해 주는 Bus로 구성된다는 것을 알 수 있습니다.

* The Power™ processing element (PPE) has dual hardware multithreading and a standard VMX vector processing engine. It has separate 32 KB L1 data and instruction caches and 512 KB of L2
cache. The processing power of the PPE is in addition to the 180 GFLOPS from the SPE array.
* In the array of eight synergistic processing elements (SPEs), each has a dual-issue pipeline, a 128-bit-wide vector processing engine, a very large register set (128 registers, each 128 bits wide), and 256 KB of local store (LS). Each SPE accesses system memory via its memory flow controller (MFC), which is a high-performance
DMA engine.
* A high-speed data ring called the element interconnect bus (EIB) consists of two pairs of counter-rotating rings with a sustained aggregate bandwidth of 180 GB/s.

 좀 복잡한 구조를 가지고 있는 듯 한데, 아래의 블럭 다이어그램을 보시면 이해하는데 도움이 되실겁니다.
사용자 삽입 이미지

 원문에서는 BFS(Breath First Search)를 예로 들어 Cell Processor Programming에 대해서 설명하고 있습니다. 각 Processor에 Branch를 어떻게 할당하며, 공유된 Memory에 접근은 어떻게 하는가 등등에 대한 내용이더군요. 간단히 아래와 같이 요약하면 아래와 같습니다.

1. SPELocal Storage를 잘 이용하고
2. DMADouble Buffering을 이용해서 Data Transfer Time을 줄이며
3. Data Structure를 효율적으로 구성하라

 원문을 잘 찾아보면 IBM에서 제공하는 Cell Processor SDK의 링크도 찾아볼 수 있는데, Simulator도 포함하고 있다니 관심있으신 분은 환경을 구성해 보는 것도 좋을 듯 합니다(http://www-128.ibm.com/developerworks/power/cell/downloads.html?S_TACT=105AGX16&S_CMP=LP).

 Cell Processor가 좋긴 하지만, 병렬 처리(Parallel Processing)를 위한 Overhead가 있어서 좀 꺼려집니다. 하지만 Performance가 무엇보다 중요하다면 Cell Processor는 좋은 대안이 될 수 있을 것 같습니다. 무시무시한 성능을 낸다고 하니 나중에 시간나면 보드라도 하나 구매해야겠습니다. ^^;;;

 그럼 다들 좋은밤 되시길~ ;)


 회사에서 정리할 것이 있어서 고민 끝에 도쿠 위키(doku wiki)를 고르고 오늘 설치했습니다. 사실 뭐 설치랄 것도 없지요. ;) 그냥 http://kkamagui.tistory.com/421에 있는 파일을 다운받아서 압축을 푼다음 mapache.exe를 실행하면 됩니다. ^^)/~ 실행하면 아래와 같은 검은색 콘솔 화면이 표시됩니다.
사용자 삽입 이미지

 그후 브라우저를 띄워서 http://localhost:8800 으로 접근하면 위키에 접근할 수 있습니다. 접근하면 아래와 비슷한 화면이 표시되는데, 아래쪽에 "Edit this page" 버튼을 눌러서 편집할 수 있습니다. 위키 문법은 Search 창에서 Syntax로 검색하면 바로 찾을 수 있습니다. 물론 웹에도 많은 자료가 있지요 ;)
사용자 삽입 이미지

 작년부터 위키에 적는 습관을 들였더니, 이제는 어디다 적지 않으면 불안한 지경까지 왔습니다. ㅜ_ㅜ... 그래도 기록을 남긴다는 의미에서 보면 상당히 좋은 습관인 듯 합니다. 항상 뭘 까먹고 다니니까요 ^^;;;

 위키는 구조화된 문서를 아주 빨리 만들 수 있다는 것이 가장 큰 장점인 것 같습니다. 정말 프로그래머에게는 딱이네요. ^^)/~!!!

 도쿠 위키 만세~!!!

ps) 도쿠 위키는 섹션 에디팅 기능을 제공합니다. 즉 글이 길어질 경우에 헤드라인 별로 따로 편집할 수 있다는 이야기지요. 마치 위키피디아에서 사용되는 미디어위키처럼요 ;) 한번 시험삼아 써보시는 것도 괜찮을 것 같습니다.


 일단 어제 오늘 이틀동안 고민한 끝에 Doku Wiki를 사용하기로 했습니다. 데이터의 처리가 Full Text로 되어있는 점과 플러그인이 많은 점이 매력적이었습니다.

 다만 단점이라면 WYGWYG Editor가 좀 딸린다는 건데... 스프링노트를 쓰다 다시 넘어오니 심하게 불편하네요. ㅜ_ㅜ)/~ 그래도 일단 적응 되면 괜찮을 것 같으니 써보렵니다. ^^)/~

 아아~ 이제 한동안 걱정없겠군요. ;)

 ps) 아래는 Doku wiki의 Stand Alone 버전과 목차를 만들어 주는 플러그인입니다.
 인터넷 익스플로어에서 파이어폭스로 넘어온지 이제 한 6개월 정도가 됐습니다. 파이어폭스의 꽤 괜찮은 성능과 다양한 플러그인때문에 만족하면서 쓰고 있습니다. 하지만 Active X로 도배된 우리나라 사이트를 방문할때 불편한 것은 어쩔 수 없었습니다.

 그래서 플러그인 목록을 뒤졌는데, 재미있는 것을 발견했습니다. IE Tab이라는 것인데요, 이미 많은 분들이 쓰고 계시더군요(뒷북성 포스트를... ㅜ_ㅜ). 파일은 https://addons.mozilla.org/ko/firefox/addon/1419 에서 받을 수 있습니다. 설치를 끝내고 나면 마우스 오른쪽 버튼을 눌렀을때 아래와 같이 표시됩니다.

사용자 삽입 이미지

 상당히 좋네요~ ^ㅡ^)/~~ 대만족입니다~
 파이어 폭스 만세~!!!



 요즘 손끝이 저리고 몸이 좀 노곤했는데, 거북이 목 증상이 진행되고 있던 것은 아닌가 의심이 됩니다. ^^;;; 거북이 목의 증상에 손끝 저림, 어깨 결림, 안구 건조증, 손목 통증이 있던데... 정말 IT에 종사하는 분들께는 암과 같은 레벨이 아닐까 생각합니다. ㅜ_ㅜ..

 이러한 거분이 목 증후군을 해결하기위한 스트레칭이 나왔습니다. 다나와에서 만든 것 같네요 ^^)/~ 우리 모두 따라해 보아요~





 지난 번 위모트(Wii Remote)를 이용해서 멀티 터치 화이트 보드를 만드는 동영상( http://kkamagui.tistory.com/266 )을 만드신 분께서 새로운 동영상을 찍으셨습니다. 상당한 충격이었는데, 이분이 이번에는 헤드 트래킹(Head Tracking)을 이용해서 VR 디스플레이를 만드셨군요. 대단합니다. ㅜ_ㅜ=b

 이 분의 펜클럽이라도 만들어야겠습니다. 아주 그냥 신선한 아이디어가 흘러 넘치시는군요. ㅜ_ㅜ 게임 같은 것에 응용하면 상당히 괜찮겠네요. 저도 나중에 한번 시도해 봐야겠습니다. ^^;;;
 



 멀티 터치 화이트 보드를 만드는 동영상(http://kkamagui.tistory.com/266)을 보고 뽐뿌를 이기지 못해 질러버렸습니다. ㅜ_ㅜ... 아아 정말 이번 것은 굉장히 강력하더군요.

 PSP의 뽐뿌를 물리치고 바로 지르게 만드는 위모트... 개발 욕구가 불타서 이건 뭐.... 어쩔 수 없었습니다. 흑흑... 오늘 질렀으니 수요일이나 목요일쯤 되면 택배가 오겠네요. 나중에 CRT 모니터에 터치스크린을 구축할껀데, 잘되면 동영상이라도 하나 올리겠습니다.

 재미있는 장난감이 많아서 큰일났습니다. ㅜ_ㅜ... 살려주세요... ㅜ_ㅜ...
 아주 재미있는 글을 읽었습니다. 원문은 http://seanlab.net/tt/?TSSESSION=4d9631fd7eb152d6296d201e1f8a04db 에서 보실 수 있습니다.

 간단히 요약하면 아래와 같습니다.
도전을 해야하는 시기에 도전을 차일 피일 미루게 되면, 도전을 할 수 없는 이유들만 늘어가니, 일단 가볍게(??) 한발 먼저 들여놓고 그 뒤 올인(All-in) 하자.

 이 글을 읽으면서 상당히 공감이 되더군요. 사실 프로그래밍을 하던지 운동을 하던지... 도전의 연속이라고 생각합니다. 프로그래머라면 많은 것을 알아야하고 "배움" 자체가 하나의 도전인데, 저의 경우에는 하고있는 프로젝트라던지 시험이라던지 하는 이유로 "배움"의 우선순위가 상당히 낮았습니다. ^^;;

 시작했을 때 끝을 보는데까지 많은 시간이 드는 것도 이유일지 모릅니다만, 이런 문제로 "배움"을 뒤로했던 저로써는 상당히 충격적인 내용이네요. ^^;;;; 프로젝트의 완료는 또다른 프로젝트의 시작을 알리는 것이고, 중간 고사는 기말고사로 가는 과정이니... 결국 안되는 이유만 자꾸 늘어나서 이때까지 책 몇권 보지 못했다는.... ㅜ_ㅜ....

 "왜 지금까지 책 몇권 보지 못했을까?" 하는 물음에 정타를 날리는 내용입니다. 앞으로 반성을 많이 해야겠습니다. ㅜ_ㅜ...

 저는 지금까지 "GPL은 공개 소스이며 무조건 소스를 공개해야하고 상용으로 판매할 수 없다"고 생각하고 있었는데 그게 아니었군요. GPL에 대한 자세한 내용은 http://teamblog.joinc.co.kr/yundream/37 에서 볼 수 있습니다.

 GPL에 대해서 간단히 요약하자면 아래와 같습니다.
1. GPL 라이센스는 배포 시에 적용되는 라이센스이기 때문에 배포하지 않는 한 소스를 공개할 필요는 없습니다.
2. GPL 라이센스라도 배포시에 소스를 같이 배포한다면 상용이라도 문제 없다.
3. GPL 라이센스 변경은 저작권자 만이 가능하며, 이미 배포된 버전에 대해서는 변경을 가할 수 없고 새로운 버전에 대해서는 변경가능하다.

 요즘 저작권에 대해서 이런 저런 말이 많은데, 시간나면 저작권에 대해서도 알아두는 것이 좋겠군요. ^^

 꽤나 많은 RSS 목록을 가지고 있기 때문에, 나름대로 괜찮은 글들은 다 읽고 있다고 생각했는데... 우연히 링크를 따라 들어갔다가 깜짝 놀랐습니다. http://www.joinc.co.kr/modules/moniwiki/wiki.php/FrontPage 를 보니 정말 대단하더군요.

 각 분야별로 엄청난 글들이 모여있습니다. 공동으로 글을 남기는 블로그도 있던데, 아주 내공이 장난이 아닙니다. 글을 읽고 있으니 시간 가는줄 모르겠군요. ^^;;;

 많이 배워야겠습니다. 아직 멀었군요. ㅜ_ㅜ...

+ Recent posts