[Kos-dev] Deux visions differentes de Babel

d2 kos-dev@enix.org
19 Feb 2002 10:19:30 +0100


Bonjour,

Juste une petite chose. D'abord sur l'"elegance" relative des 2
approches. Pour moi, l'approche elegante, la vraie, celle qui est
generale, est bien celle qui consiste a dire que le noyau utilise
Babel, parce que c'est generique et tout : le noyau ne maintient pas
d'interfaces propres pour disk/part et net. Par contre, ce qui me
deplait la-dedans est que le noyau est beaucoup eloigne des entites
bas-niveau qui lui sont tres tres tres tres intimes (pour moi c'est
surtout swap qui est intime, et peut-etre net aussi pour des histoires
de perfs) : y'a Babel entre les 2.

Le cheminement des 2 approches est le suivant :
 + Approche 1/ "Noyau utilise Babel"
     cpl0 : noyau   -> (babel -> objet babel)
     cpl3 : syscall -> (babel -> objet babel)
 + Approche 2/ "Noyau utilise directement ses propres interfaces"
     cpl0 : noyau   -> interface (noyau)  de periph
         ---> 2 (voire 3, cf fin) types seulement de periphs que le
              noyau doit connaitre, avec une interface fixe :
              disk_service et net, ou disk_service rassemble la liste
              des disques et des partitions enregistres a l'init des
              modules ide/scsi/... Et encore, l'important dans
              l'histoire c'est plutot seulement les partitions (les
              disques, le noyau il s'en fout pour son usage intime :
              il n'a besoin de connaitre que les partitions ou il peut
              swapper).
         p.ex : Si on veut pouvoir swapper sur une carte son, ou
         balancer des trames ip sur une carte son, il suffit que le
         driver carte son enregistre un objet partition dans
         disk_service (resp. net).
     cpl3 : 

         Pour /dev/disk ou /dev/part et net :
             syscall -> (babel -> wrapper babel periph noyau)
         Pour le reste :
             syscall -> (babel -> objet babel enregistre par un driver
                         et inconnu du noyau)

   Dans cette approche 2/, si on veut que le noyau swappe sur un truc
   qui ne s'est pas a priori enregistre comme etant (par exemple) une
   partition noyau par son driver de base (mettons : carte tuner TV),
   il suffit que j'enregistre une partition babel_partition qui est un
   wrapper vers babel, et que je fasse en sorte que ce babel_partition
   s'occupe d'appeler le babel de tuner TV afin d'emuler l'interface
   partition du noyau.

Pour resumer, l'approche 2/ est moins "elegante", mais a l'avantage de
maintenir ce qui doit etre intime au noyau, le plus proche possible du
noyau, en evitant les pb de synchro, les lookup, ... le plus
possible. Et peut-etre aussi un pb d'oeuf et de poule qd la memoire
est limite (pas sur). Evidemment, il faut creer un babel pour
disk_service pour que l'utilisateur cpl3 puisse jouer avec des
partitions. Mais c'est pas vraiment une dupplication de code (vu qu'on
ne reecrit pas les drivers disque). Et puis d'autre part, ca n'empeche
pas que le noyau peut quand meme utiliser des trucs exotiques babel
(carte tuner TV par exemple) pour swapper des trucs dessus ou faire du
reseau (moyennant le codage d'un wrapper noyau -> l'objet babel).

Revoir quand meme la liste des trucs qui sont "intimes" au noyau. Je
pense a partition (ou disques, je sais pas[1]) et a net, mais je pense
qu'il y a aussi console. Le reste (son, video, serial, ...), je pense
pas que ce soit critique si le noyau est oblige de passer par Babel
pour que le noyau puisse swapper/faire du reseau dessus.

Voila pour quelques precisions.

Bonne journee,

Notes :
  [1] A mon avis, "disque" et "partition" sont suffisamment proches
      pour qu'ils aient la meme interface (memes methodes), avec juste
      une methode qui indique si l'objet est de type disque, ou
      partition (+ le type de partition). Mais pas sur que le noyau
      ait vraiment besoin de savoir gerer des disques pour son usage
      personnel (swap). Si un disque n'est pas partitionne, on ne
      declare alors qu'une seule partition sur le disque.

-- 
d2