아아 이거 또 실패했습니다. ㅜ_ㅜ ln 까지는 갔으나... crti.o를 자꾸 찾는 바람에.... ㅜ_ㅜ cygwin에서 컴파일하는데 저 파일을 찾는 걸 보니 --target=x86_64-linux 옵션으로 줘서 그런 것 같습니다.

사용자 삽입 이미지

 크윽... 왜 Cygwin Package에는 64bit로 크로스 컴파일하는 옵션이 없을까요... ㅜ_ㅜ --target=x86_64-cygwin 요런거라도 있으면 좋을 텐데 말입니다. ㅜ_ㅜ

 당체 이 삽질을 언제 끝낼 수 있을지... 크윽... ㅜ_ㅜ 눈물이 앞을 가립니다. 흑흑...



 32bit 윈도우라서 64bit 코드를 생성하는게 상당히 힘들군요. ㅜ_ㅜ 되도록이면 Open Source를 사용하려고 MinGW나 Cygwin을 보고 있습니다만... 다들 m64 옵션이 먹지 않는 것 같네요. ㅜ_ㅜ

 MinGW에 GCC 소스를 받아서 컴파일 해보니 이것도 에러가 발생... ㅜ_ㅜ... 아놔 천지 쉬운게 없군요. 이거 하루종일했는데, 결국 실패했습니다.

 어디 m64 옵션 먹게 컴파일된 GCC 없나요? ㅜ_ㅜ


 거의 4일 동안 문서를 뒤지고 직접 테스트를 수행한 결과, IO APIC와 APIC간의 관계와 8259A(PIC) 칩간의 관계에 대해서 알아냈습니다. 더불어 BIOS에 존재하는 MP 관련 정보와 IO APIC의 Redirection Table, CPU의 APIC의 레지스터에 의미에 대해서도 대충 알아냈습니다. ㅜ_ㅜ)-b

 어떻게 테스트 했는지는 나중에 올리겠습니다. 나름 복잡한 내용을 포함하고 있고, 또 시간이 너무 늦은지라 ㅎㅎ 대신 아래의 스샷을 첨부합니다. 제가 만든 OS(KKAMAGUI OS)에서 IO APIC를 통해 BSP(Bootstrap Processor)에 키보드와 타이머 이벤트를 밀어넣는 화면입니다. 볼품없지만 이게 4일 동안 작업한 것이라는... OTL....
사용자 삽입 이미지

 그래도 IO APIC와 Local APIC에 대해 잘 모르면 Sysmmetric I/O로 갈 수 없기 때문에 어쩔 수 없었습니다. ㅜ_ㅜ)-b 결국 하긴 했군요. 흑흑.... 8259A(PIC) 컨트롤러의 타이머/키보드 인터럽트를 발생 못하도록 mask 했는데도 인터럽트 방식으로 잘 동작하는 화면을 보니 신기하군요. ^^;;;;

 그럼 이만 자야겠습니다. 좋은 밤 되시길~ ;)
 요 며칠째 계속 VMWare하고 Multiple Processor 스펙, 그리고 IO APIC 스펙을 함께 보며 삽질을 하고 있습니다. 그런데 아무리봐도 뭔가 이상하군요.

 Multiple Processor 스펙에 보면 MP Floating Pointer Structure의 Feature 2 정보에 IMCRP 비트가 셋팅되어있지 않으면 IMCR 레지스터가 존재하지 않는 것이고...이런 경우 기본 모드는 Virtual Wire 모드라고 되어있습니다.

 앞서 http://kkamagui.tistory.com/497 에서 설명 드렸듯이 Vritual Wire 모드는 2가지 모드가 존재하고, 테스트해본 결과 Local APIC는 다 Enable 되어있고 IO APIC의 Redirect Table이 모두 Default 값으로 Disable 되어 있으므로 Virtual Wire mode with Local APIC 라고 볼 수 있습니다(아래 그림 참조).

사용자 삽입 이미지

 그런데 웃긴건, BIOS가 MP를 초기화하고 그 정보를 저장해놓는 MP Configuration Table의 I/O Interrupt Assignment Entries 정보를 보면 IO APIC가 활성화 되어있으며 8259 컨트롤러가 IO APIC의 첫번째 pin에 연결되어 있다고 나옵니다. 나머지 타이머나 키보드 등등도 다 IO APIC에 연결된 것으로 설정되있습니다. ㅡ_ㅡa...

 만약 그렇게 연결되어있다면 IO APIC의 Redirect Table에도 동일한 설정으로 저장되어있어야 맞는 것 같은데... IO APIC의 Redirect Table에는 아무것도 안들어있으니... ㅡ_ㅡa... 이게 당체 어디가 맞는 건지 알 수가 없군요. ^^;;;; Redirect Table에 아무런 값이나 막 넣어봐도 별 에러없이 동작하던데... VMWare의 BIOS가 신경을 안쓰는 건지... 아니면 원래 그런 것인지 모르겠습니다. ㅜ_ㅜ

 그리고 Symmetric I/O는 당체 어떻게 ON 하는 것인지... ㅡ_ㅡa... 그냥 Local APIC를 다 활성화 시키고 I/O APIC의 Redirect Table에서 Destination을 손보면 되는 것인지... 이것 참... Redirect Table의 비밀이 풀려야 다음 진도를 나갈 수 있을 것 같은데... 이게 쉽지 않군요. ^^;;;;

 에혀... 죽겠습니다. 혹시 아시는 분 계시면 제보 부탁드립니다. ^^)/~
 그럼 좋은 밤 되시길~ ;)


 예비군 내내 Intel Architecture Volume 3을 봤습니다. 그리고 고향에 내려오는 도중에 PSP로 Multile Processor(MP) Spec을 계속 봤었는데... 뭔가 좀 이상하더군요. Intel 문서에는 I/O APIC에 대해서 아주 조금 언급하고 있습니다. 그냥 APIC와 연결되있다는 정도로 말이지요. ^^;;;;
 
 그런데 MP Spec에 보면 PIC, Virtual PIC, Symmetric I/O의 각 방식에 대해 아래와 같이 자세히 그려놓고 있습니다.
사용자 삽입 이미지
<PIC 모드>
사용자 삽입 이미지
<Virtual Wire Mode With Local APIC>
사용자 삽입 이미지
<Virtual Wire Mode With IO APIC>
사용자 삽입 이미지
<Symmetric IO Mode>

  보시면 아시겠지만 CPU의 Boundary 안쪽에 IO APIC가 있는지 바깥쪽에 있는지 좀 불분명합니다. 어렴풋이 버스 배열 상태나 위치를 봐서 바깥쪽에 있다고 추측합니다만... 이것만 봐서는 확실히 알수가 없었습니다. 그래서 이것 저것 뒤지다보니 intel-82093-apic 문서를 찾았습니다. IO APIC 컨트롤러에 대한 문서더군요. ^^;;; 거의 바깥쪽에 있는게 확실한 것 같습니다. 그런데 이게 왜 중요했던건지... ㅡ_ㅡa;;;;

 생각난 김에 VMWare의 부팅했을때 모드가 위의 그림 중에 어떤 것인지 확인을 좀 해봤습니다. 몇가지 테스트가 있는데... 테스트 과정은 좀 복잡해서 생략하고 결론만 이야기하면 Virtual Wire Mode With Local APIC 인 것 같습니다. 왜냐하면 I/O APIC쪽에 Interrupt Remapping Table인가 하는 녀셕이 Default 값으로 되어있거든요. 즉 안쓴다는 이야기지요. ^^;;; 그동안 다른쪽 코어에는 인터럽트쪽 설정을 안했기 때문에 별 신경을 안쓰고 있었는데, 이제 다른 코어에 인터럽트를 활성화하려면 이것이 중요한 단서가 되서 한번 읽어봤습니다.

 음... 이제 몇가지 코딩을해서 Symmetric IO Mode 로 전환하고 테스트를 좀 더 진행해볼 생각인데... 이것 참... 할일이 많네요. ^^;;; 언제쯤 또 할 수 있을지... 요즘 들어 시간이 부쩍 부족한 것 같습니다. ㅎㅎ 그래도 잘 쪼개서 이것 저것 해봐야겠지요 ;)

 그럼 다음에 또 테스트해서 결과가 나오면 올리겠습니다. ㅎㅎ 다들 좋은 하루 되세요 ;)

