Linux/Unix : Introduction au C système

15 septembre 2013 rdorigny 0 commentaires

Linux devient désormais incontournable dans le monde informatique, il suffit de voir le sucés d'Android dernièrement ou du monde embarqué bien aidé par le raspberry pi. Aussi il apparaît intéressant de voir (simplement) comment on peut coder des applications sous Linux.

Le langage du monde de programmation Unix est basé sur un code C adapté au système même si d'autre sont apparus après (python, cute, ...). Nous allons donc voir comment réaliser simplement des scripts systèmes en C.



1) Le premier programme

Le compilateur que l'on retrouve sous Linux quasi-systématiquement est gcc ( GNU Compiler Collection) qui remplace le compilateur cc désormais . Il présente quelques options à connaitre :
  • -o : permet de préciser le nom du binaire, à défaut a.out
  • -lxxx : permet de préciser la librairie xxx à ajouter

  • gcc possède sont propre outil de débogage gdb, nous l'étudierons plus tard. La commande pour compiler un fichier sera gcc -o my_prog my_prog.c

    Donc pour coder l'inévitable programme Hello world!
    #include <stdio.h> #include <stdlib.h> int main(){ printf("Hello world!n"); exit(0); }


    Reste à tester notre programme. Pour ceux, qui ne dispose pas d'un poste linux ou qui comme moi travaille sous Windows par habitude, il y a l'incontournable émulateur linux Cygwin. Il s'installe comme un logiciel sous Windows, il suffira simplement lors du setup d'installation d'ajouter gcc qui est sous la catégorie devel ainsi que gdb.

    2) Gestion de la mémoire

    2.1) Généralités

    Nous allons survoler la gestion de la mémoire sous Linux car il s'agit d'un mécanisme trés complexe qui nécessite bien plus que quelques lignes. Mais il est nécessaire pour la suite de voir globalement comment cela fonctionne.

    Avec Linux, la mémoire est divisée en deux zones:
  • Espace utilisateur: utilisé par l'usager généralement fixé à 3Go de 0 à 0xC0000000
  • Espace noyau: utilisé par le système d'une taille d'un Go de 0xC0000000 à 0xFFFFFFFF

  • En gros, le noyau alloue à chaque processus un espace mémoire qui lui est propre, on l'appelle la mémoire virtuelle (car elle n'est pas vraiment ce qui existe en réalité). Il existe un mécanisme qui alloue cette mémoire avec un gestionnaire dénommé MMU (memory management unit, qui correspond à la puce qui fait ce travail) et réalise la correspondance entre la mémoire physique et la mémoire virtuelle. Ce mécanisme permet de gérer plus de mémoire qu'il n'en existe mais nécessite des processus complexes pour dissocier les mémoires entre les processus. Vous trouverez une documentation très complète sur ce sujet via wikipedia et ici.

    La mémoire virtuelle d'un processus est constituée par une zone mémoire pour:
  • le code, juste en lecture,
  • les données statiques, en lecture/écriture,
  • la pile (stack), utilisé pour les types de bases et le travail des fonctions,
  • le tas (heap), pour les allocations dynamiques, utilisé pour travailler avec des objets.


  • 2.2) Les fonctions d'allocations de mémoire

    Les fonctions disponibles sont:
  • calloc() et malloc(): allouent de l'espace mémoire et retournent un pointeur sur l'espace alloué,
  • free(void *ptr): libère la zone pointée par ptr,
  • memset(void *str, intc, size_t n): initialise la zone mémoire par la zone pointée sur s.

  • Par exemple la commande s = (char *) malloc(10 * sizeof(char)); réserve un string de 10 caractères en mémoire.
    Un exemple d'utilisation de l’allocation mémoire:
    #include <stdio.h> #include <stdlib.h> int main() { char * s; // une variable de type pointeur sur caractères int i; s = (char *) malloc(6 * sizeof(char)); *s='a'; *(s+1)='z'; *(s+2)='e'; *(s+3)='r'; *(s+4)='t'; *(s+5)='y'; printf("%s",s); exit(0); }

    Ce qui affichera azerty.

    Conclusion

    Nous avons vu comment faire un programme sous Linux en C Système et quelques notions sur l'utilisation de la mémoire par le système. Dans les chapitres suivants, nous étudierons les différents mécanismes utilisés dans le monde Unix comme la gestion des processus, thread, ...






    Pseudonyme (obligatoire) :
    Adresse mail (obligatoire) :
    Site web :




    © 2024 www.doritique.fr par Robert DORIGNY