A method and apparatus of translating and executing native code in a
virtual machine environment. Debugging of a virtual machine implementation
is made easier through binary translation of native code, which permits
greater platform independence and greater control over thread management
and scheduling, and provides for identification of memory access errors in
the native code. When native code is to be executed within a virtual
machine environment, the native code is translated into an intermediate
form. This intermediate form is processed to determine where memory access
and blocking system calls occur. Validity checks are inserted into memory
access calls to determine whether the portion of memory to be accessed by
each call is within a permitted range. Wild pointers and other resources
of memory access errors associated with the native code may thus be
identified. Blocking system calls are replaced with non-blocking variants,
and "yield" operations may be inserted into system calls and loops. The
revised native code incorporating memory access validity checks and
non-blocking system calls is compiled or interpreted by the virtual
machine to execute the routines defined by the native code. Because the
revised native code does not block other threads, thread scheduling may be
managed by the virtual machine rather than the underlying operating
system, and cooperative scheduling may be performed.
Une méthode et un appareil de traduire et d'exécuter le code indigène dans un environnement virtuel de machine. La correction d'une exécution virtuelle de machine est faite à une traduction binaire traversante plus facile du code indigène, qui permet la plus grande indépendance de plateforme et un plus grand contrôle de gestion et de l'établissement du programme de fil, et prévoit l'identification des erreurs d'accès mémoire dans le code indigène. Quand le code indigène doit être exécuté dans un environnement virtuel de machine, le code indigène est traduit en forme intermédiaire. Cette forme intermédiaire est traitée pour déterminer où l'accès mémoire et le blocage des appels de système se produisent. Des contrôles de validité sont insérés dans des appels d'accès mémoire pour déterminer si la partie de la mémoire consulter par chaque appel est dans une marge autorisée. Les indicateurs sauvages et d'autres ressources des erreurs d'accès mémoire se sont associés au code indigène peuvent être identifiés ainsi. Bloquant des appels de système sont remplacés avec des variantes non groupantes, et des opérations d'"rendement" peuvent être insérées dans des appels et des boucles de système. La validité d'incorporation révisée d'accès mémoire de code indigène vérifie et des appels non groupants de système est compilés ou interprétés par la machine virtuelle pour exécuter les routines définies par le code indigène. Puisque le code indigène révisé ne bloque pas d'autres fils, l'établissement du programme de fil peut être contrôlé par la machine virtuelle plutôt que le logiciel d'exploitation fondamental, et l'établissement du programme de coopérative peut être effectué.