ps) APIC 관련 자료가 참 없더군요. 참 불모지(?)스럽다는.... ㅡ_ㅡa...


 그동안 OS를 여러번 만들어봤습니다만, 2002년에 시작한 KKAMAOS 외에는 그렇게 디테일한 레벨까지는 만들지 않았습니다. 프로그래머라면 다들 그렇겠지만 "했던" 일을 다시 한다는 것 자체가 고통이어서 다시 하려니 손이 안가더군요. 그래서 CPU를 ARM이나 DSP 같은 걸로 살살 바꿔가면서 "부팅 -> OS 로딩 -> 멀티태스킹" 정도 구현하고 끝냈습니다.

 그런데 이런 저런 사정으로 한번 더 만들게 됬는데... 이번에는 좀 색다르게 64bit로 만들게 될 것 같습니다. 사실 64bit에 대해서는 대충 알고 있었던지라 한번 볼 필요도 있고 해서 과감히 결정했습니다. 한 며칠동안은 스터디만 죽어라고 할 것 같군요. ^^;;;;

 오늘 예비군 훈련 받으면서 Intel 문서 좀 보려고 PSP에 넣어갔었는데... 바보같이 보안 검색대에서 걸려서 PSP를 압수당했다는.... ㅜ_ㅜ... 결국 예비군 훈련 시간을 거의 다 날려버렸습니다. ㅜ_ㅜ 오늘 좀 봤으면 저녁에 코딩을 어느 정도 할 수 있었을텐데.... 많이 아쉽군요. ㅜ_ㅜ...

 일단 진행 중간 중간에 팁이나 스크린샷 위주로 포스팅 할 예정입니다. 갑자기 또 불이 붙기 시작하는군요. ;)
 다들 기대해 주세요 >ㅁ<)/~


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

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

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

 그럼 다들 좋은 밤 되세요 ^^)/~
 헛... 이런 마이크로소프트웨어 4월호가 온지 좀 됬는데 이제서야 봤습니다. ^^;;; 다른 것 하느라 정신이 없어서 미처 보질 못했네요. ;)

 이번호를 마지막으로 OS Framework에 대한 내용이 끝났습니다. >ㅁ<)/~ 사실 입사 한달 전에 4개월 연재가 결정이 나서 급하게 3개월분을 미리 썼기 때문에 내용이나 예제가 좀 미흡한 면이 있었습니다. 마지막 4월호 역시 급하게 정리해서 역시나 안타까움이 남습니다. ㅜ_ㅜ

 글을 정리하면서 꼭 해보고 싶었던 일이었기에 나름 최선을 다했는데,  다시 읽어보니 좀 부끄럽군요. 내용이 영 부실한게... ㅡ_ㅜ... 기회가 된다면 지금 보고있는 내용들(Dual Core)도 기고를 해봐야겠습니다. 뭐 실리게 될지는 알 수 없지만... 그냥 묵혀두는 것 보다는 좋겠지요 ;)

 아래는 마이크로소프트웨어 4월호의 목차입니다.

=====================================================
STEP BY STEP

VS 2008을 이용한 블로그 프로그래밍│최지훈  290
실전 블로그 프로그래밍 2

3D 소프트웨어 플러그인 개발기│조영락  298
가지각색 3ds Max 플러그인

리눅스 시스템 프로그래밍│서상원 306
고급 파일 입출력

프레임워크로 다시 보는 운영체제 개발│한승훈 314
스케줄러 및 동기화 객체 구현하기

오픈소스 검색 엔진의 세계│이성호 322
컴파스 프레임워크

=====================================================

ps) 끝으로 아무것도 아닌 제 글을 실어주신 마이크로소프트웨어의 문경수 기자님께 감사를 드립니다.
 
 아아~ 요즘 집에오면 틈틈이 Multiple Processor에 대한 내용을 파고 있습니다. 스펙을 볼때마다 느끼는 것이지만, 스펙을 분석하는 과정은 퍼즐 맞추기와 굉장히 비슷하다는 생각이 듭니다. 퍼즐을 맞추기를 시작할때는 퍼즐 조각만 보입니다. 그러다 이제 퍼즐 맞추기에 힌트가 되는 면을 찾게되고 하나, 둘 끼워맞추다보면 어느새 전체적인 그림이 눈에 들어오고 얼마 남지않은 조각을 이용해서 쉽게 맞출 수 있습니다.

 지금 제가 하고있는 과정을 퍼즐 맞추기 과정에 대응시킨다면, 면을 찾는 과정쯤 되겠군요. 면을 찾아 퍼즐을 놓는 과정은 놓은 조각을 주위에 힌트로 쓸 수 있어 좋은 반면, 놓을 자리가 많아졌으니 고민할 것도 많아지는 단점이 있습니다. 지금 제 상황이 딱 그 상황인데, 조각이 맞춰져 가면 갈수록 궁금한 점이 생기더군요.

 현재 프레임워크를 사용해서 듀얼 코어 중에 나머지 하나의 코어를 동작시켰습니다. 물론 Real Mode지요. 이제 보호모드로 전환시키고 인터럽트 처리를 수행해야하는데, Symmetric Interrupt Mode로 동작하려하니 문제가 몇가지 생겼습니다.
 첫번째는 두 CPU에 Interrupt가 동시에 발생할텐데, 한쪽이 처리했을 때 나머지 한쪽은 어떻게 할 것인가 하는 문제입니다.
 두번째는 동일한 Interrupt가 계속해서 발생할 때, 두 CPU가 Interrupt를 처리하는 타이밍이 다르다면 언젠가는 한쪽에서 Interrupt가 밀리게 되는 일도 있을텐데 이를 어떻게 판단할 것인가 하는 것입니다.

 지금은 별로 퍼즐을 모은 게 없어서, 큰 그림이 보이지는 않지만 조만간 결판을 내고 구현에 들어갈 생각입니다. 하지만 그 전에 잠부터 좀 자야겠군요. 요즘은 12시만 넘으면 죽을 것 같습니다. ㅎㅎ

 그럼 다들 좋은밤 되세요 >ㅁ<)/~
 
 ps) TV에서 데이 브레이크를 봤는데, 상당히 흥미롭더군요. 잘못하면 드라마에 빠져서 작업을 안할 위험도... ^^;;


 고군분투 끝에 드디어 살짝(?) 동작시키는데 성공했습니다. '파랑새를 찾아서'란 고전에서 보면 그토록 찾아 다니던 파랑새가 자기 집에 있다는 내용이 나옵니다. 답이 먼곳에 있는 것이 아니더군요. 역시 처음에 보던 INTEL 메뉴얼에 있었습니다. ㅠ_ㅠ

 여기저기 다니긴 했지만 비슷한 내용만 반복해 언급되어있고, 실질적인 코드는 없었습니다. 프로그래머라면 백마디 말보다 한줄의 코드가 더 중요한법~!!! 한참을 뒤지다 문득 INTEL 메뉴얼에 나와있는 어셈코드가 떠올랐는데, 바로 그 코드가 핵심이었습니다. 물론 아무것도 모르는 상태로 그 코드를 봐봤자 평범한 어셈블리어 코드일 뿐입니다만, 여기저기를 뒤진 탓인지 다시보니 딱 알겠더군요. ^^;;;;

 일단 Real Mode에서 Halt 상태로 되어있는 Application Processor를 활성화시켜서 콘솔화면의 좌측 상단에 색깔을 바꿔가면서 문자를 찍도록 수정했습니다. 테스트를 하는 과정에 약간 문제가 있었지만, 그래도 잘 동작하네요. ^^)/~

사용자 삽입 이미지

 이제 Application Processor를 32bit 보호 모드로 바꾸고 실제 태스크를 할당해서 실행해볼 생각입니다. 조금만 더하면 어느정도 마무리가 되겠네요. 정리되면 또 올리겠습니다.

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



 3월호 원고도 무사히 넘어갔습니다. ^^)/~ 사실 글이 너무 넘친다는 기자님의 말씀이 있었습니다만, 제가 그때 PC에 아무것도 안깔린 상황이라... ^^;;; 결국 페이지가 2페이지나 늘었더군요. ㅎㅎㅎ 페이지가 늘어난다는 것은 쓰는 사람의 입장에서는 좋은 일인 것 같습니다.
 
 4월호 원고도 미리 보냈는데, 별 이야기가 없는 것을 보면 잘된 듯 합니다. 4월호가 마지막인데, 왠지 시원 섭섭하네요. ^^)/~ 다음에는 Multiple Processor Control 에 대해 다루어 볼까 합니다. 상용 OS를 제외하고 INTEL이나 AMD의 Multiple Processor를 완전히 다루고 있는 OS를 아직 못봤고, Multiple Processor에 대한 자료가 너무 없기 때문에 의미가 있을 듯 합니다. ^^)/~

 그럼 마이크로소프트웨어 3월호 목차 나갑니다.

