안녕하세요! 이 책으로 열심히 운영체제를 공부하고 있는 학생입니다



이야기 하기 전에,

먼저 QEMU의 MP 설정 테이블을 읽어보면


qemu mpinfo.PNG


QEMU의 경우 프로세서의 로컬 APIC ID를 순차적으로 할당하는 반면


vmware mpinfo.PNG


VMware의 경우 짝수 단위로 로컬 APIC ID를 배정하더라구요... (VMware Workstation Player 15)



32장 kProcessLoadBalancing() 함수 코드 중에서


Capture.PNG


코어 총 갯수를 구한 후,  해당 IRQ 처리가 제일 작은 코어를 골라 kRoutingIRQToAPICID 함수로 넘겨주는 부분에서

반복문을 보면 로컬 APIC ID가 순차적으로 할당되어 있다고 가정하고 제일 작은 코어를 고르는 것 같습니다.


그래서 그런지 이 코드로 빌드하고 실행하면

순차적으로 로컬 APIC ID를 할당하는 QEMU의 경우에는 정상적으로 작동하지만


VMware의 경우에는 로드 밸런싱을 할 시점이 오면 

새로 라우팅 된 I/O 리다이렉션 테이블이 존재하지 않는 로컬 APIC로 목적지를 바꿔서

인터럽트를 정상적으로 받지 못해서 그런 건지

I/O 리다이렉션 테이블 초기화 시 Destination 필드가 0xFF로 설정된 타이머 핸들러를 제외한 

모든 핸들러가 정상 작동하지 않았습니다.



그래서 임시 방편으로 아래 코드를 추가하여 실행해 봤더니 QEMU, VMware 두 가상머신 모두 정상 작동했습니다

(사실 코딩을 못해서.. 뜯어고칠 엄두도 안나고 ㅠㅠ)
수정한 코드.PNG


vmware showinfo.PNG

 vmware 에서 showintproccount 명령어 실행 시 모습입니다 (코어 갯수 총 4개)

짝수 단위로 로컬 APIC 번호를 배정해서 그런지 

Core 0,1,2,3 이 아닌 Core 0,2,4,6 에 인터럽트 처리 정보가 표시됩니다.



다른 실제 PC가 없어서 실제 PC에서는 테스트를 해보진 못했습니다만

저 VMware의 경우가 특이한 경우인 건지...

로컬 APIC ID가 위 QEMU처럼 순차적으로 배정되는 경우가 많은지 궁금합니다.


그리고 로컬 APIC ID가 순차적이지 않은 경우라도  책에 나와있는 빌드 및 테스트처럼 깔끔하게 나오게 하려면

코어 별 인터럽트 처리 횟수를 저장하는 테이블을 재설계 하는 수밖에 없으려나요?