벌써 7개월 정도 흐른 소스를 이제야 한 번 만지게 되었습니다. OS소스였는데 올해 초에 개인취미로 개발하였던 것입니다. 이게 메모리 관리자 기능을 추가하게된지가 이미 6개월 전인데, 이제야 메모리 관리자와 더불어 멀티태스킹에 대한 기능을 올려보는 군요.
위와 같이 오른쪽 윗 부분에 번쩍번쩍 이면서 돌아가는 것을 실제로 확인할 수 있었습니다. 원리는 간단한데 소스를 만질 시간이 부족하여 이제야 기능을 추가하게 되었네요 ㅎㅎ. 멀티태스킹도 되고 기능이 하나씩복이 되어가는군요.(그런데 걸린시간이란.. =ㅁ=;;) 천천히 오랜 시간이 걸리더라도 해야 하는 과제와 더불어간을 적절히 분배하면서 계속해서 기능을 추가해봐야겠습니다^^.
그런데 아직 특정 에뮬레이터에서는 계속 죽는걸로 봐서는 여전히 처리해야 되는 부분이 더 있는 모양입니다.ㅎㅎ 일단 Bochs와 Vmware에서는 제대로 동작을 하고 있는 걸로 봐서는 제대로 동작을 하고 있는 듯 하긴하네요. 그럼 다음 기능이 추가 되면 또 포스팅을 올리도록 하겠습니다.
마지막 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의 크기가 커지는 문제점이 있어서 손쉽게 할 수 있는 것만도 아니지만요^^;
지금도 열나게 코딩중이긴 하지만 언제까지 달릴 수 있을지 잘 모르겠습니다^^. 그럼 다음에는 더 좋은 결과물을 들고 포스팅을 해보도록 하겠습니다.
댓글을 달아 주세요
우왕~ 멋지군하
천지 쵝오 ㅋㅋ
헠 =ㅁ= 횽님 ㅋㅋ
캄샤합니다..ㅋㅋ
하지만 횽님이 더 쵝오라는거 ㅋㅋ
관리자만 볼 수 있는 댓글입니다.
음 안녕하세요?
어떤 일이신지 댓글로 남겨주시면 감사하겠습니다^^.
와 멋지시네요! 잘보고갑니다~