=====================================================
STEP BY STEP

VS 2008을 이용한 블로그 프로그래밍│최지훈  290
실전 블로그 프로그래밍 1

3D 소프트웨어 플러그인 개발기│조영락  298
3ds Max SDK 레퍼런스

리눅스 시스템 프로그래밍│서상원 306
시스템 프로그래밍의 이해

프레임워크로 다시 보는 운영체제 개발│한승훈 312
스케줄러 및 동기화 객체 구현하기

오픈소스 검색 엔진의 세계│이성호 322
텍스트 검색 엔진, 루씬(Lucene)

=====================================================


 요즘 몸이 좀 허해져서 그런지 오늘 아침에 코피가 났습니다. 어의가 없더군요. ㅡ_ㅡa 뭐 그래도 요즘 잠을 별로 안자고 있기 때문에 그럴수도 있겠다는 생각을 했습니다. ^^;;; 설마 몸에 이상이 있을라구요 ㅎㅎ

 Multiple Processor 분석 쪽은 일단 문서를 정리하고 정리된 문서를 바탕으로 실제 테스트를 해보는 방식으로 진행하고 있습니다. 문서만 주구장창 읽으니 눈에 보이는 것이 없어서 더욱 깜깜하더군요. 그래서 가상머신을 이용해서 직접 테스트를 해봤는데, 의외로 결과가 잘나옵니다. 신기하네요 @0@)/~ 물론 지금은 아주 약소한 단계의 테스트만 진행하고 있습니다. ^^;;;;

 내일 일하러 가면 이틀동안 쉬는군요. 집에 내려갈까 가지말까 심하고 고민하고 있습니다. 내려가는데 걸리는 시간도 문제지만 몸이 피곤해서... ㅜ_ㅜ... 만약 안내려간다면 주말에 MP쪽 문서에 All in할 생각입니다. 이게 빨리 끝나야 본래의 목적인 Virtualization을 볼 수 있어서 ㅎㅎㅎ

 아우~ 오늘은 좀 일찍 자야겠군요. 자기 전에 오늘 테스트한 스샷 하나 올립니다.
사용자 삽입 이미지

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


 Multiprocessor에 대한 INTEL의 문서를 읽다가, 뭔가 부족한 느낌이 들어서 웹검색을 했습니다. 여기저기를 뒤지다가 우연히 OS 개발 관련 링크에 들어갔는데, 월척(!!!!)을 낚았습니다. ㅜ_ㅜ)/~

 사이트 주소는 http://www.osdever.net/cottontail/#SMP%20(IA32)이고 가보시면 INTEL의 Multiprocessor Specification 문서와 Multiprocessing Support for Hobby OSes Explained 문서를 보실 수 있는데, Multiprocessor와 BIOS, 그리고 OS 간의 관계를 잘 설명해 주고 있습니다. 문서를 읽자마자 궁금했던 점이 바로 이해되더군요. 문서가 아주 깔끔히 정리되어있습니다.

 그런데 놀라운 사실은 Multirprocessor Specification 문서가 1997년도에 1.4 버전이 됬다는 겁니다. 좀 읽어보니 CPU가 486 정도 일때 부터 Multiprocessor에 대한 내용이 나오기 시작한 것 같던데, 역시 대단하다는 생각밖에는 안듭니다. 이렇게나 일찍부터 Multiprocessor에 대한 준비를 하고 있었다니... ㅜ_ㅜ...

 덕분에 진도를 꽤 빨리 나갈 수 있게 됬습니다. 회사 일 끝나고 틈틈이 정리해서 나중에 한꺼번에 올리겠습니다. 오늘은 잠이 잘 올 것 같군요. ;)

 그럼 다들 좋은 밤 되세요~ >ㅁ<)/~

ps) 잘하면 OS 프레임워크의 Multiprocessor 버전이 나올지도 모르겠습니다. ;)~


 휴일을 맞아 방청소를 해놓고 오후 느즈막한 시간부터 인텔 문서를 붙잡고 읽기 시작했습니다. 워낙 영어가 부족한지라 이해가 잘 안되서 테스트 코드 위주로 볼려고 이곳 저곳 뒤졌습니다. Pseudo 코드는 발견했지만 전체적인 흐름의 일부분만 되어있어서 크게 도움이 안되더군요. 결국 차분히(??) 읽었습니다. ㅜ_ㅜ

 문서를 읽어가면서 여기저기 줄치고, 제가 만든 OS 프레임워크(http://kkamagui.tistory.com/category/OS%20Kernel(Intel,%20ARM) 참고)를 이용해서 테스트를 진행하다가 재미있는 사실을 알아냈습니다. VMware(코어 2개로 설정)를 사용해서 테스트했기 때문에 실제 PC와 동일할지는 알 수 없습니다만, 전원이 켜지고 BIOS가 시스템을 초기화하는 동안 BIOS가 CPU에 있는 모든 코어를 초기화 하고 ID를 할당해준다는 것입니다.
 
 인텔 문서에 의하면 CPU는 BIOS 코드에 의해 BSP(Bootstrap Processor)와 AP(Application Processor)로 나누어 설정된다고 합니다. 그리고 BSP는 초기화된 후 OS 코드를 실행하며, AP는 초기화된 후 인터럽트를 대기하면서 HLT 루프를 돈다고 되어있습니다. 실제로 테스트 코드를 넣어서 플래그를 확인해보니 APIC가 활성화되어 있었습니다. @0@)/~!!! 사실 간단히 코드를 작성해서 플래그만 확인해본 것이라 확실한 것은 아닙니다만, 일단 알아낸 것이니 포스팅합니다. ^^;;;
사용자 삽입 이미지

CPUID, APIC ID 및 APIC Enable 정보


 만약 진짜로 AP가  인터럽트를 대기하며 HLT 루프를 돈다면, BSP가 어떤 방식으로 AP가 태스크를 실행하도록 할 수 있을까요? 지금 추측하기로는 AP쪽의 인터럽트 백터를 조작하고 인터럽트를 발생시켜서 인터럽트 서비스 루틴(ISR)을 통해 태스크 또는 커널 코드를 실행하도록 하는 것이 아닐까 합니다. 이부분은 나중에 좀 더 시간을 내서 확인해 봐야할 것 같습니다.

 어이쿠, 또 밤이 깊었네요~ 이만 자야겠습니다. 다들 좋은 밤 되세요 ^^)/~

ps) 인텔 문서를 분석한다고, NDS 프로그램을 수정하지 못했군요.
죄송합니다. ㅜ_ㅜ 일단 내일이라도 짬을 내서 수정하도록 하겠습니다. (_ _)


 원래는 VT(Virtualization Technology)에 대해서 먼저 볼 생각이었지만, VT 기술을 보기 이전에 먼저 해결해야 할 일이 있더군요. 예전부터 궁금했던 것이 물리적으로 CPU의 개수가 2개 이상이면 이것이 어떻게 조율되어 동작할까 하는 부분이었습니다.

 특히 애매한 부분이 파워가 On 되거나 리셋이 됬을 때, CPU는 2개 모두 동작하도록 되어있는 것인지, 만약 그렇다면 둘다 BIOS 코드를 실행하고 OS 코드를 실행하는 것인지에 대한 부분이었습니다. 시간이 나면 본다고 미뤄뒀더니 아득한 기억 속으로 사라져있다가 이제야 떠올랐네요(역시 사람은 망각의 동물... ㅜ_ㅜ).

 이 부분에 대한 내용은 Intel64 and IA-32 Archtectures Software Developers Manual-Volume 3A-System Programming Guide, Part 1CHAPTER 7 MULTIPLE-PROCESSOR MANAGEMENT에 자세하게 나와있습니다. 지금 읽어보면서 정리하고 있는데, 나중에 대충 끝나면 포스팅하겠습니다. 현재는 스프링노트에서 작업 중이고, 어느정도 작업되면 링크를 걸어놓을테니 진행 과정이 궁금하신 분들은 참고하시면 될듯 합니다. ^^)/~

 새벽에 시간을 내어 앞부분을 조금 읽어보니, 지금까지 궁금해했던 내용이 바로 해결됬습니다(진작 읽어볼껄... ㅜ_ㅜ).


