MO801 - Seminário - DynamoRIO
DynamoRIO
Juliano Moscardini Bernardes
MO801/MC972 - Tópicos em Arquitetura e Hardware - Máquinas VirtuaisIC - UNICAMP
2012
MO801 - Seminário - DynamoRIO
ÍNDICE
IntroduçãoCode CacheBlocos Básico e TracesTransparênciaPerformanceConclusão
MO801 - Seminário - DynamoRIO
Introdução
Baseado no Dynamo (2001).Parceria entre HP e MIT (Runtime Introspection andOptimization (RIO) group) iniciada em 2001.Determina (2003 - 2007), empresa de segurança fundadapelos desenvolvedores.Comprada pela VMware em 2007.Se torna Open-Source em 2009, com licença BSD.Versão atual: 3.2.0.3
MO801 - Seminário - DynamoRIO
Introdução
Runtime para a manipulação e transformação de código.Otimizações dinâmicas.Provê uma interface para a construção de ferramentas deprofiling, instrumentação, otimização, tradução e outras.Aplicações IA-32/AMD64 para Linux e Windows.
MO801 - Seminário - DynamoRIO
Runtime
Figura: DynamoRIO runtime code manipulation layer.
MO801 - Seminário - DynamoRIO
Algumas Metas
DeployableEficiente
• Abrangente• Prática• Transparente• UniversalCustomizável
MO801 - Seminário - DynamoRIO
Code Cache
Figura: Diagrama do fluxo de execução.
MO801 - Seminário - DynamoRIO
Blocos Básicos
Termina com um desvio.Cada entrada é um novo bloco básico.Salva o estado e o controle, e retorna ao DynamoRIO(context switch).Faz a ligação direta com blocos básicos já existentes.
Figura: Exemplo de BB.
MO801 - Seminário - DynamoRIO
Traces
Única entrada e várias saídas.Oportunidade para maiores otimizações.Alvos de back edges (Trace Head).Saída de um existente Trace (Secondary Trace Head).Criado quando o contador excede um threshold.Geralmente terminado quando encontra uma back edge,ou saída para outro trace.Next Executing Tail (NET)Não considera alvos de back edges de saltos indiretoscomo possíveis Trace Heads.
MO801 - Seminário - DynamoRIO
Incrementar Contador do Trace Head
Figura: Soluções para incrementar.
MO801 - Seminário - DynamoRIO
De Blocos Básicos para Traces
Figura: Criação de Traces.
Otimizações nos Traces: Constant Propagation andFolding, Dead Code Elimination.
MO801 - Seminário - DynamoRIO
Performance
Figura: Melhorias que cada técnica adiciona.
MO801 - Seminário - DynamoRIO
Algumas Fontes de Overhead
Adição de instruçõesComparação para saltos indiretos.Pesquisa na tabela de saltos indiretos.
Aumento no número de dados.Hashtable.
Modificações no código da aplicação.
MO801 - Seminário - DynamoRIO
Capacidade da Code Cache
Quando chega no limite do tamanho:Buffer circular.FIFO
Dimensionada dinamicamente (Quando um threshold de"blocos regenerados" é atingido).É dividida em unidades.
MO801 - Seminário - DynamoRIO
Cache Layout
Figura: Separação do Layout físico e da lista lógica para o FIFO.
MO801 - Seminário - DynamoRIO
Layout de um Fragmento
Figura: Campos de um fragmento da Code Cache.
MO801 - Seminário - DynamoRIO
Transparência
Evitar interferir na execução do programa.Conseguir tratar caso incomuns.Define 3 regras de transparência.
MO801 - Seminário - DynamoRIO
Transparência
Regra 1: Eliminar conflitos de recursosBibliotecas.
O mau compartilhamento de recursos do sistema podecausar situações de inconsistência.
Heap.Manter a memória do DynamoRIO separada daaplicação.
I/O.O DynamoRIO usa suas próprias rotinas de I/O.
MO801 - Seminário - DynamoRIO
Transparência
Regra 2: Evitar alterar o código da aplicação.Threads.
O DynamoRIO não cria Threads próprias (troca decontexto dentro da thread).
Compatibilidade com executáveisManter o layout dos dados.Conservar a pilha da aplicação.
MO801 - Seminário - DynamoRIO
Transparência
Regra 3: Fingir que a aplicação foi inaltera.Consistência da code cache.
Self-Modifying Code.Espaço de endereçamento.
Manter todas as propriedades que a aplicação espera.Proteger o código do DynamoRIO.
Endereços da aplicação.Mesmo sendo executada na code cache a aplicação devemanipular seus endereços originais.
MO801 - Seminário - DynamoRIO
Transparência
Regra 3: Fingir que a aplicação foi inaltera.Traduzir os contextos.
Deve salvar todos os contextos necessários da aplicação.Erros
Deve ser fiel aos problemas que poderiam ocorrernativamente.
Tempo.Tentar manter uma compatibilidade temporal com aexecução nativa.
MO801 - Seminário - DynamoRIO
Troca de contexto
Desempenho crítico.Otimizada para salvar apenas os registradores depropósito geral (não faz operações com pontosflutuantes), condition codes (registrador eflags) e demaisestados dependentes do sistema.Existem slots especiais para os elementos maisimportantes.Os elementos devem ser salvos em ambos sentidos datroca de contexto.
MO801 - Seminário - DynamoRIO
System Calls
Precisa monitor dois tipos de chamadas:Que afetam o espaço de endereçamento (e.g., alocaçãode memória).Afetam o fluxo de controle (e.g., capturar e tratar umsinal).
São facilmente descobertas na formação do bloco básico.Quando encontrar chamadas desconhecidas, inserircódigos de instrumentação antes e depois dela.
MO801 - Seminário - DynamoRIO
Self-Modifying Code
SandboxingNão bloqueia a escrita na região do código da aplicação.Armazena uma cópia do código da aplicação.Verificar cada Byte.Se passar pela verificação, cada escrita na memória vaiser monitorada.
MO801 - Seminário - DynamoRIO
Self-Modifying Code
Figura: Impacto no tempo de execução causado pelas verificações.
MO801 - Seminário - DynamoRIO
Self-Modifying Code
Regiões de MemóriaColoca as páginas com características iguais na mesmaregião.A região tem tamanho variável.Se uma pagina é escrita, ela divide a região.Se a instrução de escrita está na mesma página, ela émarcada como auto-modificável.
MO801 - Seminário - DynamoRIO
Gerenciamento de Memória
Não utilizar a heap do aplicativo para armazenarestruturas do DynamoRIO.O DynamoRIO pede pedaços de memória (64K) quandonecessita de expansão (mmap).Threads usam caches privadas, facilitando ogerenciamento.A separação de stubs de saltos diretos gera economia deespaço.
MO801 - Seminário - DynamoRIO
Gerenciamento de Memória
Figura: Redução da memória quando deletamos stubs não usados.
MO801 - Seminário - DynamoRIO
Gerenciamento de Memória
Figura: Principais estruturas de dados usadas (Tamanho em Bytes).
MO801 - Seminário - DynamoRIO
Gerenciamento de Memória
Figura: Ocupação da heap pelo DynamoRIO.
MO801 - Seminário - DynamoRIO
Performance
Figura: Estatísticas para a execução dos benchmarks.
MO801 - Seminário - DynamoRIO
Performance
Figura: Estatísticas para a execução dos benchmarks.
MO801 - Seminário - DynamoRIO
Performance
Figura: Divisão do tempo gasto no código da aplicação e noRuntime (Apenas em Linux benchmarks).
MO801 - Seminário - DynamoRIO
Performance
Figura: Impacto da implementação de otimizações adicionais(Adobe Premiere ).
MO801 - Seminário - DynamoRIO
Conclusão
É um poderosa ferramenta para explorar característicasdinâmicas de uma aplicação.Presa a arquiteturas e sistemas.