오늘은 어플리케이션 실행때문에 elf64의 재배치(Relocation)에 대해서 보고 있습니다. 어디서 얼핏 elf64의 코드는 RIP를 Base로 사용하는 Addressing을 하기 때문에 재배치가 용의하다는 내용을 봤었는데, 용의하다는 뜻이 애매해서 한번 파봤습니다.

 테스트 결과 재배치 섹션(Relocation Section)이 역시 존재하며, 재배치를 수행해야 정상적으로 실행가능하다는 겁니다. 커널 코드를 4M 와 2M Base로 설정하여 빌드한 후 바이너리를 비교해 봤는데, 함수를 호출하는 부분의 코드는 변함이 없으나 데이터에 접근하는 부분 같은 경우는 역시나 Base Address에 영향을 받는 부분이 있더군요. Diff 프로그램으로 검사해본 결과 바이너리가 달랐습니다.

 이렇게 되면 결국 elf64 파일 포맷으로 어플리케이션을 빌드하고 OS에서 재배치해서 로딩하는 수 밖에 없겠군요. ㅎㅎ 약간 안습인 상황이... ㅠㅠ 아흑... 어찌해도 일거리가 줄어들지 않는군요.

 시간나면 elf 파일 포맷이나 봐야겠습니다. elf64 파일 포맷은 www.openwatcom.org/ftp/devel/docs/elf-64-gen.pdf 에서 보실 수 있습니다. ㅎㅎ

 오늘은 좀 일찍 컴퓨터를 꺼야겠습니다. 몸이 점점 축나서 회사 생활이 안된다는... ㅎㅎ
 그럼 다들 좋은 밤 되세요 ;)


 지금까지 진행된 소스 코드를 정리하고 있습니다. 테스트 코드를 워낙 많이 넣었더니 테스트 코드를 지우다가 실수로 원래 코드를 지우는 경우도 생겨서... ㅠㅠ 이거 표시를 제대로 해놔야겠더군요.

 제가 "변수명이나 매크로는 그 이름 자체가 자신을 설명할 수 있어야한다"는 주의라서 변수명/함수명 등등을 굉장히 길게쓰는 편입니다. ^^;;;; 특히나 커널 코드처럼 장래에 계속 볼일이 있는 코드 같은 경우는 더더욱 심한 편이지요.

 시간이 지나면 잊혀지기 마련인데, 주석이나 잡 문서로 아무리 잘 설명해 놓은들 변수나 함수 이름을 보고 무슨 뜻인지 한번에 알 수 없다면 문제가 있다고 생각합니다. 물론 각자의 스타일이 있으니 아니라고 생각하시는 분들도 있을거라 생각합니다(짧고 간결하게 쓰는게 더 낫다고 생각하시는 분들은 돌 던지지 말아주세요 ㅠㅠ 그냥 제 생각입니다. ㅠㅠ).

 그런데 너무 길게쓰니 함수 호출하거나 할 때 한 컬럼이 굉장히 길어지더군요. 저는 왠만하면 80 컬럼을 맞춰서 쓰려고 노력합니다. 따라서 개행을 해야하는데 결국 한 라인에 함수나 변수가 몇개 못 들어간다는... ㅠㅠ 크윽... 이거 최악의 조합인 것 같습니다. ㅠㅠ 소스코드가 좀 희한한 트리 모양으로 보이는 군요. ㅠㅠ

 어떻게 하는게 좋을지는 나중에 한번 의견을 나눠봐야하겠지만, 일단 길게 작업해두는 쪽으로 가야겠습니다. 일단 제가 이해하기 쉬워야 남들한테 설명하기도 쉬우니까요. ㅎㅎ

 어휴 벌써 또 시간이 이렇게 됬군요.
 다들 좋은 밤 되세요 ㅎㅎ ;)


 크윽... 죽는 줄 알았습니다. ㅠㅠ 지난 휴가와 이번주 주말을 모두 투자해서 드디어 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임을 알 수 있습니다. ^^)/~~


사용자 삽입 이미지

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


아아~ 진짜 거의 3일만에 성공했습니다. ㅜ_ㅜ 주말 내내 붙잡고 있다가 해결 못하고 있었는데... 구글의 자료를 뒤지다가 --disable-shared 옵션 및 LDFLAGS="-static" 으로 해결했습니다.

 ㅜ_ㅜ 진짜 되고 안되고가 한끗 차이더군요. 저런 옵션 하나때문에 몇시간을 날렸는지... ㅜ_ㅜ... 아래는 빌드가 끝나고 cygwin에 설치된 64bit 크로스 컴파일러(cross complier) 입니다. 감동해서 스샷 하나 찍어 올립니다(반갑다 애들아~ 우리 이제 잘해보자꾸나...). ㅜ_ㅜ)-b

사용자 삽입 이미지

 자세한 빌드 방법은 내일 정리해서 올리겠습니다. 앞으로는 저처럼 삽질하는 사람이 없었으면 하는 생각이 드는군요. 진짜 어의없습니다. ㅜ_ㅜ

 그럼 다들 좋은 밤 되시고, 내일 허접한 문서로 다시 찾아 뵙겠습니다. ㅜ_ㅜ)-b
 아아 이거 또 실패했습니다. ㅜ_ㅜ 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 님께 감사를.. ㅎㅎ


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

삽질에 삽질을 거듭하다보니, 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@/~~

+ Recent posts