PC가 처음에 부팅이 되면 코어를 2종류로 설정하는데, 하나는 BSP(Bootstrap Processor)가 되고 나머지는 AP(Application Processor)가 됩니다. BSP는 부팅코드를 실행하고 OS 코드를 실행하는 메인의 역할을 하고, AP는 BSP에게서 신호를 받아서 동작하는 수동적인 역할을 하는 것 같습니다.


 물론 이것은 부팅과정에서만 해당되는 이야기이며, 실제 OS에서는 용도에 따라 Master - Slave로 가던지 Master - Master로 가던지 할겁니다. BSP와 AP로 나누고 부팅을 완료하는 과정까지 꽤나 복잡하던데, 자세한 것은 내일 또 알아봐야겠습니다.

 벌써 밤이 많이 깊었군요. ^^;;;;; 다시 올빼미로 돌아가는 것 같습니다. 이러면 안되는데... ㅜ_ㅜ
 다들 좋은 밤되세요 >ㅁ<)/~~!!!


 

 다들 설은 잘 보내셨는지요? 저는 할머니댁에서 실컷 NDS만 하고 왔답니다. 이틀만에 게임 소프트를 하나 깨고 왔을 정도니... 얼마나 했는지는 굳이 설명을 안드려도 될 듯합니다(NDS 충전만 중간에 2번 했습니다). 시간이 아주~ 안가더군요. ㅜ_ㅜ

 게임을 하는 중간 중간에 지쳐서 올해는 무엇을 해야할지 고민해 봤습니다. 목표를 정하고 달리는 스타일은 아니지만, 너무 지겨워서... ㅡ_ㅡa;;;;

 일단 크게 64bit CPU 분석과 VT(Virtualization Technology) 분석을 목표로 잡았습니다. 64bit 쪽은 예전부터 관심이 있던 부분이었고, VT 기술쪽은 제가 잘 모르고 있는 부분이라 공부를 위해 잡았습니다.

 아직은 32bit가 대세인듯 하지만, 언젠가는 64bit의 시대로 가겠지요 ^^;;; 그전에 미리 대비해 놓는 것도 나쁘지 않을 것 같습니다. VT 기술쪽은 제가 따로 생각한 부분이 있어서, 실제 CPU의 명령을 사용해서 제어를 해보는 단계까지 진행할 생각입니다. VT는 아주 유용하게 써먹을 수 있을 것 같거든요. ^^)/~!!!

 가장 이상적인 것은 64bit OS를 만들어서 VT 기술을 이용해 32bit OS를 돌리는 것이 아닐까 생각합니다. 지금 32bit용 OS 프레임워크를 가지고 있으니 64bit용 OS 프레임워크를 만들고 VT 기술을 넣으면 딱이겠네요. 하핫~

 올해도 마구 달려보렵니다.
 여러분들도 새해 복 많이 받으시고 목표 다 이루시길 바랍니다. ^^)/~

 화이팅~!!!!
예전에 개발하면서 적어놓았던 것인데, 블로그가 이전되서 다시 옮겨왔습니다. ^^

< 2004 05 11 GUI ( Graphic User Interface) >


으옷... @0@/~ 드뎌 네모난 커서에서 벗어났습니다 ㅋㅋㅋ 이틀동안 삽질한 끝에

Icon 파일을 읽어 낼 수가 있게 되었네요.. 화면 중앙에 보시면 콘솔위에 삼각형의

하늘색 커서가 있음을 알 수 있습니다. 요 아래쪽의 스샷을 보시면 파란색 네모가

동동~ 떠있는데, 고게 Icon 파일의 힘으로 삼각형으로.. ㅡ0ㅠ.. 감동..



< 2004 05 08 GUI ( Graphic User Interface) >

윈도우의 폰트가 기존의 래스터에서 돋움체로 바뀌어서 한컷 찍어 올립니다. 양쪽에

는 뽀대를 살리기위한 비트맵 로더가 떠있구요, 가운데 보시면 돋움으로 무장한

GUI Shell이 오랜지색 커서와 함께 두둥 떠 있는 걸 보실 수 있습니다.

으흣.. 폰트가 바뀌니 훨씬 나아 보이는군요.. ㅋㅋㅋ

앗쌀~ 홧팅 @0@/~



< 2004 05 06 GUI ( Graphic User Interface) >


아아.. 오래간만에 한컷 올립니다. 에궁에궁 출장이다 머다 해서 한동안 손을 조금

놓고있었기때문에, 헐헐헐..

이번에 스샷의 관전 포인트(??)는 제 마스코트랑 열혈강호가 올라가있는 BMP Viewer

가 아니라, 요것들이 모두 Application, 즉 User Level의 프로그램들이라는 것에 초점

을 맞추어야 한다고.. 쿠.. 쿨럭..;;;;

그리고 GUI Console에 오랜지색 네모 커서도 넣었고, 윈도우 테두리도 녹색에서

오랜지 빛으로 바꾸었습니다. 이게 더 보기가 좋군요.. ㅋㅋㅋ

일단 곧 커널이랑 하드 이미지도 릴리즈를.. 글고.. 곧 소스도..

쿠.. 쿨럭..;;; 정리는 안하고 지저분하게 삽질만 계속 하고 있는..

까.. 마.. 구.. @0@/~




< 2004 04 11 GUI ( Graphic User Interface) >


위에서 보시는 스샷은 아래의 4월 3일자의 스샷과 별 차이가 없는데요, 사실 비슷하긴

한데, 내부적으로는 상당한 변화가 있었기때문에 기념으로 한컷 올립니다.

으읏 진짜 이번엔 문제가 너무 심각해서 며칠째 고심해서 고쳤는지 ㅡ0ㅠ...

이번에 수정하면서 그런생각이 들더군요.. 과연 이 삽질의 끝에는 머가 있을까..

굉장히 궁금합니다 그려.. ㅋㅋㅋㅋ

4월 3일자에서 있었던 키의 문제는 해결한 스샷입니다. 사실 외관은 똑같군요..

( 아아.. 암것도 안한거 같오.. ㅡ0ㅠ... 억울..크윽.. )





< 2004 04 03 GUI ( Graphic User Interface) >



이번에 구현된 GUI system call을 테스트 하기 위해 만든 Application입니다.

기본적으로 하는일은, CUI에서 보여지는 80 * 25의 Text 화면을 그대로 옮겨서 보여

주는 것이지요.

아직 Key 문제가 확실히 해결되지 않아서 약간 문제가 있지만 그런대로

볼만은 하군요.. ㅋㅋㅋㅋ


< 2004 03 23 ETC ( ^ㅠ^ ) >



제가 목표로 하고 있는 GUI의 모습입니다.

Evil WM 이라고 굉장히 가볍다고 하는군요. 저는 윈도우를 쓰기때문에 잘 모름..

그러나 딱 봤을때 이미 필이 왔죠.. 보면 볼수록 멋집니다.

@0@/~~





< 2004 03 27 CUI ( Console User Interface) >




첫번째 화면은 이번에 릴리즈된 커널을 Bochs에서 돌린 화면입니다.

showdevice 했을때, com1, HDD, RamDisk 순으로 보이는 군요.

기본적으로 다 Mount된 상태로 실행되게 했습니다.

이게 테스트 하긴 더 편하더라구요..

두번째 화면은 KKAMAGUI Editor를 돌린 화면입니다. 간단한 텍스트를 입력하고,

/a.txt로 저장했어요.

세번째 화면은 KKAMAGUI Editor를 돌려 시리얼로 전송받은 소스코드를 읽은

화면이에요. 제가 짠건 아니지만 걍 있길래 전송해서 열어봤죠.. >_<



< 2004 03 24 CUI ( Console User Interface) >


이번에 릴리즈된 커널을 Bochs에서 돌린 화면입니다. showdevice 했을때,

램 디스크 하나랑 시리얼 포트, 그리고 추가된 하드가 보이는군요.

아참 램 디스크( rd0 )는 이번 커널에는 아니고.. 곧 릴리즈될 커널에 있는 건데..

Screen shot이 잘못됬네요.. 여튼 '/'에 Mount 한다음 내용물을 보여준겁니다.

