2017-04-24 2 views
1

가상화를 이해하는 한 가지로 KVM의 지원을 확장하고 새로운 명령어를 정의하려고합니다. 명령은 이전에 사용되지 않은 opcode를 사용합니다. ref-ref.x86asm.net/coder32.html사용하지 않는 x86 op 코드에서 Linux KVM에서 새 명령어를 구현하는 방법

이제 'CPUID'(VM-exit가 발생 함)와 같은 명령어를 추가하고 새로운 명령어 인 'NEWCPUID'를 추가하려고합니다. 권한이있는 'CPUID'와 유사하며 다음과 같이 트랩됩니다. 하이퍼 바이저이지만, 구현이 다를 수 있습니다.

일부 온라인 리소스를 살펴본 후에 새로운 시스템 호출을 정의하는 방법을 이해할 수 있었지만 Linux 소스 코드의 모든 파일이 NEWCPUID 코드를 추가해야하는지 잘 모르겠습니다. '찾기'명령에만 의존하는 것보다 나은 방법이 있습니까?

나는 도전 과제를 직면하고있다 : 1. 리눅스 소스 코드의 어느 부분에서 코드를 추가해야합니까? 2.이 새로운 명령어를 이전에 사용하지 않은 opcode에 어떻게 매핑 할 수 있는지 잘 모르십니까?

나는이 분야에 대해 완전히 새롭기 때문에 이것을 배우고 자 할 때, 누군가이 과제에 대해 어떻게 설명 할 수 있는지 간단히 설명 할 수 있습니까? 이를 달성하기 위해서는 올바른 방향이 필요합니다. 프로세스를 설명하는 참조/자습서/블로그가 있다면 큰 도움이 될 것입니다!

+1

AFAIK, AFAIK, KVM은 실제로 어떤 에뮬레이션도하지 않습니다. 어떻게 새로운 명령을 추가 할 것을 제안합니까? 잘못된 opcode를 사용하여 CPU 예외를 트리거하려고합니까? – tangrs

답변

0

는 여기 몇 가지 질문에 대한 답변은 다음과 같습니다

  1. ...하지만 확실하지 않다 리눅스 소스 코드에있는 모든 파일에 대해 내가 NEWCPUID에 대한 코드를 추가해야합니까? A - KVM 에뮬레이션을 추가 할 수있는 적절한 위치는 arch/x86/kvm/emulate.c입니다. opcode_table []이 어떻게 정의되고 그들이 실행하는 함수에 후크하는지 살펴보십시오. 기본 아이디어는 게스트가 실행하고 "db 0xunused"와 같은 정의되지 않은 명령어입니다. 이것은 명령어가 정의되지 않았기 때문에 종료됩니다. KVM에서 VMCS/VMCB의 립을보고 KVM이 알고있는 명령인지 (예 : NEWCPUID) KVM이 x86_emulate_instruction()을 호출하는지 확인합니다.

  2. ... '찾기'명령에만 의존하는 것보다 나은 방법이 있습니까? A - 예, 시스템 호출 예제를 선택한 다음 cscope와 같은 심볼 상호 참조를 사용하십시오.

  3. ... 짧게 말해서이 작업에 대해 어떻게해야합니까? A - 1에서 언급했듯이, 먼저 게스트가 db 트릭과 같은 사용되지 않는 opcode를 실행하려고 시도하는 방법을 찾습니다. 어셈블러가 알려지지 않은 opcode를 거부하려고합니다. 그래서, 그 첫 걸음. 둘째, 지시에 따라 vmexit()가 발생하는지 확인하십시오. 이를 위해 추적 기능을 사용할 수 있습니다. 추적은 많은 양의 출력을 방출하므로 일부 필터 옵션을 사용해야합니다. 추적이 너무 복잡하다면 vmx_handle_exit (vmx.c)에있는 내용을 인쇄하십시오. 마지막으로 여기서 사용자 정의 함수에 연결하는 방법을 찾으십시오. KVM에는 이미 손님 예외를 처리하기위한 handle_exception()이 있습니다. 그것은 사용자 정의 함수를 삽입하기에 좋은 장소입니다. 이 함수가 emulate_instruction을 호출하여 게스트에 주입 할 예외를 에뮬레이트하는 방법을 확인하십시오.

나는 학습 과정에서 자신을 파악하는 것이 중요하다고 생각하기 때문에 일부 질문을 의도적으로 건너 뛰었습니다. BTW, 나는 이것이 가상화를 이해하는 최선의 방법이 아닐 수도 있다고 생각합니다. 더 좋은 방법은 kvm 서비스를 utlize하는 사용자 공간 하이퍼 바이저를/dev/kvm 또는 독립형 하이퍼 바이저를 통해 작성하는 것입니다.

관련 문제