[SOS] Discussion

David Decotigny david.decotigny at free.fr
Ven 17 Déc 14:53:55 CET 2004


Bonjour tout le monde,

Désolé pour le delai, j'ai plein de bonnes et de mauvaises raisons pour 
me/m'in-justifier.

Cyril Dupuit wrote:
> D2, dans ton dernier mail, tu me proposais t'intégrer le traceur 
> d'événements dans SOS, sous la forme d'un patch. Je ne suis pas contre, 
> loin de là.

Ca c'est formidable ! Apres mon mail un peu "speed" la semaine derniere, 
j'avais craint d'avoir découragé tout le monde.

> Mais j'aimerai avoir une copie de vos conventions afin de ne pas 
> chambouler l'esprit du projet SOS.

Il n'y a pas encore de "coding standards" SOS officiels. Juste des 
habitudes de codage et quelques conventions :
  - noms de variables, fonctions, etc. non differenciés selon leur type
    (p.ex pas de trucs genre dw_toto pour signifier que toto est un
    32bits). C'est pas recommandable pour les gros projets, mais pour les
    petits projets comme SOS ça adhère au principe de la flemme maximale
  - les noms ne sont pas du style Java (void TotoEstBeau()) mais sont
    uniformement en majuscules (macros) ou minuscules (le reste)
    eventuellement separes par des '_' (void toto_est_beau())
  - les noms visibles depuis l'exterieur a un module doivent avoir un
    prefixe sos_ (variables, fonctions) ou SOS_ (macros). Tout le reste
    peut s'ecrire n'importe comment a condition que ce soit du "static"
    (visibilite interne au fichier)
  - eviter les typedef sauf pour certains trucs pratiques : sos_ui32_t et
    cie. En particulier pas de typedef pour les struct
  - accolades de blocs dans les fonctions, de if, etc... en debut de
    ligne, genre
       if (toto == est_beau)
       {
          ...
       }
       else
       ...
  - (en bonus) on essaye d'utiliser les extensions gcc qui permettent de
    preciser les specs (__attribute__ ((noreturn)), __attribute__
    ((format(...))), __label__ toto, init de  structure (struct machin){
    .le_champ=12; .le_reste=145};, ...). Voir les pages infos de gcc. Ce
    n'est qu'un bonus, pas une obligation !

Et si tu nous fais parvenir du code pour SOS, on s'adaptera a ton style 
et/ou on reprendra le code pour qu'il cadre a peu pres avec le reste. 
Faut pas exagerer, le nombre de contributions a SOS est encore modeste 
(0), donc on peut mettre nos sales doigts dessus pour qu'elles soient 
dans l'"esprit" SOS.

> Ensuite, le traceur d'événements que j'ai codé s'intègre dans les appels 
> système du noyau et ne peuvent donc pas prendre la forme d'un patch. 
> Sinon, il faudrait patcher tous les fichiers du noyau, ou presque.
> Je réfléchi en ce moment à une solution permettant d'obtenir le 
> fonctionnement de ptrace que je ne connaissais pas.
> Pour cela, il faut que j'utilise les signaux !

En attendant d'avoir des appels systeme, le tracage peut etre utiliser 
pour tracer les appels de certaines fonctions. Pour info, dans notre 
version de SOS on utilise un mecanisme de tracage tout basique vers 
bochs (port 0xe9), relativement transparent. Ca permet de tracer les 
entrees et sorties de fonctions (imbrications) tres simplement :

------------- dans un .h ------------------
extern void _trc_print_exit(void *s);
#define _TRACE() \
   char * toto __attribute(( cleanup(_trc_print_exit) )) = 
__PRETTY_FUNCTION__;\
   sos_bochs_printf("<ENTER(%s)>\n",  __PRETTY_FUNCTION__)
-------------------------------------------

------------- dans un .c ------------------
void _trc_print_exit(void *s)
{ sos_bochs_printf("</EXIT(%s)>\n", *(char**)s); }
-------------------------------------------

Modif de n'importe quelle fonction a tracer :
   int the_function(int toto)
   {
      int est_beau = toto;
      TRACE(); // <----------- Permet de tracer le debut+la fin de la fct

      if (toto == 42)
        return est_beau * toto;
      est_beau ++;
      return toto + est_beau;
   }


Le __attribute(( cleanup(...) )) n'est peut-etre pas valable pour toutes 
les versions de gcc.

> Je suis en train d'étudier le principe de fonctionnement des signaux 
> afin de les intégrer dans mon noyau. Mais, les signaux peuvent être 
> remplacés par d'autres choses :
> - des appels système (SIGCONT, SIGSTOP).
> - des files de messages (gestion du clavier). Etc...

J'aurais du m'abstenir de parler de ptrace. Ca viendra plus tard, si ça 
vient. C'est un peu l'artillerie lourde, mais elegante, pour tracer ce 
qui se passe au niveau de dialogue OS/user. Il n'y a pas besoin de ca 
pour tracer le dialogue. On peut se contenter par exemple de tracer les 
appels systeme dans la routine de traitement des appels systeme.

Comme il n'y a pas encore de syscalls (parce qu'il n'y a pas encore de 
notion d'espace "utilisateur"), on peut se contenter pour l'instant de 
tracer les entrees/sorties de certaines fonctions.

> Pourriez-vous me donner des arguments en faveur des signaux, parce que 
> pour l'instant, je n'en vois pas l'intérêt ?

Oublie pour l'instant.

> Cyril, un développeur qui vous veut du bien.

-- 
d2, voyagiste


Plus d'informations sur la liste de diffusion Sos