./10> c'est pas une question d'implémentation, mais de concept. L'exemple de Moumou n'est qu'un cas particulier de l'expression d'un concept très puissant, qui fait l'originalité du Hurd.
Pour faire court : le Hurd ne connait pas la notion de "point de montage". Pour le hurd, le système de "fichiers" n'est pas un système de fichiers, c'est un référentiel de nommage. A chaque nom est associé un ou plusieurs programmes, de sorte que lorsqu'une référence est demandée sur ce nom, le programme correspondant est instancié (si tu connais CORBA, le mécanisme s'approche plus ou moins, en remplaçant le système de nommage complexe par un simple chemin dans une arbo).
Certains programmes simulent un point de montage, par exemple le programme ext3fs, qui lorsqu'il est invoqué montre une arborescence d'objets correspondant aux fichiers sur le disque. Celui montré par moumou en est un autre, qui l'orsqu'il est invoqué montre une arborescence ftp (de plus sa fonction "entrée dans un groupe", invoquée par la commande cd, le conduit à créer automatiquement le groupe correspondant, par exemple ftp.free.fr).
Ces exemples sont les moins intéressants, dans le sens où ils sont assez proches des utilisations habituelles.
Un autre exemple intéressant : lorsqu'une application crashe, le système ouvre un point dans le référentiel de nommage. Ceci provoque l'instanciation d'un programme de gestion du crash. A partir de là, ça veut dire que par une simple commande ln -s tu peux modifier le programme instancié. Par exemple, pour mettre un programme qui génère un core dump, ou pour mettre un programme qui lance un débuggeur, oui qui envoie un mail, ou que sais-je encore.
Tout est dans le référentiel de nommage, y compris des trucs comme le scheduler, le gestionnaire de mémoire, les mécanismes d'authentification...
Côté implémentation, le Hurd est composé d'un noyau minimal, architecture à passage de messages. Il n'y a rien qui tourne en kernel space comme tu disais, justement. Comme je viens de le décrire, tout est dans le référentiel de nommage, et le scheduler est un programme ordinaire, au même titre que la commande ls, un driver de carte réseau ou firefox. (note : le référentiel de nommage lui même est un programme, qui peut être changé). Les programmes qui ont besoin de parler entre eux le font via une API RPC. Par exemple : un pilote de disque dur exporte un certain nombre d'appels RPC pour pouvoir être reconnu comme tel par un programme de gestion de système de fichier. Le pilote utilise lui-même un certain nombre de RPC pour demander des choses au programme qui gère les canaux DMA (qu'il localise via le référentiel de nommage), à celui qui gère les interruptions (qu'il localise...bah je refais pas le topo)...
Côté sécurité pour le lancement de ces programmes ? Ben facile : chmod. Un utilisateur peut lancer son propre programme driver de carte réseau, qui s'exécutera avec ses permissions (l'utilisateur doit avoir la permission d'accéder à la carte). Etant un programme indépendant, il ne perturbera pas les autres utilisateurs, et en cas de crash, ben c'est un crash d'application normale (qui peut même invoquer un débuggueur ordinaire, voir un peu plus haut)
Et le modèle de sécurité utilisé ? Ben ai-je vraiment besoin de faire un dessin ? Le programmes ne communiquent entre eux que via RPC. Par défaut, un programme bénéficie des jetons de permission de celui qui l'a exécuté. Tout programme peut détruire ses jetons à tout moment. A l'inverse, il y a un programme spécial et un seul capable de créer des jetons de permission; il fait 2 pages de code et est donc facilement vérifiable.
Ainsi voilà comment un serveur SSH sous Hurd travaillerait (travaille?) :
1) il est lancé et hérite les jetons de permission de son père
2) il ouvre son port (il faut que les jetons hérités contiennent ce privilège)
3) il détruit la totalité de ses jetons
=> là il ne peut plus faire le moindre appel RPC (il se mangera des permissions refusées, même pour des trucs comme allouer de la mémoire)
4) lorsqu'une connexion arrive, aucun risque d'un exploit : même si qqn trouve une faille et injecte du code, le code ne peut strictement rien faire
5) le serveur fait alors un appel RPC au programme spécial (c'est le seul appel RPC ne demandant pas de jeton), en lui passant les login/pass fournis par l'utilisateur.
6) le programme spécial vérifie le mot de passe, et accord ou non les jetons d'identification correspondants aux droits de l'utilisateur
Tu remarques que :
1) tant que personne ne s'est identifié, le serveur a 0 droit
2) une fois loggé il a les droits de l'utilisateur loggé
3) il ne fait pas l'identification lui même, mais délègue au programme dédié à cette fonction
Quel que soit le bug qu'il peut y avoir dans le serveur, à aucun moment le système ne peut être compromis, puisque "l'exploit" tournera avec les permissions de l'utilisateur qui le lance (=aucune s'il n'est pas loggé)
Et on combine ça avec le référentiel de nommage. Bah oué, le programme qui crée le jetons est dans le référentiel de nommage. Mais alors, il se passe quoi si un utilisateur en lance une copie ? Facile : la copie fonctionne à merveille, créant des jetons comme le modèle normal. Sauf que la copie tourne avec les jetons de l'utilisateur qui l'a lancé, et ne peut donc donner que ces jetons là.
Autrement dit : un utilisateur peut lancer un serveur ssh sous son nom. Le serveur sera en mesure de le logger, mais pas de logger un autre utilisateur.
A travers ces quelques exemples, on voit la modularité et la sécurité dégagées par les concepts du système. Ca redéfinit complètement la façon d'aborder un système d'exploitation, ses fonctionnalités (redéfinissables à la volée), sa sécurité (jamais plus de jetons que nécessaire), sa stabilité (tu connais bcp de systèmes capables de relancer le scheduler s'il plante?).
Le seul revers important, c'est que le passage de message et l'authentification entre drivers a un coût significatif en temps de calcul. Je sais pas où ça en est actuellement, la dernière fois que j'ai regardé ils avaient trouvé une solution et commençaient à l'implémenter.