므흣.. 좋네요~ ^0^/~


< 2004 03 23 ETC ( ^ㅠ^ ) >


제가 주로 쓰는 kkamagui를 그려봤습니다. 아마 지난 설인걸로 기억하는데요..

ㅋㅋㅋ 그때 별로 할일이 없어서 그림판으로 그렸던듯 하군요

그냥 한번 웃어보시라구요 ^0^/~



< 2004 03 15 CUI ( Console User Interface) >



CUI Screen shot 입니다. 맨 위에 화면은 처음 부팅했을때 보이는 화면입니다.

오늘 페이지를 추가하면서 생긴 화면이네요.. ^^

두번째 화면은 Worms라고 제가 공유메모리를 구현하고 그걸 테스트하기위해 만든

프로그램입니다. 처음에 녹색 한마리가 이리저리 돌아다니는데요, 이게 일정시간

지나면 상태도 변하고 그에 따라 먹이도 먹고 분열도 하고 싸움도 하는 그런 프로그램

입니다. 머 알고리즘이 그리 복잡하지 않기 때문에 크게 변화는 없구요.

주기적으로 늘었다 줄었다 하는군요. 심심하신 분은 한번 실행해 보심이.. ㅋㅋ


< 2004 03 14 CUI ( Console User Interface) >


CUI Screen shot 입니다. 맨 위에 화면을 보시면 Device 목록에 hda0 및 hdc0 두개의

하드디스크와 시리얼 포트 2개가 있음을 알 수 있습니다.

mount 명령으로 /에 hdc0를 mount하고 ls를 통해 파일을 조회한 화면입니다.

두번째 화면은 B2OS를 만드신 분이 CUI버전으로 테트리스를 제작하셨는데요, 그걸

그대로 포팅해서 제 OS에 돌린 화면입니다. ^^

B2OS 주인장님께 거듭 감사를 드립니다. (_ _)


< 2004 03 14 BoxBox Prototype>

GUI Prototype Screen shot 입니다. 이름은 BoxBox이구요. 사각형으로 이루어진

간단한 GUI를 목표로 하고 있기 때문에 이름을 이렇게 지었습니다.

커서( 가운데의 하얀 사각형 )의 모양까지 현재는 사각형을 띄고 있는데요,

조만간 커서는 삼각형으로 만들어볼까 생각중입니다. ㅋㅋ

윈도우는 evilwm에 영향을 받아서 녹색의 1 pixel로 이루어져 있구요, 내부는

녹색을 약간띄는 어두운 색으로 맞추어놨습니다.

테스트를 위해 여러 윈도우를 겹쳐놨는데, 생각난김에 한컷 잡아서 올립니다.

볼수록 모노크롬 모니터 시절을 생각나게 하는군요. ^^

개인적으로는 아주 맘에 드는데 말이죠. ㅋㅋ

이런 멋진 GUI를 만들게 해주신 Linefeed 님과 Ed 님께 감사를.. ㅎㅎ


21 OS 프레임워크 소스 릴리즈

 

들어가기 전에...

 

 KKAMAGUI OS 프레임워크 설치 환경은 20 작업환경 설치 참고하면 개발 환경 및 실행 환경을 설치할 수 있다.

 

 프레임워크의 소스 코드 및 도움말은 아래와 같다.

  • FrameWork-v1.0.3.zip : KKAMAGUI OS 프레임워크 버전 1.0.3 소스 ( 2007/09/03 릴리즈 버전)

    • 화면 출력 관련 함수들을 Kernel Shell에서 StdLib로 모두 이동
    • Standard Library의 printf 형태의 kPrintf() 함수 제공으로 화면 출력의 편의성 증대
    • Kernel Shell 소스 코드 정리
    • 간단한 파일 시스템 추가
    • 00 작업일지 참고

 

  • Framework-v1.0.2.zip : KKAMAGUI OS 프레임워크 1.0.2 소스 (2007-08-31 릴리즈 버전)

    • 이클립스 환경으로 전환
    • 태스트 스위칭 및 메모리 관리 부분 포함
    • 기존의 불편한 make 방식을 수정
    • 이클립스로 컴파일 가능하도록 수정
    • djgpp 와 기타 툴체인(Cygwin, MinGW)의 충돌을 막기위해 DJGPP의 파일이름 수정
    • 자세한 내용은 20 작업환경 설치 문서 참조
    • 파일 및 링크를 위해서는 Framework 폴더에서 djmake만 입력하면 수행 가능

 

  • Framework-v1.0.1.zip : KKAMAGUI OS 프레임워크 1.0.1 소스 (2007-07-04 릴리즈 버전)

    • 커맨드 라인 방식의 빌드
    • 순수하게 프레임워크 파일만 가지고 있음
  • index-v1.0.1.zip : KKAMAGUI OS 프레임워크 설명 파일. index.chm파일 참조 (2007-07-04 릴리즈 버전)

 

2007/07/19 02:35:41 수정

 kLock(), kUnlock() 함수를 Intel CPU에서 지원하는 명령을 이용해서 새로 작성했다.

  • Asm.asm : kLock(), kUnlock() 수정

 

2007/07/11 03:45:30 수정

 make 파일을 간단하게 정리했다. makefile에 대한 사용법은 02 간단한 Make 사용법을 참조하도록 하자.

 

2007/07/10 06:23:33 수정

 큰 수정 2가지가 있었다. 각 항목은 00 작업일지를 참고하자.

  • FW.zip : asm.asm 파일과 asm.h, isr.asm 파일 수정

 

2007/07/09 20:14:58 수정

 Task.c 파일에서 kSetupTask 함수에서 버그가 발생되어 수정했다.

  • Task.c : kSetupTask() 수정

 

첨부:

287529_Framework-v1.0.3-Basic.zip
0.07MB
287537_Framework-v1.0.3-2월호.zip
0.07MB
291769_Framework-v1.0.3-3월호.zip
0.07MB
367072_Framework-v1.0.3-4월호.zip
0.08MB
146692_FrameWork-v1.0.1.zip
0.27MB
146693_index-v1.0.1.zip
1.00MB
146828_Task.c
0.00MB
148078_makefile
0.00MB
155323_Asm.asm
0.03MB
188485_FrameWork-v1.0.2.zip
0.09MB
285323_FrameWork-v1.0.3.zip
0.10MB
146828_Task.c
0.00MB
147077_FW.zip
0.01MB

20 작업환경 설치

들어가기 전에...

1.작업 환경

프레임워크의 작업환경은 아래와 같다.

2.DJGPP(GCC) 설치 및 NASM 설치

2.1 DJGPP(GCC) 설치 방법

http://www.delorie.com/djgpp/zip-picker.html 로 이동하면 필요한 항목을 선택할 수 있다.

아래와 같이 대충 설정하고 나서

맨 아래에 있는 "Tell me which files I need" 버튼을 클릭하면 아래에 보는 것과 같이 필요한 파일들이 줄줄 나온다.

unzip32.exe to unzip the zip files 95 kb

v2/copying.dj DJGPP Copyright info 3 kb
v2/djdev203.zip DJGPP Basic Development Kit 1.5 mb
v2/faq230b.zip Frequently Asked Questions 664 kb
v2/readme.1st Installation instructions 22 kb

v2gnu/bnu217b.zip Basic assembler, linker 3.9 mb
v2gnu/gcc412b.zip Basic GCC compiler 4.0 mb
v2gnu/gdb611b.zip GNU debugger 1.5 mb
v2gnu/gpp412b.zip C++ compiler 4.1 mb
v2gnu/mak3791b.zip Make (processes makefiles) 267 kb
v2gnu/txi48b.zip Info file viewer 779 kb

아래의 파일들을 다 다운 받고 그 아래쪽에 보면 설치에 관한 내용이 있는데, 그것대로 실행하면 설치는 끝난다.

C:\> mkdir djgpp  
C:\> cd djgpp  
C:\DJGPP> unzip32 d:\tmp\djdev203.zip  
C:\DJGPP> unzip32 d:\tmp\faq230b.zip  
C:\DJGPP> unzip32 d:\tmp\bnu217b.zip  
C:\DJGPP> unzip32 d:\tmp\gcc412b.zip  
C:\DJGPP> unzip32 d:\tmp\gdb611b.zip  
C:\DJGPP> unzip32 d:\tmp\gpp412b.zip  
C:\DJGPP> unzip32 d:\tmp\mak3791b.zip  
C:\DJGPP> unzip32 d:\tmp\txi48b.zip

