Projet système PC : 2013 - Paul GANNAY et Dominique LEE

De Ensiwiki
Aller à : navigation, rechercher
OsOS logo.png osOS
OsOS philo ps.png
osOS observé en plein dîner de philosophes
(interpreter, shell par défaut d'osOS)

Développeurs Paul Gannay
Dominique Lee

Cette page présente brièvement le système d'exploitation osOS, réalisé dans le cadre du projet système sur PC 2013 par Paul Gannay et Dominique Lee.

Fonctionnalités de osOS

osOS est un système d'exploitation multitâche préemptif gérant un mode utilisateur et la mémoire virtuelle.

Interface utilisateur

Shell

osOS se présente pour l'utilisateur final sous la forme d'un interpréteur de commandes du nom d'interpreter. Ce dernier propose des commandes built-in et permet le lancement de programmes utilisateurs. Ces programmes ne peuvent prendre qu'un seul paramètre, auquel peuvent être ajoutés la priorité du processus et la taille de sa pile utilisateur. On peut aussi lancer un processus en tâche de fond en plaçant un '&' à la fin d'une commande.

De plus, certaines commandes peuvent être lancées à tout moment (notamment lors de l'exécution d'autres processus afin de les observer) via le clavier :

  • F1 lance ps, qui affiche des informations sur les processus en cours d'exécution,
  • F2 lance mem, qui affiche la quantité de mémoire utilisée,
  • F3 lance qinfo, qui affiche des informations sur les files de message en cours d'utilisation,
  • F4, qui arrête tous les processus en cours d'exécution et relance interpreter.
Commande Description

help

Affiche l'aide.

exit

Quitte l'interpréteur de commande courant.

echo

Active ou désactive l'echo sur la console.

mem

Affiche des informations sur la memoire utilisée dans le kernel.

uptime

Affiche le temps depuis lequel le systeme est allumé.

qclean

Libère toutes les files de messages utilisées.

qinfo

Donne des informations sur les files de messages.

Programmes utilisateurs et appels systèmes

Le but premier d'osOS est de permettre le lancement de programmes utilisateurs et de leur fournir des accès au matériel sous la forme d'appels systèmes. Les programmes utilisateurs doivent se présenter sous la forme de programmes C classiques et doivent être compilés en même temps qu'osOS.

La bibliothèque d'appels systèmes (userlib.h) fournie correspond à la spécification demandée à laquelle on greffe getppid() qui permet de récupérer le pid du père du processus courant et printUsedMemory() qui permet d'afficher la quantité de mémoire utilisée. Ainsi, un programme interactif simple utilisera sans doute les primitives cons_read pour récupérer les saisies clavier et printf pour afficher des données à l'écran.

Un exemple de programme utilisateur présent par défaut est autotest, qui lance la base de tests fournie par l'équipe enseignante.

Gestion des processus

osOS étant multitâche préemptif, il est par conséquent capable de gérer plusieurs processus de manière simultanée. Pour cela, il utilise un ordonnanceur capable de gérer priorités et quotas de temps. Ces processus sont ordonnés par filiation et possèdent deux moyens de communication :

Files de messages
Une file de messages est accessible en écriture comme en lecture à l'aide de son identifiant numérique. L'implémentation utilisée permet de simuler des files de message de taille non bornée. L'utilisation des files de messages est de plus le seul moyen disponible pour synchroniser des processus.
Certaines limites importantes empêchent la seule utilisation des files de messages. Ainsi, n'importe qui peut facilement accéder à une file préalablement créée. De plus, les messages transmis ne peuvent être que des valeurs entières.
Partage de mémoire
L'utilisation de pages partagées permet de contourner ces problèmes. Elle permet en effet de partager tout type de données sur une page mémoire dont l'accès est protégé par la connaissance d'une chaîne de caractères. Les accès à la page mémoire se font alors par adresses relatives dans la page. Il n'y a par contre pas de moyen de synchronisation.

Il est ainsi fourni deux moyens de communications complémentaires qui permettent d'échanger des informations entre processus tout en assurant une certaine synchronisation. Il peut être intéressant pour l'utilisateur d'écrire un wrapper au-dessus des files de messages afin de simuler des sémaphores.

Mémoire virtuelle et mode utilisateur

De manière complètement transparente pour l'utilisateur, osOS gère la mémoire virtuelle et un mode utilisateur. Cela permet d'assurer un minimum de sécurité en séparant les programmes utilisateurs du noyau du système. Non seulement un processus utilisateur ne connaît pas son emplacement réel en mémoire, mais il ne peut pas non plus accéder au code et aux données du noyau. Tout accès direct au noyau d'un processus utilisateur étant arrêté par la gestion des privilèges, la bibliothèque userlib.h devient la seule interface d'accès au noyau depuis l'extérieur.

Téléchargement du noyau

Le noyau est téléchargeable et peut être exécuté selon les instructions de ce lien.

osOS n'a été testé que sous QEMU et sur clé USB.

Le projet

Présentation

L'équipe

Notre équipe est composée de deux étudiants en filière ISI:

Objectifs

Le projet système a pour objectif la réalisation d'un système d'exploitation minimaliste. Un cahier des charges minimal est fourni et présente les fonctionnalités de base à implémenter :

Interactivité utilisateur/matériel
  • Affichage à l'écran,
  • Lecture clavier.
Gestion des processus
  • Lancement et arrêt de programmes utilisateurs,
  • Ordonnancement préemptif avec gestion des priorités,
  • Communication inter-processus à l'aide de files de messages et de pages de mémoire partagée,
  • Mémoire virtuelle et mode utilisateur.
Shell
  • Lancement interactif des programmes utilisateurs,
  • Primitives affichant l'état courant du système d'exploitation.

Déroulement

Le projet système s'est déroulé du 21 mai 2013 au 23 mai, puis du 3 juin 2013 au 20 juin.

L'équipe enseignante fournit une feuille de route détaillant les différentes étapes permettant de construire un système d'exploitation minimal. Ce découpage en étapes nous a permis de planifier le projet :

  • du 21 mai au 23 mai : mise en place de l'affichage, de l'horloge et de la gestion des processus.
  • du 3 juin au 9 juin : files de message et début mémoire virtuelle.
  • du 10 juin au 17 juin : mémoire virtuelle, mode protégé, pilote clavier et interpréteur de commandes.
  • du 17 juin au 20 juin : préparation de la soutenance.

Apports et difficultés rencontrées

Apports

Difficultés

  • Pour certaines étapes, la documentation est particulièrement dense. Même si l'étape ne se révèle finalement que peu compliquée à réaliser, une connaissance fine de la documentation est souvent nécessaire afin de réaliser une implémentation propre et réellement fonctionnelle. La perte de temps liée aux tentatives d'implémentations de fonctionnalités alors que la documentation n'est pas maîtrisée a un impact très important sur la planification prévisionnelle.
  • Certaines étapes étaient suffisamment conséquentes pour permettre une division du travail en trois sous-parties plutôt qu'en deux. Travailler en trinôme aurait sans doute permis d'implémenter des extensions.
  • Un bug un peu vicieux nous a retardé quelques jours. Ne pas oublier de spécifier les unités des différents éléments potentiellement problématiques.
  • Le temps disponible : bien que nous avons pu terminer les fonctionnalités minimales dans le temps imparti, nous aurions apprécié d'avoir un peu plus de temps pour se pencher sur des extensions.

Références