2008. 7. 28. 00:29
     

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

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



 

Android App

Posted by 호기심 많은 kkamagui(까마귀, 한승훈)

댓글을 달아 주세요

  1. sooahtz 2011.02.22 23:33  댓글주소  수정/삭제  댓글쓰기

    요즘 CPU 시뮬레이터를 구하느라 눈에 핏대가 가고 있는데요, PC에서 유명한 CPU들 말고 임베디드 장비에 들어가는 PPC(MPC55xx계열)라든지 STM, ARM 등을 지원하는 것을 알아보고 있습니다.
    와중에 QEMU 가 PPC랑 ARM 을 지원하는 거 같아 설치를 하고 뭐 좀 해보려고 하는데 막히는 것이 많아 도움 요청합니다.
    아, 저는 학생이어요.ㅋ
    일단 개발 환경 os는 윈도우입니다. 제약이 많은 거 알고 있지만 보고 편한게 윈도우라고 윈도우에서 진행했습니다.
    CPU는 Q9440 intel 입니다. 이 PC에서 PPC나 ARM, STM 과 같은 임베디드 MCU 에 돌아가는 프로그램을 돌려보고
    싶은겁니다.

    컴파일러는 구해서 링크까지 되어 elf 파일을 얻게 되었습니다.
    그런데 윈도우용 QEMU 를 설치해서 위에서 얻은 elf 파일을 올려 보려고 하니 img라든가 iso 같은 이미지 파일을 요구하더군요. 윈도우용 QEMU 바이너리 이름은, qemu-system-x86.exe 입니다.

    qemu-system-x86.exe -L . -m 512 -fda floppy.img -boot a -smp 4
    옵션은 아래와 같고요.
    -L . : 롬 바이오스와 키맵 설정을 현재 디렉토리에서 찾음
    -m 512 : 가상 환경의 물리 메모리가 512MB
    -fda ./floppy.img : 플로피 디스크 이미지 파일의 경로와 파일 이름
    -boot a : 플로피 디스크로 부팅함
    -smp 4 : 프로세서가 4개있는 SMP 머신

    질문은요,
    elf 파일을 img나 iso로 변환해야 하는지. 아니면 완전 잘못생각하고 있는건지.
    작업하기 피곤한데, 다른 CPU 시뮬레이터는 없는지.
    입니다.

    도움 주심 아주 감사하겠습니당.

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2011.02.23 00:52  댓글주소  수정/삭제

      안녕하세요~ 만나서 반갑습니다. ^^

      사용하신 바이너리는 윈도우용 x86 CPU 에뮬레이터입니다. 그러니 부팅 OS 이미지를 넘겨주면 됩니다. 윈도우 XP 시디나 리눅스를 이미지로 만든 파일을 넘겨주시면 해당 이미지로 부팅을 시작할 겁니다. ^^;;;

      만약 PPC나 ARM 같이 다른 프로세서를 윈도우에서 돌려보고 싶으시다면 일단 qemu-system-arm.exe와 같은 파일을 먼저 구하셔야 하구요, 그리고 그에 맞는 메모리맵을 먼저 파악하신 다음 부트 이미지를 옵션에 넣어줘야 합니다. ^^;;;;

      저도 사실 x86 CPU 에뮬레이터 밖에 돌려보지 않아서... ㅠㅠ 좀더 자세한 내용은 qemu의 help 문서를 참고하시면 될 것 같습니다.

      그럼 성공하시길 바랍니다. ;)

  2. sooahtz 2011.02.23 14:44  댓글주소  수정/삭제  댓글쓰기

    네 바로 그겁니다!
    PPC나 ARM 을 윈도우에서 시뮬레이션 하고 싶은 건데요,
    qemu_system_ppc.exe 같은 애들은 구해 놨습니다.
    http://www.h7.dion.ne.jp/~qemu-win/ 를 보시면 일본애들이 바이너리를 제공하고 있습니다.

    핵심은 해당 타겟 CPU에 맞는 부트 이미지를 만들어야 하는데요,
    메모리맵을 파악하는 작업과 또 어떤 것들이 필요한지 몰라서 질문 드렸어요.
    맨날 HOWTO만 보다보니 이런 경우 답답하네요...

    • Favicon of http://www.mint64os.pe.kr BlogIcon kkamagui 2011.02.27 12:48  댓글주소  수정/삭제

      그렇군요. ^^

      저도 ARM이나 PPC 에뮬레이터는 안써봐서... 정확하게 말씀 드리기는 어려울 것 같습니다만....

      제가 아는 범위에서 말씀 드린다면...

      일단 부팅이 가능해야 하니까, 메모리 맵을 확인하시구요.

      이 메모리 맵에서 부팅 이미지가 위치할 롬의 어드레스와 화면에 문자를 출력하는데 필요한 프레임 버퍼 어드레스를 확인해서 이미지를 여기에 맞추어 빌드해야 할 것 같습니다.

      그러면 최소한 부트 코드가 실행되어 데이터를 화면에 출력하는 정도까지는 볼 수 있을 것 같네요. 나머지는 에러가 출력되는 족족 정보를 참고해서 진행하면 되지 않을까요? ㅠㅠ