Pergunta

Estou procurando informações relacionadas à implementação de determinadas extensões da CPU em um módulo do kernel. Eu encontrei algo relacionado: http://www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c Na verdade, é o único código -fonte que eu posso encontrar que está próximo.

Basicamente, tenho um objeto compartilhado apenas binário construído com certas extensões da CPU, que preciso executar em uma CPU um pouco mais antiga, que tem a maior parte do conjunto de instruções, mas não as coisas novas. Sim, eu sei que será bastante lento, mas é melhor do que bater com Sigills.

Foi útil?

Solução 4

Bem, depois de ler a fonte do kernel, parece que já existe um pequeno apoio para isso. Eu realmente não consigo ver o quanto ele é realmente usado, mas existe uma lista vinculada para armazenar as várias instruções emuladas. Se eu conseguir realmente fazer isso, provavelmente mudarei para o cabeçalho do kernel.

Se eu estou entendendo os módulos do kernel corretamente, não parece que haveria um problema para apoiar a emulação fiscal.

Outras dicas

Eu acho que você pode fazer isso na terra do usuário. Instalar um manipulador para SIGILL com sigaction() e especificar SA_SIGINFO. O campo si_code no siginfo_t permite distinguir entre várias causas de SIGILL. Por exemplo, tentando imitar uma instrução quando o sinal veio de kill() não faz sentido. O terceiro argumento para o manipulador aponta para uma estrutura que contém o contexto da CPU no momento da falha (consulte a documentação). Você provavelmente pode modificar isso e retornar do manipulador de sinal, as mudanças entrando em vigor; Se isso não funcionar, tente setcontext().

Obviamente, será um pouco menos eficiente do que fazê -lo no kernel, mas mais limpo e seguro.

Você pode fazer isso, mas é um pouco doloroso. Os códigos de operações inválidos precisam ser interceptados, para que você precise modificar o manipulador de instruções ilegais existente ou envolver o manipulador, que é sujo e complicado.

Se você deseja evitar modos de kernel, mas faça como um núcleo puro, a abordagem de exceção de exceção é provavelmente a única maneira de fazê-lo. Se você pode modificar o kernel, o manipulador remendado é melhor.

Eu não acho que você possa corrigir esse problema usando um módulo de kernel. Eu acho que você precisa executar isso em uma VM que permita as instruções ausentes (eu tentaria usar o XEN) ou recompilar o objeto para que ele não as use.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top