'OS개발'에 해당되는 글 2건

  1. 2010/09/05 귀차니스트 [Multitasking]오래전의 소스를.. (5)
  2. 2009/12/28 귀차니스트 어후.. 드디어 인터럽트 활성화가 되었군요..

  벌써 7개월 정도 흐른 소스를 이제야 한 번 만지게 되었습니다. OS소스였는데 올해 초에 개인취미로 개발하였던 것입니다. 이게 메모리 관리자 기능을 추가하게된지가 이미 6개월 전인데, 이제야 메모리 관리자와 더불어 멀티태스킹에 대한 기능을 올려보는 군요.

 

사용자 삽입 이미지

 

  위와 같이 오른쪽 윗 부분에 번쩍번쩍 이면서 돌아가는 것을 실제로 확인할 수 있었습니다. 원리는 간단한데 소스를 만질 시간이 부족하여 이제야 기능을 추가하게 되었네요 ㅎㅎ. 멀티태스킹도 되고 기능이 하나씩복이 되어가는군요.(그런데 걸린시간이란.. =ㅁ=;;) 천천히 오랜 시간이 걸리더라도 해야 하는 과제와 더불어간을 적절히 분배하면서 계속해서 기능을 추가해봐야겠습니다^^.

  그런데 아직 특정 에뮬레이터에서는 계속 죽는걸로 봐서는 여전히 처리해야 되는 부분이 더 있는 모양입니다.ㅎㅎ 일단 Bochs와 Vmware에서는 제대로 동작을 하고 있는 걸로 봐서는 제대로 동작을 하고 있는 듯 하긴하네요. 그럼 다음 기능이 추가 되면 또 포스팅을 올리도록 하겠습니다.

 

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/09/05 04:42 2010/09/05 04:42

댓글을 달아 주세요

  1. kkamagui 2010/09/07 22:24  댓글주소  수정/삭제  댓글쓰기

    우왕~ 멋지군하 ;)

    천지 쵝오 ㅋㅋ

    • 귀차니스트 2010/09/09 02:37  댓글주소  수정/삭제

      헠 =ㅁ= 횽님 ㅋㅋ
      캄샤합니다..ㅋㅋ

      하지만 횽님이 더 쵝오라는거 ㅋㅋ

  2. 비밀방문자 2010/12/16 16:20  댓글주소  수정/삭제  댓글쓰기

    관리자만 볼 수 있는 댓글입니다.

    • 귀차니스트 2010/12/24 10:01  댓글주소  수정/삭제

      음 안녕하세요?
      어떤 일이신지 댓글로 남겨주시면 감사하겠습니다^^.

  3. seso 2011/03/10 02:01  댓글주소  수정/삭제  댓글쓰기

    와 멋지시네요! 잘보고갑니다~

  마지막 C++ 커널 진입 글을 올리고 난뒤 많은 시간이 흐른것 같습니다. 엄청 -ㅅ- 도중에 해결할 수 없는 삽질이 계속되어 한 동안 지지부진 하고 있었는데요.. 결과는 오늘 해결을 봤습니다. 결과물은 아래와 같이 Keyboard Interrupt 처리가 되는 화면입니다.(하지만 제대로된 키 입력은 아직 처리를 못했다는게.. 가장 큰 문제라면 문제일까요?)



  위 화면에서 볼 수 있다 시피 깨진 문자가 입력이 되긴 합니다. Scan Code 를 곧바로 출력하게 하였더니 이런 현상이 발생하네요^^; 곧 piKeyboard 클래스를 제작하여 제대로 된 입력을 처리하려고 합니다. ㅎㅎ 그래도 예전에 진입만 되었던 화면이랑 많이 달라진 듯 하죠? 대충 그 동안 추가된 기능이 아래와 같습니다.

1. Memory Size Detection
  - Page Map Level 4 Table등의 메모리 테이블을 구성하여 제대로 메모리 접근이
되는지 검사하여 사이즈를 측정을 하게 하였고

2. Global Descriptor Table
 - KernelLoader 에서 임시로 롱모드 진입을 위한 GDT 데이터를 1MB 영역에 존재하는 커널에서 다시 재구성하여 로딩을 합니다.

3. Task State Segment
 - Task Segment 를 구성했구요. 이를 위해서. 뒤에 적을 하나의 구현이 필요했습니다.

4. Interrupt Descriptor Table
 - CPU에 대한 Interrupt 를 처리하기 위한 IDT를 커널영역에서 구성하였습니다. 물론 Master PIC, Slave PIC 또한 IRQ를 리맵핑하여 처리할 수 있도록 하였습니다.

6. new operator 제공
 - 아주 단순한 new 이긴 합니다만, 현재 커널 상에서 커널을 실제 운용하기 위하여 사용되는 Memory Allocation Alogorithm을 사용한 것이 아닌 문법상으로 new 를 지원합니다. 이 부분이 되어야 x64 Task State Segment 에서 사용할 스택공간을 손쉽게 마련할 수 있겠더라구요^^.

7. Global / Static Class의 Constructor, Destructor 호출
 - 기존엔 Pointer 를 Global 하게 관리하고 Stack 에 커널 오브젝트를 생성한 후, 사용을 하였는데 그 부분을 LD 와 extern "C" 를 이용하여 서로 연결 Constructor, Destructor를 KernelMain 진입 전후에 호출이 되도록 하였습니다. 이 덕분에 커널영역에 데이터가 존재하게 되었구요

  뭐 별 기능이 없는 것 같기는 합니다만. 소스 측면에서는 엄청난 변화가 있었습니다. ㅜㅜ Descriptor Table 들을 어떻게 구성할까 구성할까 하다가 Class 와 Inheritance, Union 을 사용하여 데이터에 대하여 공통적으로 접근하기 쉽도록 일단은 구성을 했었고, 최대한 namespace 를 사용하여 소스코드량은 많아질지라도 구분을 하도록 했고, Get, Set 을 통하여 OOP를 그래도 지켜보려고 했습니다. 그래도 RTTI가 안되다보니 Inheritance의 Virtual Function 같은건 사용할 수도 없습니다. 뭐.. Virtual Function 을 사용하려고 해도 Function Table 로 인하여 Class의 크기가 커지는 문제점이 있어서 손쉽게 할 수 있는 것만도 아니지만요^^;

  지금도 열나게 코딩중이긴 하지만 언제까지 달릴 수 있을지 잘 모르겠습니다^^. 그럼 다음에는 더 좋은 결과물을 들고 포스팅을 해보도록 하겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
2009/12/28 04:09 2009/12/28 04:09

댓글을 달아 주세요