Introduction

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.

Mise en place

Pour commencer, créez le canevas de l'extension dans le fichier interruption.svm_plugin en utilisant ce code :

PLUGIN irq

DEFINE

Déclaration

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.

Utilisation

Erreur dans une instruction

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.

Valeur interruption

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.

Conclusion

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.