Catégorie:Deuxième Année Catégorie:Informatique

Actualités

Makefile fourni :

Projet pour les apprentis : Top départ le 9 juin 2016 à 8h15 en D200!

Présentation

Ajouter /usr/libexec à votre PATH (faites le une fois pour toute dans le .bash_rc par exemple).

Prendre en main l'environnement de travail : Carte conceptuelle des outils

Pour démarrer, reprendre la gestion d'écran et le timer sur les sources fournis. (Etapes 1 et 2) voir Cours de pratique du système

Voilà un projet:

Vous êtes au bon endroit. Bonne lecture !!!

Planning d'encadrement

Le projet démarre le mardi 17 mai 2016 à 9h en salle E212.

Ensuite, la salle D201 vous est réservée du mardi 17 mai à 14h00 jusqu'au vendredi 10 juin 17h00.

Sur cette période, soit François Broquedis, soit Gaëtan Harter, soit Grégory Mounié sera présent chaque matin entre 9h30 et 12h30 SAUF le jeudi 19 mai et le lundi 23 mai, où la séance encadrée se déroulera l'après-midi, entre 14h et 17h.

Enseignants

François Broquedis pour le projet de spécialité 2A, Gaëtan Harter pour le projet de spécialité 2A, Grégory Mounié, Sébastien Viardot

Présentation

Les projets de spécialité système permettent de mettre en oeuvre des concepts associés aux systèmes d'exploitation : synchronisation, concurrence, partage de tâche, temps réel, pilotes matériels, ... : voir Présentation

Pour les apprentis 2A le projet est centré sur la conception d'un système d'exploitation sur machine nue : Présentation

Catégorie conception d'un système d'exploitation

Un cahier des charges minimal est à réaliser (voir Documentation du projet). Les extensions seront à définir au début du projet avec l'encadrant selon le goût des groupes. La plateforme pour laquelle le système est développé est un PC.

Projet sur PC

Suivi

Accompagnement des étudiants

Les consignes transmises au départ

Attente à la fin du projet

Pour chaque équipe, nous attendons les éléments suivants.

Livrables :
Le cahier des charges complété avec les extensions, les plannings prévisionnel et effectif, le journal de bord, un code clair et commenté et un dépôt bien renseigné des évolutions faites pendant tout le projet (outil git).

Note : la tenue de votre dépôt Git sera évaluée, notament en ce qui concerne les messages de commits. Référez-vous à la section ci-dessous pour plus d'information.

Soutenance :
Une présentation de la réalisation. Il est important de montrer ce qui fonctionne et ce qui ne fonctionne pas. Les enseignants ont à leur disposition une fiche de soutenance où sont passés en revue les points critiques du projet.
Page web :
Une page web succincte dans le wiki (qui sera publique)
et éventuellement
Il peut être utile de relire les consignes sur la réalisation d'une page Web.

Résultats des projets passés

Les pages demandées ci-dessus sont regroupées dans les résultats du projet système.

Documentation du projet

Documentation externe

gdb et ddd

info gdb
info ddd

Éléments d'assembleur et de C

Processeurs Intel

Attention: ne pas imprimer ces documents (plus de 500 pages chacun)

Développement d'OS

Dépôts Git

Les dépôts Git sont hébergés sur depots.ensimag.fr. Ils ont été initialisés avec les sources de départ du projet. Pour en récupérer une copie, utilisez l'une des deux commandes suivantes selon l'architecture sur laquelle vous travaillez :

Pour les 2A et pour les 2A apprentissage dans une équipe officielle :

2A:
git clone ssh://votre_login@depots.ensimag.fr/depots/2015/psys/login1-login2-login3/psys-base psys.git
2A Apprentis:
git clone ssh://votre_login@depots.ensimag.fr/depots/2015/psysAPP/login1-login2-login3/psys-base psys.git

