삽질을 끊임없이 한 결과(??) 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 조금만 더 파보면 본격적인 작업(??)을 진행할 수 있을 것 같습니다. ;)

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



 

+ Recent posts