Exercices directement relié aux articles de SOS:
article 1:
- bootsect.S: Récupérer la taille de la mémoire par balayage manuel ou par interrogation du BIOS.
- Une solution a été donnée par Christopher Goyet ici, dans la page Contributions.
- ctrl-alt-del: Pour plus de facilité, implémenter le reboot par ctrl-alt-del.
article 2:
- bottom-half: Implémenter un ou plusieurs types de bottom-halves dans le noyau SOS (BH,taskqueues,tasklets,softirqs,workqueues).
- APIC: Implémenter la gestion de APIC à la place des composants 8259A pour les intérruptions matérielles.
- MC146818,MSR (ou d'autres horloges matérielles): Utiliser ses horloges matérielles pour générer un interruption (à la place du i82C54).
article 3:
- Implémenter la gestion de la mémoire physique en zones priorisées (Voir noyau Linux).
article 4:
- extension PAE/PSE: Utiliser les extensions PAE et/ou PSE (adresse sur 36 bits, tables de traduction sur 3 niveaux, page de 2 ou 4 Mo).
article 5:
- type l'allocateur: Implémenter un allocateur non ségrégationniste ou mixte (actuellement ségrégationniste).
- kmem_slab.c: Voir les commentaires en tête de sos/kmem_slab.h
- Une solution a été donnée par Anthoine Bourgeois ici, dans la page Contributions (j'ai corrigé certaines choses par rapport à cette version, voir ici).
- main.c: Dans la démo, créer un cache dédié pour les chiffres. (voir page 10 de l'article 5).
article 6:
- sauvegarde de contexte: Changer la sauvegarde du contexte sur pile (cas SOS) par une sauvegarde ailleurs en mémoire, dans une structure spécialement allouée pour cela par exemple (cas Linux)
- sos_cpu_kstate_switch: Rendre le noyau préemptif en remplacent la fonction sos_cpu_kstate_switch par une interruption périodique pour réalisé le changement de contexte.
- demo, programme HELLOWORLD: Désallouer la pile du second contexte. (Voir page 12, section Démo)
- débordement de pile: Implémenter la détection de débordement de pile par page fault. (Actuellement Magic)
- en cours, par Cyril Dupuit voir ici
article 6.5:
- synchronisation: Ajouter de nouvelles primitives de synchronisation dans SOS. (Spinlock, condition, event)
article 7:
- load_elf_prog(): Completer le chargeur de programme ELF.
- Ecrire de nouveaux appels systèmes.
- Enrichir la bibliothèque C utilisateur.
article 7.5:
- Gérer l'extention de la pile utilisateur via un méchanisme similaire à MAP_GROWSDOWN (section 1.5.2).
- Gérer les régions virtuelles sous forme d'arbre et pas de liste (ou est le second endroit ou les arbres sont utiles comme l'a dit David dans ce message?).
- Ajouter le copy-on-write sur les tables des pages (PT) au niveau utilisateur (section 2.2.1).
- Utiliser les bits NX ou XD dans les tables de pages pour les accès en exécution.
- Ajouter les mécanismes de communication inter-processus.
article 8:
- Dans la structure sos_fs_nscache_node, gérer le parent comme un fils nommé ".." (cas Linux).
- Implémenter la fonction sos_fs_poll.
- Implémenter la fonction sos_fs_fcntl selon différent standard (POSIX, SVR4, Linux, ...).
- Ajouter une opération rename dans la structure sos_fs_opened_file (et son implémentation).
- Gérer les droits d'accès par l'utilisateur (notion d'uid/gid).
- Ajouter la mise à jour des dates d'accès/modification des fichiers.
- Ajouter les fichiers spéciaux de type FIFO au Socket Unix.
- Ajouter une bibliothèque de fonction générique pour faciliter l'implémentation de la signalisation asynchrone, le vérrouillage partiel ou total, la surveillance de modification ou d'utilisation de fichier (resp. drapeaux F_SETOWN, F_SETLK, F_GETLEASE et F_NOTIFY de 'fnctl').
- Ajouter une fonction de type 'flock'.
article 9:
- Ajouter la gestion des touches Control, Alt et AltGr??.
- Permettre de changer de keymap.
- Ajouter des keymaps à SOS (qwerty, dvorak, ...).
- Interpréter les séquences d'échappements ANSI.
- Gérer le multi-console.
- Gérer l'historique de la console.
article 9.5:
- Ajouter la notion de requête de lecture/écriture absente dans SOS.
- Implémenter un (ou plusieurs) ordonnanceur d'entrée-sortie pour les requêtes de lecture/écriture.
- Unifier le block cache et page cache de SOS (voir linux 2.4 et ).
- Implémenter le mécanisme du DMA pour les transferts entre la mémoire et les périphériques IDE.
- Implémenter entièrement la norme ATA (puis SATA).
patch-argv-env-9.5:
- uaccess.c: sos_usercpy(): Remplacer la copie de l'espace noyau vers le nouvel espace utilisateur par un remapping (Voir ce message pour plus d'infos).
Exercices en plus de ceux des articles:
- Portage de SOS sur une autre architecture, par exemple PowerPC?, ARM, MIPS ou AMD64. Il est possible d'utiliser l'émulateur Qemu pour réaliser le portage
- Portage de la uClibc, une bibliothèque C légère, afin de disposer sous SOS d'une bibliothèque standard C, et ainsi pouvoir compiler des applications complètes
- Thomas Petazzoni a déjà commencé le portage, des résultats ont été publiés sur la liste 1 2 3 4 5 6. Une documentation explique comment la tester, et le code source est disponible via un dépôt Subversion.
- Au niveau de la gestion de la mémoire virtuelle (kmem_vmm) mais peut-être ailleurs aussi, la gestion des régions est classées par adresses croissantes. Ce classement est réalisé par des listes. Une idée d'exercice serait l'utilisation d'arbres (gain en complexité O(log n) contre O(n)) (proposé par David Decotigny voir Evolution?)
- Rendre le noyau préemptif. (Actuellement non-préemptif 'big kernel lock')
- Porter le noyau sur Xen.
- Rendre le noyau multi-processeur (SMP). (Actuellement mono-processeur)
- Rendre le noyau modulaire. (Actuellement monolithique)
- Ajouter les signaux.
- Ajouter le reverse mapping.
- Ajouter la gestion des bibliothèques partagées.
- Conformer à POSIX (ou autre, à voir).
- Ajouter la détection du processeur avec l'instruction CPUID.