L'objectif principal de ce cours est de maîtriser la programmation « bas-niveau », c'est-à-dire proche de la machine, en utilisant une méthodologie de traduction systématique d'un code C vers son équivalent en assembleur.
Le cours débute par des rappels sur le langage C que vous avez déjà dû rencontrer, en mettant l'accent sur les spécificités du dialecte C99 que l'on utilisera ici, ainsi que sur les notions en liaison avec la partie sur l'assembleur.
L'initiation à la programmation en assembleur sur l'architecture Intel constitue le cœur de la matière et sera axée sur la compréhension des mécanismes utilisés dans un compilateur pour générer systématiquement du code assembleur, ainsi que sur les conventions à respecter pour faire cohabiter des fonctions écrites en C et en assembleur.
Le cours se conclura par un miniprojet basé sur la programmation d'un petit noyau de système d'exploitation, et qui mélangera des notions vues dans les deux parties précédentes.
L'enseignant responsable du cours de Logiciel de base est Christophe Rippert, n'hésitez pas à le contacter par mail pour toute question en dehors des séances encadrées.
L'évaluation prendra la forme d'un examen sur machine : les élèves devront réaliser en temps limité un petit TP faisant intervenir les notions vues en cours.
Seule une feuille de notes A4 manuscrite recto verso sera autorisée pendant cet examen, à l'exclusion de tout autre document ou matériel. Les différents supports de cours ci-dessous seront inclus avec le sujet.
On rappelle que les absences pour raison de santé ou force majeure doivent être signalées et justifiées le plus rapidement possible au service de scolarité. Vous devez également prévenir l'enseignant de votre absence.
Si vous travaillez sur votre machine personnelle, et si la compilation échoue en 32 bits alors qu'elle fonctionne en 64 bits, vous devez installer la bibliothèque manquante : sur Ubuntu et compatibles, le package devrait s'appeler gcc-multilib
. De même, si vous souhaitez utiliser Valgrind sur du code 32 bits, vous aurez peut-être besoin d'installer le package libc6-dbg:i386
(si le gestionnaire de paquets ne le trouve pas, vous devez ajouter le dépôt 32 bits via la commande sudo dpkg --add-architecture i386 ; sudo apt update
).
Si vous travaillez sur votre machine personnelle, il vous faudra peut-être installer la version 32 bits de QEmu (package qemu-system-i386
sur Ubuntu et compatibles).
Pour rafraichir votre mémoire sur le langage C (norme ANSI « de base »), on recommande la lecture du polycopié de Bernard Cassagne.
On fournit la documentation officielle des processeurs Intel, qui va évidemment beaucoup plus loin que ce qu'on voit dans ce cours. Attention, cette documentation fait plusieurs milliers de pages, ne l'imprimez pas ! Le jour de l'examen de TP, le sujet contiendra toutes les informations nécessaires, vous n'aurez pas besoin de cette documentation.
L'Application Binary Interface x86_64 est un document qui détaille les conventions présentées dans ce cours concernant notamment les appels de fonctions : là-encore, le document original va beaucoup plus loin que ce qu'on a besoin de savoir.
Pour ceux qui voudraient prendre de l'avance sur le projet système de 2A, le wiki des développeurs de systèmes fournit beaucoup d'information et de multiples références bibliographiques.
Nous utilisons des logiciels libres dans ce cours, développé par le projet GNU, qui fourni de nombreuses documentations très complètes :