xv6-riscv/notes/riscv-vs-x86-concepts.md

6.2 KiB

IDT, TSS, Interrupt Relay et GDT

Équivalent RISC-V de quelques concepts de x86 (IDT, TSS, Interrupt Relay et GDT).

1. Interrupt Descriptor Table (IDT)

  • Description : Dans l'architecture x86, l'IDT est une table utilisée par le processeur pour gérer les interruptions et les exceptions. Elle contient des descripteurs qui pointent vers les routines de traitement d'interruptions (ISR, Interrupt Service Routines).
  • Équivalent en RISC-V : RISC-V utilise un mécanisme similaire appelé Interrupt Vector Table (IVT). Cette table contient des adresses de saut vers les routines de traitement d'interruptions. RISC-V permet également une gestion flexible des interruptions via des registres de contrôle et des modes privilégiés (Machine, Supervisor, User).

2. Task State Segment (TSS)

  • Description : En x86, le TSS est une structure de données utilisée pour stocker l'état d'une tâche (comme les registres, la pile, etc.) lors d'un changement de contexte. Il est principalement utilisé pour la gestion des tâches en mode protégé.
  • Équivalent en RISC-V : RISC-V n'a pas de TSS directement équivalent. Cependant, le changement de contexte en RISC-V est géré via des registres et des instructions spécifiques (comme mret, sret pour retourner d'une interruption ou d'une exception). L'état du processeur est sauvegardé et restauré manuellement ou via des mécanismes logiciels.

3. Interrupt Relay

  • Description : Ce terme fait référence à un mécanisme où les interruptions sont relayées d'un composant à un autre. Par exemple, dans un système multicœur, une interruption peut être relayée d'un cœur à un autre pour traitement.
  • Équivalent en RISC-V : RISC-V supporte des mécanismes similaires via des contrôleurs d'interruptions (PLIC, Platform-Level Interrupt Controller) qui permettent de router les interruptions entre les cœurs ou les périphériques. Le PLIC est souvent utilisé pour gérer les interruptions dans des systèmes multicœurs.

4. Global Descriptor Table (GDT)

  • Description : En x86, la GDT est une table utilisée pour définir les segments de mémoire (code, données, etc.) et leurs attributs (niveau de privilège, type, etc.). Elle est essentielle pour la gestion de la mémoire en mode protégé.
  • Équivalent en RISC-V : RISC-V n'utilise pas de segmentation mémoire comme en x86, donc il n'y a pas de GDT. À la place, RISC-V utilise une gestion de mémoire basée sur la pagination (via des tables de pages) pour isoler les espaces d'adressage des différents modes privilégiés (Machine, Supervisor, User).

Résumé pour RISC-V :

  • IDTInterrupt Vector Table (IVT).
  • TSS → Pas d'équivalent direct, gestion manuelle ou logicielle du contexte.
  • Interrupt Relay → Géré via des contrôleurs d'interruptions comme le PLIC.
  • GDT → Pas d'équivalent, utilisation de la pagination pour la gestion de la mémoire.

Si tu travailles sur RISC-V, il est important de te familiariser avec les spécifications officielles et les extensions disponibles (comme l'extension "A" pour les interruptions atomiques). Ces concepts sont souvent implémentés différemment selon les systèmes et les niveaux de privilège.

CPUID

En RISC-V, il n'y a pas d'instruction directe équivalente à l'instruction CPUID d'x86, qui permet de récupérer des informations détaillées sur le processeur (comme le modèle, la famille, les fonctionnalités supportées, etc.). Cependant, RISC-V fournit des mécanismes pour obtenir des informations sur le processeur via des registres CSRs (Control and Status Registers) et des extensions spécifiques.

Mécanismes en RISC-V pour obtenir des informations sur le processeur :

  1. Registres CSRs :

    • RISC-V définit plusieurs registres CSRs qui contiennent des informations sur le processeur, comme :
      • mvendorid : Identifie le fabricant du processeur.
      • marchid : Identifie l'architecture du processeur.
      • mimpid : Identifie l'implémentation spécifique du processeur.
      • mhartid : Identifie le cœur (hart) actuel dans un système multicœur.
    • Ces registres peuvent être lus à l'aide d'instructions CSR comme csrr (par exemple, csrr a0, mvendorid).
  2. Extensions et fonctionnalités :

    • RISC-V est modulaire et supporte des extensions optionnelles (comme l'extension "M" pour la multiplication, "A" pour les opérations atomiques, "F" pour les flottants, etc.).
    • Pour déterminer quelles extensions sont supportées par un processeur, on peut consulter le registre misa (Machine ISA Register). Ce registre contient des bits qui indiquent les extensions activées.
  3. Appels système ou firmware :

    • Dans certains systèmes RISC-V, des informations supplémentaires sur le processeur peuvent être obtenues via des appels système ou des interfaces firmware (comme SBI, Supervisor Binary Interface). Par exemple, le SBI peut fournir des informations sur les fonctionnalités disponibles ou la topologie du système.
  4. Device Tree (Arbre de périphériques) :

    • Dans les systèmes embarqués ou Linux, les informations sur le processeur et ses fonctionnalités sont souvent décrites dans un Device Tree (un fichier de description matérielle). Ce fichier peut être analysé pour obtenir des détails sur le processeur.

Exemple de lecture des registres CSRs en RISC-V :

# Lire le mvendorid (Manufacturer ID)
csrr a0, mvendorid

# Lire le marchid (Architecture ID)
csrr a1, marchid

# Lire le misa (ISA et extensions supportées)
csrr a2, misa

Résumé :

  • RISC-V n'a pas d'instruction unique comme CPUID, mais il utilise des registres CSRs pour fournir des informations sur le processeur.
  • Les registres comme mvendorid, marchid, mimpid, et misa sont les principaux moyens d'obtenir des informations sur le processeur.
  • Pour des informations plus détaillées, il peut être nécessaire de consulter la documentation du fabricant ou d'utiliser des mécanismes comme le Device Tree ou le SBI.

Si tu développes en C ou en assembleur, tu peux accéder à ces registres via des instructions CSR ou des bibliothèques spécifiques fournies par l'environnement de développement.