Question

Je suis à la recherche d'informations relatives à l'application de certaines extensions CPU dans un module du noyau. J'ai trouvé quelque chose lié: http: / /www.mirrors.docunext.com/lxr/http/source/arch/mips/kernel/unaligned.c en fait, il est le seul code source que je peux trouver qui est encore proche.

En fait, j'ai un objet binaire partagé uniquement construit avec certaines extensions CPU, que je dois exécuter sur un processeur légèrement plus qui a la plupart du jeu d'instructions, mais pas la fantaisie de nouvelles choses. Ouais, je sais que ce sera plutôt lent, mais il est mieux que de s'écraser avec SIGILLs.

Était-ce utile?

La solution 4

Eh bien, après avoir lu la source du noyau, il semble qu'il y ait déjà un soutien mineur à cet effet. Je ne vois vraiment pas combien il est effectivement utilisé, mais il existe une liste liée à stocker les différentes instructions émulés. Si je suis en mesure d'obtenir réellement ce que ça va, je vais probablement changer à l'arbre fourni en-tête du noyau.

Si je suis les modules du noyau compréhension juste, il ne ressemble pas qu'il y aurait un problème pour soutenir l'émulation connectable.

Autres conseils

Je pense que vous pouvez le faire en userland. Installer un gestionnaire pour SIGILL avec sigaction() et préciser SA_SIGINFO. Le si_code sur le terrain dans le siginfo_t permet de distinguer entre plusieurs causes de SIGILL. Par exemple, en essayant d'imiter une instruction lorsque le signal est venu de kill() n'a pas de sens. Le troisième argument aux points de gestionnaire d'une structure contenant le contexte du processeur au moment de la panne (voir la documentation). Vous pouvez modifier cette probable et retour du gestionnaire de signaux, les changements prenant effet; si cela ne fonctionne pas, essayez setcontext().

De toute évidence, il sera un peu moins efficace que de le faire dans le noyau, mais plus propre et plus sûr.

Vous pouvez le faire, mais son peu douloureuse. Les opcodes invalides doivent être interceptées, de sorte que vous soit nécessaire de modifier le gestionnaire d'instruction illégale existant ou envelopper le gestionnaire, qui est sale et compliqué.

Si vous voulez éviter les mods du noyau, mais faire en tant que noyau pur, l'approche exception enveloppée est probablement la seule façon de le faire. Si vous pouvez modifier le noyau, le gestionnaire est patché mieux.

Je ne pense pas que vous pouvez résoudre ce problème en utilisant un module de noyau. Je pense que vous soit nécessaire d'exécuter cette dans une machine virtuelle qui permet aux instructions manquantes (je voudrais essayer d'utiliser Xen) ou recompiler l'objet afin qu'il ne les utilise pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top