그리고 마지막으로 "내컴퓨터" 아이콘의 속성을 클릭하여 고급 탭에 들어가서 환경 변수 설정을 해주어야 한다.

나는 "D:\djgpp" 폴더에 인스톨 했기 때문에 저렇게 입력했으니, 각자 자기 폴더에 맞도록 변경해서 입력하면 된다.

설치 확인은 cmd 창에서 gcc를 입력했을 때, 아래와 같이 나오면 정상적으로 설치가 된것이다.

C:\> gcc
gcc.exe: no input files

2.2 DJGPP 관련 파일 변경(2007/08/31)

자신의 윈도우에 다양한 툴체인이 깔려있다면, 위와 같이 PATH의 가장 앞쪽에 DJGPP 폴더를 설정하면 문제가 발생할 수 있다. 따라서 DJGPP 폴더의 bin 폴더로 이동해서 gcc.exe, gpp.exe, ld.exe, make.exe 파일 이름을 수정해 주면 어느정도 충돌을 막을 수 있다.

해당 파일들의 앞에 dj를 추가하여 djgcc.exe, djgpp.exe, djld.exe, djmake.exe로 수정하도록 하자.

2.3 NASM 설치

http://nasm.sourceforge.net/ 로 가서 파일을 다운로드 한 뒤에, DJGPP가 설치된 폴더 안의 "bin"에 압축을 풀어 실행파일을 복사해 주면 끝난다.

설치 확인은 cmd 창에서 nasm을 입력했을 때, 아무것도 안나오면 정상적으로 설치된 것이다. 만약 파일이 없다고 에러가 나면 정상적으로 복사가 되지 않은 것이니 다시 복사를 하도록 한다.

3. VirtualBox 설치

http://www.virtualbox.org/ 로 가서 파일을 다운로드 한 뒤에, Next를 눌러 설치한다. 설치가 크게 어렵지 않으므로 설치가 끝난 후, "시작" 버튼으로 가서 Virtual Box를 실행한다.

프로그램이 실행되면 "new 버튼" 을 눌러 프레임워크를 실행할 환경을 설정한다.

  • "VM Name and OS Type" 에서 Name은 "KKAMAGUI OS Framework"를 입력하고 OS Type은 "Other/Unknown"으로 입력
  • "Memory"에서 8Mbyte로 설정
  • "Virtual Hard Disk"에서 "No Hard Disk"로 설정

설정을 완료하게 되면 아래와 같은 화면이 표시된다.

여기서 Floppy를 클릭하여 아래와 같이 실행할 이미지를 설정해 준다.

그후 "Start 버튼" 을 눌러 실행을 확인한다.

4.이클립스(Eclipse) 프로젝트 생성 및 빌드

이클립스를 사용하는 경우 매우 편리하게 프로젝트를 빌드할 수 있다. 이클립스에 대한 사용방법에 대한 내용은 06 이클립스(Eclipse) CDT 설치07 이클립스(Eclipse) 단축키 및 환경설정를 참고하도록 하고 문서에 따라 OSFramework 프로젝트를 생성한 다음 해당 폴더에 프레임워크 압축파일을 풀면된다. 압축을 푼다음 프로젝트를 Refresh하거나 이클립스를 닫고 다시 실행하면 변경된 사항이 적용되어있을 것이다.

djmake.exe를 이용해서 실행해야 하므로 이클립스를 열어 Project -> Properties 를 클릭하여 아래를 djmake로 바꿔주도록 하자.

<이클립스 설정 변경>

*만약 이클립스 환경을 사용하지 않는 경우라면 기타 에디터로 소스를 수정한다음 커맨드 라인에서 DJGPP용 make.exe(djmake.exe)를 실행하면 빌드가 된다. *

5.마치면서...

이상으로 프레임워크 작업환경 설치에 대해서 알아보았다. 프레임워크가 정상적으로 컴파일 되는지 확인해 보자.

안녕하십니까 까마굽니다 (__)

삽질에 삽질을 거듭하다보니, 16bit와 32bit Asambler를 만들게... 머 그냥 Directive를 통해 전환이 가능한 형태이구요, 열심히 Intel의 테이블을보고 만들었습니다.

아직 LABEL에 대한 처리가 좀 미흡하고, mov 명령에 대한 구현 및 테스트를 하고있어서 다른 명령의 형식에는 어떻게 적용될지는 의문입니다만, 여튼 별반 수정없이처리할 수 있을꺼 같군요. 만들어 놓고도 참 신기합니다. 동작을 하긴 하는군요.

정말 이렇게 난잡한 프로그램은오래간만에 짜보는듯...Type Match를 위해 if-else switch의 난무.. ㅡ0ㅡ;;;;나중에 LABEL에 대한 마무리 처리를 조금 한다음, 소스코드를 좀더 간단하게 정리를해야 겠습니다. 아.. 오늘은 머리도 아프고 속도 영 않좋군요.병이 났나 봅니다 그려.. ㅋㅋㅋ그럼 다들 몸조심 하시고..

좋은하루 되세요 (__)

 안녕하십니까 까마굽니다 (__)
 으으.. 오늘 Machine Code Generator를 만들다가, OpCode까지는 어케 선택을 해줬는데, Mod 및 SIB를 선택하지 못하여 하루종일 보냈슴다. 이제야 필을 받아서 일단 mov reg, reg 형식을 대략 완성하고 output을 냈는데요,다행이도 nasm이랑 output이 같게 나오는걸 보니, 테이블을 틀리게 만든건 아닌거같군요.

 흠, 아직 테이블을 좀더 만들고 테스트해야 하는게 있긴하지만 머, 일단 첫발을내딛었기땜시롱 한자 끄적여 봅니다. 처음에는 모든 경우의 수를 생각하고 Scanner랑 Parser를 만들었는데요, 오늘 딱생각하니 빼먹은것이 있군요.

 으으, 다 포함하려니 소스가 자꾸 복잡해져서리 일단간단하게 완성하고 덧붙이던가 해야 되겠군요.에궁, 징짜 너무 빡시네요.

 그럼 좋은하루 되세요 (__)아래는 테스트 결과
/////////////////////////////////////////////////////////////////////////////
//input file
/////////////////////////////////////////////////////////////////////////////
mov ebx, eax
mov ebx, ecx
mov ebx, edx
mov ebx, esi
mov ebx, edi
mov ecx, eax
mov ecx, ebx
mov ecx, ecx
mov ecx, edx
mov ecx, esi
mov ecx, edi
mov edx, eax
mov edx, ebx
mov edx, ecx
mov edx, edx
mov edx, esi
mov edx, edi
mov esi, eax
mov esi, ebx
mov esi, ecx
mov esi, edx
mov esi, esi
mov esi, edi
mov edi, eax
mov edi, ebx
mov edi, ecx
mov edi, edx
mov edi, esi
mov edi, edi

