Ce didacticiel est destiné aux utilisateurs maîtrisant la programmation en C ou C++, ainsi que l'architecture de la Simple Virtual Machine.
Dans ce didacticiel, vous allez découvrir la création et la manipulation des interruptions extension.
Le temps de lecture de ce didacticiel est estimé à 15 minutes.
Pour commencer, créez le canevas de l'extension dans le fichier interruption.svm_plugin en utilisant ce code :
PLUGIN irq
DEFINE
Modifiez le code de l'extension :
PLUGIN irq
DEFINE
INTERRUPTION irq.example
Vous pouvez générer, compiler l'extension et l'inclure dans une petite application de test pour vérifier que l'interruption est acceptée par l'instruction :interruption
.
Une interruption extension se définit entièrement grâce à sa déclaration.
En effet, une interruption n'est qu'une entrée d'extension spécialement reconnue par les processeurs pour interrompre l'exécution du code.
Modifiez le code de l'extension :
PLUGIN irq
DEFINE
INTERRUPTION irq.example
INSTRUCTION irq.check INT
%{
auto i = ARGV_VALUE(0,integer);
if(i<0)
{
ERROR_EXTERNAL(irq,example,"You fail!");
}
%}
Générez puis compilez l'extension. Puis créez une petite application avec ce code :
#!/usr/bin/env svm
LOG
DEBUG "interruptions"
LOCAL PLUGIN "svmpluginirq/libsvmirq.so"
PROCESS "interruptions"
CODE "main" INLINE
:irq.check 1
:irq.check 0
:irq.check -1
END
END
Lancez l'application :
./interruptions.svm
### Simple Virtual Machine 1234 : PROCESS interruptions | 2023-01-01 00:00:00 GMT ####################################################################
Kernel interrupted: @(main, line 3) Interruption !irq.example not handled: You fail!
Core dump:
Kernel:
State: I, transmit_interruption, interrupted @(main, line 3) Interruption !irq.example not handled: You fail!
Processor:
State:
Next instruction: <main:1/3> (Current one: <main:1/2>)
Current memory : &0*0
Allocated memory:
Aliases :
Flags :
Cascaded flags :
Local interruption handlers:
Cascaded local interruption handlers:
Saved states:
Global interruption handlers:
Code at <main:1/2>:
:irq.check 1 # <0> @(main, line 1)
:irq.check 0 # <1> @(main, line 2)
====== HERE ======
:irq.check -1 # <2> @(main, line 3)
==================
Labels:
Symbols:
Memory:
Aliases:
Free space:
### Simple Virtual Machine 1234 : SYSTEM | 2023-01-01 00:00:00 GMT ###################################################################################
Process interruptions interrupted: @(main, line 3) Interruption !irq.example not handled: You fail!
Comme attendu, c'est la troisième instruction qui lève l'interruption !irq.example
avec le message d'erreur inscrit dans le code de l'instruction.
L'interruption déclarée dans une extension peut être utilisée en tant que valeur de type interruption. Modifiez le code de l'extension :
PLUGIN irq
DEFINE
INTERRUPTION irq.example
INSTRUCTION irq.raise IRQ
%{
SVM_Value_Interruption irq = ::svm_parameter_value_get(svm,argv[0]);
::svm_processor_add_interruption(svm,CURRENT(kernel),irq);
::svm_machine_trace__raw(svm,"Passing here...");
%}
Regénérez et compilez l'extension, puis lancez cette application :
#!/usr/bin/env svm
LOG
DEBUG "interruptions"
LOCAL PLUGIN "svmpluginirq/libsvmirq.so"
PROCESS "interruptions"
CODE "main" INLINE
:irq.raise !irq.example
END
END
L'exécution affiche la trace puis l'interruption non rattrappée, ce qui est attendu ici : la fonction svm_processor_add_interruption
n'arrête pas l'exécution de l'instruction, mais place une interruption en attente dans le processeur. Cette interruption est traitée entre deux instructions.
Vous venez de voir comment définir et utiliser les interruptions extension.
Créér des interruptions dédiées aux erreurs particulières aux objets d'une extension permet une gestion fine des erreurs par l'utilisateur de l'extension. Il convient alors de correctement anticiper comment l'utilisateur va vouloir définir ses gestionnaires d'interruption en rapport avec l'extension : un compromis entre une gestion trop brutale (un seul type d'interruption) et une gestion trop fine (une interruption par erreur possible) doit toujours être soigneusement fait pour une utilisation optimale de l'extension.