Changement de contexte
Le déplacement des trames de l'espace utilisateur vers l'espace noyau est appelé changement de contexte, qui est généralement provoqué par un appel système (qui invoque la fonction int 0x80
interrompre).
- L'interruption se produit, entrant dans l'espace du noyau ;
- Lorsqu'une interruption se produit, os stocke la valeur de tous les registres dans le fichier pile noyau d'un fil :
ds
, es
, fs
, eax
, cr3
etc.
- Ensuite, il saute au gestionnaire d'IRQ comme un appel de fonction ;
- Par le biais d'un chemin d'exécution commun d'IRQ, il choisira le prochain thread à exécuter par un certain algorithme ;
- Les informations d'exécution (tous les registres) sont chargées à partir du thread suivant ;
- Retour à l'espace utilisateur ;
Comme nous pouvons le voir, nous allons faire beaucoup de travail lors du déplacement de la trame dans/hors du noyau, ce qui est beaucoup plus de travail qu'un simple appel de fonction (juste la mise en place de ebp
, esp
, eip
). C'est pourquoi ce comportement est relativement long.
Dispositifs virtuels
En tant que périphérique de réseau virtuel, l'écriture sur TAP ne présente aucune différence par rapport à l'écriture sur un périphérique de réseau virtuel. /dev/xxx
.
Si vous écrivez sur TAP, os sera interrompu comme dans la description ci-dessus, puis il copiera vos arguments dans le noyau et bloquera votre thread actuel (en bloquant IO). Le thread du pilote du noyau sera notifié d'une manière ou d'une autre (par exemple par une file de messages) pour recevoir les arguments et les consommer.
Dans Andorid, il existe un certain Appel système sans copie Dans mes implémentations de démonstration, cela peut être fait par la traduction d'adresse entre l'utilisateur et le noyau. Comme le noyau et le thread utilisateur ne partagent pas le même espace d'adressage et que les données du thread utilisateur peuvent être modifiées, nous copions généralement les données dans le noyau. Donc, si nous remplissons les conditions, nous pouvons éviter la copie :
- cet appel système doit être bloqué, c'est-à-dire que les données ne seront pas modifiées ;
- traduire entre les adresses par des tables de pages, c'est-à-dire que le noyau peut se référer aux bonnes données ;
Code
Les codes suivants proviennent de ma démo os, qui est liée à cette question si vous êtes intéressé par le détail :