//////////////////////////////////////////////////////////////////////////////
// 아래는 Kkamagui Simple Asambler Output
//////////////////////////////////////////////////////////////////////////////
Output[89C3]
Output[89CB]
Output[89D3]
Output[89F3]
Output[89FB]
Output[89C1]
Output[89D9]
Output[89C9]
Output[89D1]
Output[89F1]
Output[89F9]
Output[89C2]
Output[89DA]
Output[89CA]
Output[89D2]
Output[89F2]
Output[89FA]
Output[89C6]
Output[89DE]
Output[89CE]
Output[89D6]
Output[89F6]
Output[89FE]
Output[89C7]
Output[89DF]
Output[89CF]
Output[89D7]
Output[89F7]
Output[89FF]

 안녕하십니까 까마굽니다 (__)
 요 이틀째 어셈블러 제작에 매달리고 있는데요, 오늘 오전즈음해서 scanner를테스트한 다음, 그 output을 parser에 넣고 문법을 검사하려다보니, 기본적인 검사를 하더라도, 어셈명령에 따른 operand의 갯수 같은 것이 필요하겠더라구요.

 그리고 머신코드를 생성할 때는 각 operand에 따른 머신 코드의 맵핑 테이블이필요한데, 막상 고민해보니 깔끔한 생각이 안떠오르더군요. 하드코딩을 안할려고 머신코드의 규칙을 살펴봤으나, prefix/MOD/SIB 머 이런것들은 일정한 규칙같은게 있던데, 머신코드는.. ㅡ0ㅡ;;;;;

 그래서 nasm을 참고할려고 들여다 봤더니, 쿠.. 쿨럭...걍.. 테이블이 하드코딩 되어있더군요. ㅠㅇㅠ/~~크윽... 그래서 일단 저도 하드코딩해서 테이블을 만들어 놓고 이제 parser를만들어 테스트를 할려고 생각중입니다.하.. 참나... 이거 무쟈게 빡시군요.기본적으로 제가 쓰는 명령만 구현하는데도, 한참 걸리겠습니다. 그려...일단 오늘도 삽질 @0@/~~

 그럼 좋은하루 되세요 (__)

 안녕하십니까 까마굽니다 (__)
 넹 커널을 릴리즈한지 며칠이 지났는데요, 다행이도 "왜 일케 짯어요??" "정신이 있는 사람이에요??" 이런식의 글이 올라오지 않아서 긴장을 풀고 있습니다. ㅋㅋㅋ사실 잔뜩 요 며칠 쫄아있었기 땜시롱, 워낙 허접한 코드를 릴리즈해놔서 이것 또한걱정이군요.

 ㅡ0ㅡ;;;흠, 당분간 커널 소스는 손을 안대고, 다른걸 쪼금씩 해볼 생각을 하고 있습니다.머, 다음에 손보게 되면, FAT를 좀더 보강하고, 스레드를 구현해 넣고 GUI 함수약간 더 추가하는 정도가 될것 같군요.스레드와 GUI 함수에 대해서는 아직 뚜렷한 방향이 잡히지 않아서 약간 시간이 걸리겠구요, FAT 루틴은 사실 약간 보강이 된 상태인데 추가해야 할 부분이 생겨서그부분에 대한 처리를 미뤄둔 상태입니다.

 음, 글고보니 응용 프로그램용 라이브러리와 응용프로그램 전송하는 방법에 대한언급이 없었네요. 이것도 시간나는대로 릴리즈를... ㅋㅋㅋ아아, 눈탱이가 아프군요... 갑자기 왜이러지...그만 자야겠습니다.

 다들 좋은밤 되세요 (__)

 안녕하십니까 까마굽니다 (__)
 오늘 한번 어셈블러를 끄적거려 볼려고 했었습니다만, 쇼크만 먹었습니다.흠, 전 지금까지 Opcode는 각 명령에 대해서 1:1로 대응되는줄 알고있었기때문에,쉽게 보고 있었는데, 오늘 문서를 보니 같은 mov라도 뒤의 Operand에 따라서 Opcode가 틀리더군요.

 또 뒤에 오는 Operand 타입에 따라서 옵션으로 설정되는 것들이 있고, 으아~~ 어찌나 복잡하던지...하는수 없이, 책을 일단 쬐금 복사한다음 nasm을 이용해서 역어셈해가면서 봤습니다.규칙이 있긴하던데, 머 관건은 머신코드를 작성할때 적절한 Opcode를 선택하기위해서는 Operand의 Type을 알고있어야 한다는 결론에 봉착한것 말고는 별 소득이 없네요.테이블도 몇개를 이용해야 될꺼 같고, 으음 일단 mov 명령을 잘 뜯어본다음 nasm과동일한 output이 나오도록 한번 해봐야 겠습니다.

 그러려고하니 문제가, scanner를 만들어야 하겠는데 머 만드는거야 별 문제가 없지만 중요한건 scanner의 output을 parser가 가지고가서 문법 체크를 하고, 다시 이걸넘겨받아서 머신코드를 만드는 놈이 output을 만들어 내야 하는데, scanner의 output을 어떤식으로 할지가 문제군요.머 일단 Token단위로 자른다 치면, scanner의 output으로는 Token별 String도 있어야 할터인데 어떤식으로 할지 걱정이군요.걍 Queue에 넣어버릴까나, 쩝쩝... 암생각하지말고 String의 크기만큼 동적할당해서걍 스트링 복사한다음 Queue에 넣는 무식한 방법도 생각하고 있습니다.

 오홀홀홀.. 혹시 머 좋은 생각 있으신분 계신가요??있으시면 답글좀...
 그럼 좋은하루 되세요 (__)

 안녕하십니까 까마굽니다 (__)
 몇주의 삽질끝에 겨우 정리를 끝내고 이제야 겨우 소스를 릴리즈 하는군요. 아래는 릴리즈 파일의 00ReadMe.txt 입니다.

그럼 좋은하루 되세요 (__)
 게시물 및 소스파일 링크http://kkamagui.codesum.org/board/read.php?table=broad&no=10
링크 클릭
//////////////////////////////////////////////////////////////////////////////
//=============================================================================//
// 2004 06 18 // KKAMA OS 첫번째 소스 릴리즈
// Home Page : http://kkamagui.codesum.org//
//=============================================================================
 1. 인사말 ---------------------------------------------------------------------
안녕하십니까 까마굽니다. (__)약 2주동안 열심히 소스를 정리한 결과, 디버깅 코드의 대부분을 정리하고 소스를 릴리즈 할 수 있는 정도가 되었습니다. 물론, 다 정리된건 아니고 한참 개발중인부분과 너무 복잡해서 정리하기에 시간이 드는 부분을 제외한 나머지 부분을 정리했습니다.정리하면서 느낀건데, 확실히 중복 개발된 코드들이 많이 보이는군요, 나중에 다시중복 개발하게 될때 한번에 모아서 처리해야겠습니다.공개하기엔 너무 허접한 소스코드라 처음에 상당히 고민을 많이 했습니다만, 한소리먹을 생각하고 공개하기로 마음 먹었습니다.KKAMA OS가 나오기까지 도움을 주신 OSX86의 Edward님, B2OS의 주인장님, OSX86의 기홍님, OSX86의 모립, 그외 여러 많은 분들께 감사드리며 KKAMA OS를 인터넷으로 보냅니다.도움이 되시길 (__)

 2. License --------------------------------------------------------------------
KKAMA OS는 소스에 저작권 제약이 없습니다. 필요에 따라 추가, 수정, 삭제, 변경이 자유로우며 코드 일부 사용 또한 제약이 없습니다.KKAMA OS 자체가 여러 자료를 참고해서 만들어졌으므로, 선현(??)들의 뜻을 따라 License를 Free로 합니다.다만, 재배포시 현재의 00ReadMe.txt 파일을 포함시켜야 합니다.
 
 3. 소스 열람시 주의사항 -------------------------------------------------------
KKAMA OS의 소스코드는 저의 코딩 스타일에 따라, Tab을 insert space로 하여 3개의스페이스로 치환되어있습니다. 물론 코드가 좀 오래되고 여기저기서 코딩한 결과,Tab문자가 스페이스로 치환되지 않아서 Tab을 3으로 맞추지 않으면 들여쓰기가 맞지않는 일이 생길 수 있습니다. 이러한 불편을 최소화하기위해서 소스를 보실때는 Tab을 3으로 조정하면 됩니다.또 각 name 들이 상당히 길고, Structure를 typedef로 줄이지 않고 그대로 사용한걸보실 수 있는데, 제가 이름을 줄여쓰는걸 별로 좋아하지 않아서 그렇습니다.소스는 최대한 간단히 구현할려고 노력했습니다만, 과연 그런지는 의문이군요. @0@/~

 4. 컴파일 및 링크 준비 --------------------------------------------------------
KKAMA OS의 소스코드는 DJGPP V2.0(GCC V3.2.1) 이상의 버전과 NASM V0.98.36에서 컴파일 및 링크되었습니다. NASM은 DJGPP용으로 나온 Binary가 있으니 사용하시면 에러없이 컴파일 가능합니다.DJGPP의 설치 및 NASM의 설치는 각 사이트 DJGPP : http://www.delorie.com/NASM : http://nasm.sourceforge.net/wakka.php?wakka=HomePage/에서 찾을 수 있습니다.설치가 잘 안되는 분은 질답란에 올려주세요. http://kkamagui.codesum.org/board/list.php?table=qna

 5. 커널 컴파일 및 이미지 만들기 -----------------------------------------------
