- Un tutoriel interactif permettant d’apprendre pas à pas l’assembleur RISC-V via un émulateur exécutable dans le navigateur web, inspiré de Easy 6502 de Nick Morgan
- Couvre les 45 instructions de base de l’ensemble d’instructions RV32I_Zicsr ainsi que les concepts essentiels de l’architecture privilégiée, avec un jeu d’instructions suffisamment complet pour servir de cible de compilation
- Propose les bases de la programmation en assembleur avec des exemples pratiques : opérations arithmétiques/logiques, branchements/sauts, accès mémoire, convention d’appel des fonctions, gestion de la pile, etc.
- Explique à l’aide de code concret la transition entre niveaux de privilège entre le mode Machine et le mode User, le traitement des exceptions et la manipulation des CSR (registres de contrôle et d’état)
- L’objectif final du tutoriel est d’écrire soi-même un micro-système d’exploitation prenant en charge les appels système et le traitement des exceptions, afin d’expérimenter l’ensemble du flux du développement bas niveau sur RISC-V
Structure du tutoriel et principaux contenus d’apprentissage
Instructions de base et concepts du processeur
- État du processeur : compréhension du compteur ordinal (pc), des 31 registres généraux (x1~x31) et du registre zéro spécial (x0)
- Instructions arithmétiques : apprentissage de l’addition/soustraction et du comportement en cas de dépassement avec
add, addi, sub, etc.
- Opérations sur les bits : pratique des opérations logiques bit à bit et des décalages avec
and, or, xor, sll, srl, sra, etc.
- Instructions de comparaison : implémentation de comparaisons d’entiers signés/non signés et de logique conditionnelle avec
slt, sltu, etc.
Flux de contrôle et mémoire
- Branchements et sauts : mécanismes de branchement conditionnel/inconditionnel et d’appel de fonction avec
beq, bne, blt, jal, jalr, etc.
- Accès mémoire : opérations de chargement/stockage au niveau mot, demi-mot et octet avec les instructions
lw, sw, lb, lh, sb, sh
- I/O mappées en mémoire : compréhension de la communication avec des périphériques externes via des lectures/écritures à des adresses spécifiques
- Code indépendant de la position : techniques d’écriture de code relogeable avec l’instruction
auipc et l’adressage relatif au PC
Fonctions et convention d’appel
- Alias de registres : rôles de
a0~a7 (arguments), s0~s11 (préservés), t0~t6 (temporaires), ra (adresse de retour), sp (pointeur de pile), etc.
- Gestion de la pile : schémas de sauvegarde des registres à l’entrée d’une fonction, allocation/libération de l’espace pile, préservation et restauration de l’adresse de retour
- Fonctions récursives : pratique des appels récursifs et de la gestion des stack frames via l’implémentation de la suite de Fibonacci
Architecture privilégiée et système d’exploitation
- Niveaux de privilège : différences entre le mode Machine (niveau 3) et le mode User (niveau 0), ainsi que les mécanismes d’isolation
- Instructions CSR : lecture/écriture des registres de contrôle et manipulation de champs de bits avec
csrrw, csrrs, csrrc, etc.
- Traitement des exceptions : vérification des informations d’exception et écriture de gestionnaires à l’aide des CSR
mcause, mepc, mtval, mstatus
- Changement de mode : entrée en mode User et retour avec l’instruction
mret, et bascule de contexte à l’aide de mscratch
Projet final : micro-OS
- Implémentation des appels système : utilisation de l’instruction
ecall pour trapper du mode User vers le mode Machine et fournir les fonctions putchar/exit
- Sauvegarde/restauration des registres : structure complète d’un gestionnaire de trap qui sauvegarde et restaure tous les registres généraux sur la pile
- Logique de traitement des exceptions : identification de la cause via
mcause, dispatch selon le numéro d’appel système (a7) et affichage des messages d’erreur
- Code exécutable : fourniture d’un code complet d’entrée/sortie du noyau OS directement exécutable dans l’émulateur web
Ressources complémentaires et licence
- Le tutoriel comme le code sont placés sous domaine public CC0 ou sous licence BSD à 0 clause
- Texte original et dépôt de code : https://github.com/dramforever/easyriscv
- Adapté à l’apprentissage de RISC-V ainsi qu’à la mise en place d’environnements d’enseignement, de recherche et de simulation
Aucun commentaire pour le moment.