MIPS com Instruções de Virtualização

Como estou utilizando as ferramentas ArchC e SystemC para fazer a simulação das instruções desenvolvidas, primeiramente acredito ser interessante criar processador com os conceitos da tecnologia Intel VT-x, então, a partir de um modelo do processador MIPS R3000 descrito em ArchC1.6, vou implementar algumas instruções inspiradas na tecnologia Intel VT-x, para isso também será necessário adicionar certas estruturas à arquitetura já definida no MIPS R3000.

MIPS R3000 Original

O modelo original, em ArchC versão 1.6, criado para simulação do processador MIPS R3000 está disponível em www.archc.org. Essa é a versão com os 5 estágios de pipeline do MIPS. O modelo implementa os 32 registradores de 32 bits para uso geral. Também possui os registradores hi e lo, que juntos somam 64 bits, para operações de divisão e multiplicação.
Nesse modelo do MIPS, não foram implementados os registradores de coprocessamento, como o registrador de nível de privilégio de CPU (veja em MIPS r2000/r3000 Architecture). Como esses registradores não estão presentes, as instruções para acesso a esses registradores também não estão presentes, como é o caso da instrução de MOV.
O modelo possui todas as instruções aritméticas e de desvio do MIPS implementadas. A instrução SYSCALL e BREAK estão modeladas, mas não estão implementadas, provocando a parada da simulação se executadas.

MIPS R3000 com Suporte à Virtualização

Os acréscimos feitos ao MIPS R3000 foram baseados na tecnologia Intel VT-x (veja Documentação – Detalhes da Tecnologia Intel):
  • Adição de uma estrutura de VMCS: a referência a essa estrutura está na memória, mas a estrutura em si, não está. Ela seria uma estrutura específica do processador para armazenamento do contexto de cada Máquina Virtual. Atualmente o número de VMCS disponível no processador é fixo.

Definição do VMCS. Arquivo vmcs.h.
struct VMCS
{
	bool active;
	int launch_state;
	set<string> VM_exit_cond_instruction;

	int rb[RB_MAX_REG];
	int pc;
	
	VMCS();
	void clear();     /*limpa o VMCS do contexto que ele guarda*/

	void print();	/*imprime VMCS, para depurar a execução*/
};

  • Novo banco de registradores RS: com registradores de 32 bits. Dois desses registradores guardam as referências para o VMCS ativo e para o VMCS do Monitor de Máquinas Virtuais. Os outros dois, registram se o processador está em modo VMX root ou VMX non-root e se as extensões VMX estão ativadas.

Adições feitas no arquivo r3000.ac
AC_ARCH(r3000){
 
	 //banco de registradores adicionado
  	// RS[0] = modo root(0) ou não root(1)
  	// RS[1] = VMXON coloca em 1, VMXOFF coloca em zero
 	// RS[2] = referência ao VMCS atual
  	// RS[3] = referência ao VMCS do host
  	ac_regbank RS:4;
  
	/*outras estruturas pré-existentes no modelo original do MIPS*/
};

  • As instruções acrescentadas formam: VMXON, VMXOFF, VMLAUNCH, VMRESUME, VMCALL, VMCLEAR, VMPTRLD e VMPTRST.

Figura com Transições provocadas pelas instruções de virtualização do MIPS-vt.
cod3.jpg

Os tipos utilizados para essas instruções já estavam presentes no modelo original do MIPS R3000. Um resumo pode ser visto na tabela a seguir.

Tipo de Instrução Nome Formato Significado
Type_R VMXON vmxon Passa do modo normal de operação do processador, para o modo VMX root, onde as outras instruções VMX são reconhecidas
Type_R VMXOFF vmxoff Volta para o estado normal
Type_R VMLAUNCH vmlaunch A cada invocação da instrução VMLAUNCH é criado um novo VMCS referenciado pelo registrador que indica o VMCS ativo e o processador entra no modo VMX non-root
Type_R VMRESUME vmresume Provoca a saída do modo VMX non-root, que pode ser provocada também pela execução de alguma instrução que não seja permitida nesse modo
Type_R VMCALL vmcall Com a invocação da instrução VMRESUME ocorre a retomada da execução da MV a partir do estado salvo no VMCS ativo
Type_I VMCLEAR vmclear %imm(%reg) Limpa o VMCS cuja referência na memória foi passada como parâmetro
Type_I VMPTRLD vmptrld %imm(%reg) Carrega uma referência de VMCS da posição de memória passada como parâmetro para o registrador de VMCS ativo
Type_I VMPTRST vmptrst %imm(%reg) Salva a referência do VMCS ativo na posição de memória passada


As modificações feitas no arquivo r3000-isa.ac.
AC_ISA(r3000){

	/*instruções já existentes no MIPS R3000 original*/
	
	 //novas instruções
  	ac_instr<Type_I> vmclear, vmptrld, vmptrst;
  	ac_instr<Type_R> vmxon, vmxoff, vmcall, vmlaunch, vmresume;

	/*mapas para registradores da versão original do MIPS R3000*/
	
	ISA_CTOR(r3000){

		/*instruções já existentes no MIPS R3000 original*/
		
		//INSTRUCOES DE VIRTUALIZACAO
		vmxon.set_asm("vmxon");
		vmxon.set_decoder(op=0x00, func=0x3A);

		vmxoff.set_asm("vmxoff");
		vmxoff.set_decoder(op=0x00, func=0x3B);

		vmcall.set_asm("vmcall");
		vmcall.set_decoder(op=0x00, func=0x3C);

		vmclear.set_asm("vmclear %imm(%reg)", imm, rs);
		vmclear.set_decoder(op=0x3D);

		vmlaunch.set_asm("vmlaunch");
		vmlaunch.set_decoder(op=0x00, func=0x3E);

		vmresume.set_asm("vmresume");
		vmresume.set_decoder(op=0x00, func=0x3F);

		vmptrld.set_asm("vmptrld %imm(%reg)", imm, rs);
		vmptrld.set_decoder(op=0x39);

		vmptrst.set_asm("vmptrst %imm(%reg)", imm, rs);
		vmptrst.set_decoder(op=0x38);
  };
};

Last edited Dec 18, 2007 at 4:44 PM by mkferreira, version 15

Comments

No comments yet.