KKAMA OS 소스코드는 특정 IDE를 사용하지 않기 때문에, DJGPP에 포함된 make.exe를통해 컴파일 됩니다.00Kernel 디렉토리는 커널소스가 포함되어있고,01Boot 디렉토리는 부트로더 및 커널로더의 소스가 포함되어있습니다.각 폴더에는 컴파일에 관련된 Makefile이 존재합니다.부트로더 및 커널로더를 컴파일할 시, MAKEBOOT.BAT를 실행하시면 01Boot 폴더에boot.bin (부트로더), kloader.com (커널로더)가 생성됩니다.커널을 컴파일할 시, make.bat를 실행하시면 00Kernel 폴더에 kkernel.bin (커널이미지)가 생성됩니다.Floopy를 통해 부팅가능한 이미지를 생성하기위해서 MAKEIMG.BAT를 실행하시면 각각생성된 boot.bin, kloader.com, kkernel.bin을 통합하여 DISK.IMG를 생성하게 됩니다.생성된 DISK.IMG를 통하여 Bochs, VMWare로 부팅이 가능합니다.DISK.IMG를 Floppy에 옮겨담기 위해서는 A: 에 빈 디스켓을 삽입하고 DISK.IMG를 실행하면 됩니다. 엔터를 입력하기를 기다리는데, 엔터를 입력하면 디스크에 쓰기가진행되고 완료되고나면 Floppy를 통해 KKAMA OS로 부팅할 수 있습니다.

 6. 커널 실행 및 테스트 --------------------------------------------------------
KKAMA OS의 홈페이지 http://kkamagui.codesum.org/kkamaosHowTo.html의 설치 및 실행순서를 참조하시면 명령어 리스트를 보실 수 있습니다.

 7. 버그 및 의문사항 -----------------------------------------------------------
KKAMA OS의 홈페이지 http://kkamagui.codesum.org/board/list.php?table=qna의 QNA 페이지를 이용하시면 됩니다
 안녕하십니까 까마굽니다 (__)
 요즘 계속 소스를 정리한다고 거의 기능 추가부분은 손을 안대고 있습니다.그래도 계속 무리를 좀 했더니 대충은 끝나 가는군요.사실, 세부적인 정리는 안했고 그냥 인덴트랑 주석을 좀 정리하고, 가장 중요한디버깅 코드들을 삭제하는데 중점을 두었습니다.

 머 사실 몇몇 파일들은 한참 개발중이기 때문에 정리자체가 무의미 하다고 생각되어 무시한것도 있습니다만, 여튼 끝이 보입니다.이제 파일도 몇개 안남았는데( 사실 무쟈게 많더군요... ㅡ0ㅠ.. 죽는줄 알았음 또 소스는 얼마나 긴지.. 꼭 공부 못하는 애들이 코드가 길듯.. ), 정리 되고 나면커널 소스를 올리겠습니다.

 그럼 좋은하루 되세요 (__)
 ps) 홧팅입니다 @0@/~~

 안녕하십니까 까마굽니다 (__)
 크윽, 소스를 밤낮 할꺼 없이 좀 무리해서 정리를 했더니만, 동작이 이상하군요.ㅡ0ㅠ 분명 정리하다가 멀 같이 지워버린거 같습니다.

 크윽 젠장, 두군데나 벌써 이상이 생겼는데요, 막막하군요. 정리를 마저하고 디버깅을 해야 할지, 아니면 일단 지금 해결하고 다시 정리를 시작해야 할지...한가지 분명한건, 잘못 정리했다는 것이죠.

 ㅡ0ㅠ.. 아아, 젠장 젠장...소스는 정신이 말짱할때만 봐야 겠네요.
 그럼 좋은하루 되세요 (__)
 
 ps) 요즘 질답란의 폭주로 인해 상당히 뿌듯하다는...모두들 홧팅입니다. @0@/~

안녕하십니까 까마굽니다 (__)

오늘 thread에 대해서 고민하다가 문득 pthread라는 놈의 소스를 보게 되었습니다. 전 pthread는 user level이라고 알고 있었는데, 아니더군요. ㅡ0ㅡ;;; 역시 나의 지식은 허망한것이었음... http://www.gnu.org/software/pth/pth-manual.html
 
위 링크는 GNU Portable Thread 라는 user level thread에 대한 문서인데요, 내용이 참 잘되어있군요. 제가 궁금해하던 "user level thread에서 과연 preemptive 하게 context switching이 가능한가??" 에 대한 물음을 단 한자로.. 압축해 놓았더군요. 충격이었습니다. SIGVTALRM... ㅡ0ㅡ...
 
결국 signal을 이용하면 간단히 스위칭을할 수 있었군요. ㅡ0ㅠ... 저걸 이용해서 user level의 thread library를 만들면, 커널 만드는 거랑 비슷할 것 같습니다. 사실 스케줄링 부분은 크게 다를것이 없으니...
 
시간이 나면 GNU Portable Thread도 차근 차근 한번 봐야겠습니다. 가능하면 포팅도 한판 때리는 쪽으로... 아직 먼 이야기지만... 좋은밤 되세요 (__)

안녕하십니까 까마굽니다 (__)
어제 밤새 노가다를 하여 GUI Application을 하나 만들어내고..그 기쁨으로 V*Ware에서 실행하던 중... 느린속도에 답답함을 느꼈습니다..헐..

그래서 번득 생각난 것이"그래..!! 요걸 실제로 부팅해서 실행해 보는거야.."
참고로 제 PC는 파티션 두개가 모두 FAT32로 포멧되어 있기 땜시롱 플로피에 커널을옮겨서 부팅만 하면 언제든지 하드의 내용을 읽을수 있게 되어있습니다. 뭐... 플로피에 옮겨서 부팅하던중, 플로피에 잘못 써졌는지 처음에 부팅이되지 않더군요..
 
그래서 아무 생각없이 다시 커널을 플로피에 옮긴다음 재부팅을 했더랬지요. 이번엔 정상적이었습니다. 앗쌀~을 외치며 mount 되어있는 제 노트북 하드에 접근하는거 까지는 좋았는데... 문제는 Application을 읽어야 하므로, 파일을 read 하는 순간... 문제는 터졌더랬죠.

Read 하고난 뒤에 파일이 온데간데 없고, root directory의 젤 첫번째 부분이링크되어 물려있었던 것이었답니다. 헑...다행히 루프로 물려져 있지 않아서... 그 파일만 사라지고, 마치 바로가기가 주욱 생긴것처럼 요상한 모양을 띠게 되었지만, 여튼 일단 수숩... 몇번반복하니 하드가 난장판이 되더군요.

그래서 새로 OS를 깔고 했는데, 원래 윈도우 2000을 사용하다가 오늘 XP로 업글을 한판... 근데... 무쟈게 느립니다. ㅡ_ㅡ;;; 뭐.. 덕분에 버그 한마리를 또 잡았지만...값비싼 댓가를 치르게 되었네요... 아직 윈도우 업데이트하는 중... 당체 이놈은 언제까지 할라고 하는건지... 원... 쩝쩝... 그래도 새로 만든 GUI Application이 GUI manager와 맞물려서 크게 무리없이 돌아가는걸 보니, 나름대로 좀 흐뭇하군요. 이걸로 위안이나 삼아야 겠습니다. 크하하핫. >_<

 그럼 다들 좋은하루 되세요 (__)

 안녕하십니까 까마굽니다 (__)
 출장중이라 소스 손대는게 별로 여의치는 않지만, 갖고 놀다보니 심각한 버그가발견되어서 수정해 올렸습니다.Release에 커널이.. HowTo에 d.img가 있는데요..이걸 두개 다 엎어쓰시면 될꺼같네요.

 이번에 추가된 사항은,stdin, stdout, stderr 의 사용 및 pipe의 추가를 들 수 있겠는데요,이걸 이용해서 gui Shell을 구현해 봤습니다.커널을 부팅해서 gui를 입력하시면.. 지난번과 변함없는 허접한 GUI 화면이 뜨구요,거기에 기본적으로 생기는 창 하나가 GUI Shell이 되겠네요..클릭 하셔서 키를 입력해 보시면.. 키가 입력되고, 콘솔에서 쓰는 명령이 그대로먹는걸 확인하실 수 있습니다.
 
 머.. 같은 루틴이니 당연한 결과.. ㅡ_ㅡa..근데.. Bochs에서.. 왜 일케 느린지 모르겠네요..V*Ware에서는 꽤 괜찮은데 말이죠..황당합니다.. 쩝쩝.. ㅡ0ㅡa...네.. 그럼 질문사항은 QnA로 올려주시구요..좋은하루 되세요 (__)
http://kkamagui.codesum.org

+ Recent posts