2017-01-31 1 views
0

현재 x86 명령어 세트 아키텍처 (ISA)에 대한 동적 명령어 대체에 대한 연구를하고 있습니다. 지금까지는 RISC-V 기반 프로세서 아키텍처에 대해서만 수행했습니다. FPGA에 합성 할 수있는 공용 도메인 x86 구현이 없기 때문에 지금은 시각화를 고수해야합니다.명령어 대체의 관점에서 QEMU와 KVM의 상호 작용

실험 설정은 다음과 같습니다 : qemu-user-mode에서 게스트 응용 프로그램 (gcc로 컴파일되고 외부 라이브러리가 없음)이 실행됩니다. (나는이 게시물을 실제로 매우 도움이된다 : QEMU - Code Flow [ Instruction cache and TCG]) 전체 시스템은 Fedora 25 Linux 운영 체제에서 실행되고 최신 git-sources에서 빌드됩니다.

가 일부 지침입니다 (내 자신의 코드 분석)가 내부적으로 거기에서

static AddressParts gen_lea_modrm_0(CPUX86State *env, DisasContext *s, int modrm) 

에 파견, 나는 명령이 클래스에 무슨 일이 일어나고 있는지 알 수 없습니다.

gen_nop_modrm(env, s, modrm); (translate.c:8108) 

호출 방법입니다.

내 기본 목표는 동일한 명령어의 연속 실행을 다시 지연시키기 위해 명령어가 인식 된 후 명령어를 추가하는 것입니다.

KVM 기반 QEMU 실행 방법에 대해 읽었습니다. 분명히, 일종의 하이퍼 비전이 가능합니다 (심지어 USB 거래의 경우 : https://www.blackhat.com/docs/eu-14/materials/eu-14-Schumilo-Dont-Trust-Your-USB-How-To-Find-Bugs-In-USB-Device-Drivers-wp.pdf). 아키텍처는 매우 복잡하지만 아주 간단합니다. 이러한 gen_lea_modrm 방법에 의해 잡힌 처리 지침, 얼마나

  1. :

    나는에 관심이 있어요.

  2. 순전히 KVM을 통해 전달되는 명령어를 볼 수 있습니까?
  3. 번역 버퍼 (tb)는 청크로 묶여 있습니다 (이해하는 한) 지침을 삽입하기 위해 버퍼를 확장 할 수 있습니까?
  4. 이 할 수있는 빌드 - 시설 있는가 명령 - 프로파일 난 그렇게 철저하게 내가 가진 검색 조건 검색

합니다. 모든 종류의 힌트, 팁 또는 제안은 실제로 도움이되고 감사하게 될 것입니다.

좋습니다.

답변

1

TCG와 KVM은 QEMU의 작동 모드가 완전히 다릅니다. 명령 줄에서 -enable-kvm을 통해 KVM을 사용하는 경우 모든 게스트 명령어는 호스트 CPU에서 기본적으로 실행되거나 호스트 커널에서 에뮬레이트 된 (에뮬레이트 된 장치에 주로 I/O를 수행하는 몇 가지 명령어의 경우) 실행됩니다. QEMU의 TCG 명령어 에뮬레이션 (위에서 언급 한 코드)은 전혀 사용되지 않습니다. 반대로 QEMU를 TCG 모드 (기본값)로 사용하면 우리는 사용자 공간의 순수 에뮬레이터이며 호스트 CPU의 하이퍼 바이저 기능을 사용하지 않습니다. qemu-user-mode는 항상 TCG 에뮬레이션이며 KVM이 아닙니다.

TCG 코드에 대한 질문에 대답하기 위해 gen_lea_modrm_0()은 특정 클래스의 클래스를 완전히 처리하지 않습니다. 이 형식의 명령 디코드 부분을 처리하는 것입니다. 명령의 modrm 바이트를보고 명령 스트림에서 추가 바이트를로드하고 명령이 사용하는 주소 지정 모드의 세부 정보를 나타내는 구조를 반환합니다 .또한 즉각적인 데이터를 포함하여 전체 명령에 대해 PC가 향상되었는지 확인합니다. gen_lea_modrm_0()을 호출하는 코드는 작업을 수행하기 위해 TCG IR 연산을 내보내는 과정에서 주소 지정 모드 정보를 사용합니다. gen_nop_modrm()은 하나의 형식 또는 다른 형식의 NOP 인 명령어에 대해 호출되기 때문에 특별한 경우입니다. 따라서 "실제 작업"이 필요하지 않으며 gen_lea_modrm_0() 호출이 수행하는 유일한 작업은 insn이 인코딩하는 중간 데이터를 지나서 PC를 개선했는지 확인하는 것입니다. 우리는 TCG IR 연산을 내 보내지 않으며 생성 된 코드가 실행될 때 아무 것도 일어나지 않습니다. 이것은 정확히 NOP에 대해 원하는 것입니다 ...

+0

먼저 자세한 설명을 주셔서 감사합니다. 실제로 TCG 기반 실행과 KVM 기반 실행의 차이점을 알고있었습니다. 그러나 정확한 라인이 어디에 있는지 확실하지 않았습니다. Thx 지금까지. 게스트 - 바이너리 해석/실행에 관해서. 나는 (이 호출자가 gen_nop_modrm (env, s, modrm)이기 때문에)이 클래스의 명령이 NOP와 일치 할 것이라고 가정했다. 마지막으로, 서브 루틴은 정렬이 다음 명령 (insn에 대한 포인터 등)에 대해 정확한지 확인합니다. 귀하의 의견을 바탕으로, 감독 된 실행과 같은 것을 파헤쳐 야합니다. – Kennerd