OS Awareness
Simics OS awareness é um módulo Simics que entende as estruturas de dados e abstrações do sistema operacional rodando no sistema alvo Simics. Com a consciência do SO, Simics e o depurador Simics conhecem o espaço do kernel, espaço do usuário, processos, threads e tarefas.
Fundamentalmente, a consciência do SO executa duas tarefas: rastreamento ao vivo dos eventos conforme eles acontecem, e investigação do estado instantâneo do sistema operacional. O rastreamento ao vivo dos eventos significa que a consciência do SO detecta quando o sistema operacional executa uma mudança de tarefa, quando o software faz uma chamada ao sistema, ou quando ocorrem interrupções. Na verdade, a forma mais comum de detectar tais eventos é esperar por interrupções no sistema alvo – desde que não ocorram interrupções, o mesmo software ao nível do utilizador está a funcionar. Quando uma interrupção acontece, o sistema operacional assume o controle e o processo em execução é considerado como tendo sido comutado. Quando o sistema operacional retorna ao espaço do usuário, algum processo é considerado como tendo sido comutado em.
Rastreamento em tempo real determina quando algo acontece, mas determinar o que aconteceu requer a investigação do estado instantâneo do sistema operacional. Por exemplo, quando uma interrupção é acionada, quais são os threads ativos no processador que recebeu a interrupção? Para determinar isso, a consciência do SO precisa conhecer a estrutura das filas de processos em execução e espera, o conteúdo das estruturas de tarefas ou blocos de controle de processos, e outras estruturas de dados. Desde que isto tenha sido configurado corretamente, a consciência do SO pode então atravessar as listas na memória alvo e determinar o nome do processo atualmente ativo em um determinado processador, todos os processos existentes, módulos de software carregados dinamicamente e seus endereços de relocação, e qualquer outra coisa de interesse.
Porque o conteúdo preciso das estruturas de tarefas e os offsets de campos particulares podem variar entre construções e versões do sistema operacional, a consciência do SO tem que ser configurada antes de poder ser usada. Na maioria das vezes, é possível determinar os parâmetros para a consciência do SO olhando para uma tabela de símbolos ou arquivo do kernel com informações de depuração da compilação do SO. Entretanto, existem sistemas operacionais onde os parâmetros precisos não podem ser determinados até o tempo de execução, e nestes casos a configuração terá que esperar até que o sistema alvo seja inicializado. Em qualquer caso, uma vez determinado, o conjunto de parâmetros pode ser salvo e usado na próxima vez que a mesma configuração de destino for executada.
O uso de arquivos de parâmetros torna possível que configurações de consciência do SO sejam distribuídas junto com as imagens do SO a que elas se referem. Isto significa que uma equipe da plataforma pode construir uma imagem do SO, configurar a consciência do SO para ela, salvar os parâmetros e fornecer aos seus usuários o SO e seus parâmetros de consciência do SO sem ter que fornecer arquivos de símbolos ou informações de depuração. O arquivo de parâmetros de consciência do SO é simplesmente parte da pilha de software fornecida, e é ativado nos scripts de inicialização usados para iniciar o Simics. Os usuários do sistema não precisam saber como configurar a consciência do sistema operacional – eles apenas o fazem funcionar assim que iniciam as configurações do sistema alvo fornecido. Os parâmetros de consciência do SO também são salvos dentro dos arquivos de pontos de verificação do Simics, de modo que a consciência do SO continua trabalhando através das operações de salvamento e restauração dos pontos de verificação.
consciência do SO torna possível ter as características do Simics funcionando apenas em um subconjunto particular da pilha de software, como ter pontos de parada definidos apenas dentro de um determinado processo, ou rastrear apenas acessos à memória executados pelo kernel e não por tarefas em nível de usuário. Uma extensão ou script Simics escrito pelo usuário pode ouvir os eventos da consciência do SO e tomar ações baseadas em qual software está rodando atualmente no sistema alvo. É possível pedir ao sistema de consciência do SO notificações apenas para um determinado processo, ou ver todas as ações para todos os processos.
O sistema de consciência do SO em Simics opera com o conceito de uma árvore de nós. Cada nó na árvore representa um nível de abstração no modelo de processo do sistema operacional. Tipicamente, o nó superior é o próprio sistema operacional, que é então dividido em tarefas no nível do kernel e do usuário. Em um sistema operacional como o Linux, cada tarefa em nível de usuário contém um ou mais threads. No kernel, a consciência do SO normalmente distingue as threads do kernel da tarefa ociosa, porque isso ajuda a contabilizar o tempo de execução alvo. A Figura 3.3 mostra um exemplo de uma árvore de nós de um sistema Linux barebones.
No CLI Simics e no GUI do depurador, são usadas consultas de processo para encontrar processos de interesse. Essas consultas podem combinar nomes de processos, números de identificação de processos ou outras propriedades disponibilizadas pela consciência do sistema operacional. Na maioria dos casos, o nome de um processo é suficiente para identificá-lo, mas em sistemas complexos são necessárias correspondências mais complexas, tais como “o processo chamado foo no quadro chamado barra”. Em um sistema de longa duração onde um determinado programa é executado muitas vezes, o ID do processo pode ser usado para identificar um determinado início de um processo.
A consciência de SO simples suporta sistemas operacionais aninhados para lidar com a consciência de SO para sistemas baseados em hypervisor. Em um sistema com hipervisor, é necessário rastrear o agendamento dos sistemas operacionais convidados nos núcleos do processador de destino. Uma vez que o sistema operacional ativo em um núcleo tenha sido determinado, é possível então aplicar a consciência de SO para esse sistema operacional para determinar o processo ativo ou thread. Uma única árvore é então usada para todo o sistema, enraizada no hypervisor.
Os detalhes do que a consciência do SO pode rastrear e descobrir sobre a pilha de software alvo varia dependendo do sistema operacional convidado e quanto trabalho foi gasto na construção da consciência do SO para ele.
Comparado com os sistemas de consciência do SO usados com depuradores baseados em hardware (JTAG), a habilidade de um simulador para rastrear com precisão as trocas de tarefas é única. Tais características provaram ser impraticáveis de implementar em depuradores baseados em hardware, porque eles incorreriam em uma sobrecarga significativa e sobrecarregariam a disponibilidade de pontos de interrupção de hardware. A inspeção do estado instantâneo é essencialmente a mesma que a inspeção do estado do sistema por um depurador de hardware após parar o sistema, e de fato o mesmo código usado para depuradores de hardware tem sido usado com Simics para determinar fatos como endereços de realocação para módulos carregados dinamicamente.
Um depurador baseado em agente não precisa ter consciência do SO, porque está rodando dentro do sistema alvo e pode usar APIs de SO para perguntar ao SO alvo sobre tarefas rodando, módulos carregados e outras informações.