Pour récupérer les points de départs pour un autre usage (nécessite d'avoir un compte sur depots.ensimag.fr) :

2A: 
git clone ssh://votre_login@depots.ensimag.fr/depots/2015/psys/psys-base psys.git
2A Apprentis:
git clone ssh://votre_login@depots.ensimag.fr/depots/2015/psysAPP/login1-login2-login3/psys-base psys.git

Cela créera un répertoire de travail nommé psys.git. Évidemment, il faut remplacer les mots votre_login, login1, login2 et login3 (le cas échéant) par les valeurs pertinentes. Les logins de votre équipe sont triés par ordre alphabétique.

Vous pouvez vous référez à la page Git.

Gestion du dépôt

Maintenir un dépôt pour développer dans de bonnes conditions nécessite un peu de rigueur. Il existe quelques règles de bon sens à respecter pour que le projet se déroule dans de bonnes conditions pour tous les membres du groupe:

Evaluation : Votre dépôt Git représente votre travail, sa tenue sera donc évaluée. Tout le monde doit contribuer au code, les informations d'auteurs doivent être correctement renseignées et les messages de commit proprement formatés.

Formater son message de commit

Le message de commit est la première documentation disponique à un collègue ou un prof qui clone votre dépôt. Concrètement, un git show montre le message de commit et le patch associé, le premier doit aider à comprendre le second dans les grandes lignes.

Ce message doit décrire la motivation du patch (le fonctionnalité proposée ou le bug corrigé) ainsi que l'implémentation que le patch fourni. A titre d'exemple, voici un des patchs fourni pour corriger un bug de la chaine de compilation du projet:

commit 9ef02d5c8b05e15f65fa2b63f623a725e07db148
Author: Damien Dejean <dam.dejean@gmail.com>
Date:   Fri May 24 20:45:55 2013 +0200

    Build: fix dependency file generation.
    
    To let make track dependencies between implementation files (.c, .S) and header
    files (.h), the toolchain generates dependency files (.d) using a gcc feature
    that creates the appropriate makefile targets. These files were listed, but not
    included, therefore not generated.
    
    This fix includes the .d files in the makefile to trig their generation and use
    them. Now make will know that it has to re-compile a c files when the included
    headers have been modified.

La première étape pour avoir des messages de commits corrects est de configurer son Git correctement, définissez un nom d'utilisateur ainsi qu'une adresse e-mail qui apparaitra dans les messages. Ne mettez pas n'importe quoi ! Souvenez-vous que dans le cas de contributions publiques (typiquement sur GitHub) les messages de commits seront votre vitrine.

Configurer son nom et son email (dans votre dépôt Git):

$ git config user.name "Damien Dejean"
$ git config user.email dam.dejean@gmail.com
$ git config -l
[...]
user.name=Damien Dejean
user.email=dam.dejean@gmail.com
[...]

Si vous souhaitez que cette configuration soit globale à votre machine, ajoutez le switch --global et tous vos dépôts hériterons de cette configuration par défaut.

Afin de vous familiariser avec les bonnes pratiques, nous vous proposons un template de commit. C'est un exemple de message qui apparaitra dans votre éditeur préféré (en tout cas celui de votre variable EDITOR) chaque fois que vous tapez git commit, pour vous guider dans votre rédaction

commit-template.txt

<"sujet: bref résumé" (60 cars max) ici !>

Vous pouvez le définir comme template par défaut en faisant:

git config commit.template /chemin/vers/le/fichier/git-commit-template.txt

code test pour le clavier canonique (Apprentis 2A)

 unsigned long cons_read(char *string, unsigned long length);
 
 static void
 cons_gets(char *s, unsigned long length)
 {
   unsigned long n;
   if (length == 0) return;
   n = cons_read(s, length - 1);
   s[n] = 0;
   return;
 }
 
 /*******************************************************************************
  * Test 19
  *
  * Test du clavier.
  ******************************************************************************/
 static int
 cons_rd0(void *arg)
 {
   unsigned long i;
   char buf[101];
 
   i = cons_read(buf, 100);
   buf[i] = 0;
   printf(". : %s\n", buf);
   return 0;
 }
 
 static int
 cons_rdN(void *arg)
 {
   unsigned long i;
   char buf[101];
 
   i = cons_read(buf, 100);
   buf[i] = 0;
   printf("%d : %s\n", 133 - getprio(getpid()), buf);
   return 0;
 }
 
 static void
 mega_cycles(int n)
 {
   unsigned long long t1, t2;
   int i = 0;
 
   __asm__ __volatile__("rdtsc":"=A"(t1));
   for (i=0; i<n; i++) {
       do {
           test_it();
           __asm__ __volatile__("rdtsc":"=A"(t2));
       } while ((t2 - t1) < 1000000);
       t1 += 1000000;
   }
 }
 
 static void
 test19(void)
 {
   char ch[101];
   int i;
   unsigned long j;
   int pid1, pid2, pid3, pid4;
 
   printf("cons_read bloquant, entrez des caracteres : ");
   j = cons_read(ch, 100); ch[j] = 0;
   printf("%lu chars : %s\n", j, ch);
   printf("Frappez une ligne de 5 caracteres : ");
   j = cons_read(ch,5); ch[5] = 0;
   printf("%lu chars : %s\n", j, ch);
   j = cons_read(ch,5);
   if (j != 0) printf("!!! j aurait du etre nul\n");
   assert(cons_read(ch, 0) == 0);
 
   printf("Les tests suivants supposent un tampon clavier de l'ordre  de 20 caracteres.\nEntrez des caracteres tant qu'il y a echo, frappez quelques touches\nsupplementaires puis fin de ligne : ");
   j = cons_read(ch, 100); ch[j] = 0;
   printf("%lu chars : %s\n", j, ch);
 
   printf("Entrees sorties par anticipation. Frappez 4 lignes en veillant a ne pas\ndepasser la taille du tampon clavier : ");
   for (i=0; i<80; i++) {
       mega_cycles(200);
       printf(".");
   }
   printf("Fini.\n");
   pid1 = start(cons_rd0, 4000, 129, "cons_rd0", 0);
   pid2 = start(cons_rd0, 4000, 129, "cons_rd0", 0);
   pid3 = start(cons_rd0, 4000, 129, "cons_rd0", 0);
   pid4 = start(cons_rd0, 4000, 129, "cons_rd0", 0);
   waitpid(pid2, 0);
   waitpid(pid3, 0);
   waitpid(pid1, 0);
   waitpid(pid4, 0);
 
   printf("Entrees sorties par anticipation. Depassez maintenant la taille du tampon\nclavier : ");
   for (i=0; i<80; i++) {
       mega_cycles(200);
       printf(".");
   }
   printf("Fini.\n");
   pid1 = start(cons_rd0, 4000, 129, "cons_rd0", 0);
   pid2 = start(cons_rd0, 4000, 129, "cons_rd0", 0);
   pid3 = start(cons_rd0, 4000, 129, "cons_rd0", 0);
   pid4 = start(cons_rd0, 4000, 129, "cons_rd0", 0);
   waitpid(pid2, 0);
   waitpid(pid3, 0);
   waitpid(pid1, 0);
   waitpid(pid4, 0);
 
   printf("Enfin on teste que dans le cas d'entrees bloquantes, les processus sont servis\ndans l'ordre de leurs priorites. Entrez quatre lignes : ");
   pid1 = start(cons_rdN, 4000, 130, "cons_rdN", 0);
   pid2 = start(cons_rdN, 4000, 132, "cons_rdN", 0);
   pid3 = start(cons_rdN, 4000, 131, "cons_rdN", 0);
   pid4 = start(cons_rdN, 4000, 129, "cons_rdN", 0);
   waitpid(pid2, 0);
   waitpid(pid3, 0);
   waitpid(pid1, 0);
   waitpid(pid4, 0);
 }