ESME - Linux et programmation system - A.TALBI Logiciels libres La notion de logiciel libre est décrite pour la première fois dans la première moitié des années 1980 par Richard Stallman qui l'a ensuite – avec d'autres formalisée et popularisée avec le projet GNU et la Free Software Foundation (FSF): Premièrement: la liberté de copier un programme et de le redistribuer à vos voisins, qu'ils puissent ainsi l'utiliser aussi bien que vous. Deuxièmement: la liberté de modifier un programme, que vous puissiez le contrôler plutôt qu'il vous contrôle ; pour cela, le code doit vous être accessible Projet GNU lancé en 1983 par Richard Stallman : Développer un système d'exploitation libre à base de briques logiciels libres Objectif "partiellement" atteint en 1992 avec la publication de la dernière brique manquante à savoir le noyau. Ce noyau était la première version de linux (créé par Linus Torvalds) Exemples de logiciel GNU/libres: Le noyau linux GNU Bash: inteprêteur de commande UNIX (terminal) Coreutils: regroupe toutes les commandes (programmes) de base: cp, cd, ls, mv, rm, chmod… GNU Make: outil d'automatisation de la compilation de projets GNU GCC: compilateur C/C++… Glibc: libc (librarie du langage C) GNOME KDE: environnement graphique de bureau Emacs , VI/VIM: éditeur de text Firefox: navigateur web Protection de logiciels libres en général par une licence publique (ex GPL: GNU General Public License) pour faire en sorte que personne ne puisse s'attribuer des droit exclusifs sur un logiciel libre (même après l'avoir modifier…) ESME - Linux et programmation system - A.TALBI
ESME - Linux et programmation system - A.TALBI Distribution linux Une distribution Linux, appelée aussi distribution GNU/Linux pour faire référence aux logiciels du projet GNU, est un ensemble cohérent de logiciels, la plupart étant des logiciels libres, assemblés autour du noyau Linux. Il existe une très grande variété de distributions, ayant chacune des objectifs et une philosophie particulière. Les éléments différenciant principalement les distributions sont : la convivialité (facilité de mise en œuvre), l'intégration (taille du parc de logiciels validés distribués), la notoriété (communauté informative pour résoudre les problèmes), l'environnement de bureau (GNOME, KDE…), le type de paquet utilisé pour distribuer un logiciel (principalement deb et RPM) et le mainteneur de la distribution (généralement une entreprise ou une communauté). Le point commun est le noyau (kernel) et un certain nombre de commandes. ESME - Linux et programmation system - A.TALBI
Architecture d’un système linux classique La couche matérielle: C’est la couche physique, elle est constitué du processeur ainsi que des différents contrôleurs de périphériques Le noyau linux: C’est une des parties fondamentales d’un systèmes d’exploitation. Il gère les ressources de l’ordinateur et permet aux différents composants — matériels et logiciels — de communiquer entre eux Le serveur X: C’est un environnement graphique de type « fenêtré » qui gère l'interaction homme-machine par l'écran, la souris et le clavier. Il est souvent appelé X Window. C'est le système standard ouvert d'interaction graphique avec les programmes graphiques utilisateur sur les UNIX (Linux, BSD, etc.). On dit communément d'une application qu'elle tourne sous X lorsqu'elle est conçue pour l'environnement X. Applications X: Ce sont toutes les applications en mode graphiques (navigateurs, jeux, éditeurs…) Shell: C’est un programme qui permet de lancer d’autres programmes en ligne de commande (sans passer par une application graphique genre l’explorateur de fichiers) Linux est le nom du noyau et par abus de langage il désigne aussi le système d’exploitation Shell ESME - Linux et programmation system - A.TALBI
Architecture du noyau linux Le Hardware: Comme vu précédemment, le hardware (matériel ou couche physique) est constitué du processeur, de la RAM ainsi que des contrôleurs des autres périphériques. Tous les modules qui suivent sont les parties logicielles du noyau, chacune d’elle est responsable d’une certaine fonctionnalité ou service offert aux applications Le scheduler (ordonnanceur): Ce module est responsable du partage du processeur (des cœurs) entre les différentes taches des différents processus Le process management: Ce module est responsable de la création (chargement exécution) et de la destruction des processus ainsi que de leur taches Le memory manager: Ce module est responsable du partage de la mémoire entre les applications. Il cache les détails de la mémoire physique et offre à chaque application (processus) une mémoire virtuelle dans laquelle il peut s’exécuter en utilisant les mêmes adresses (virtuelles) que les autres processus. ESME - Linux et programmation system - A.TALBI
Architecture du noyau linux Block devices: Ce modules est responsable de la gestion des devices de type block (ex: disques dures), il implémente un cache (logicielle) pour accélérer les accès disques en reposant sur les notions de localité spatiales et temporelles (un peu pareil que le cache des microprocesseurs sauf que c’est fait d’une manière logicielle) Character devices: Ce modules gère les devices de types caractère (ex: port série, terminal série…) Network drivers: Ce module contient les drivers pour accéder à la carte réseau Network protocol: Ce module implémente les différents protocoles réseau (TCP/UDP/IP, HTTP, FTP…) File system: Ce module permet de faire abstraction des différents types de devices. Il offre une vue en fichier (système de fichier accessible avec l’explorateur) de tous les devices. Un ou plusieurs fichiers sont associé à un device. Ces fichiers pourront être utilisés par une application pour réaliser des I/O (entrées/sorties) sur le device. ESME - Linux et programmation system - A.TALBI
Architecture du noyau linux System Calls (Appels System): Les system calls (appels system) sont les fonctions par lesquelles les applications demande un service au noyau. Ce mécanisme assure la protection l’intégrité du noyau en s’assurant qu’une application ne puisse jamais corrompre des données dans le noyau. Il utilisent la notion d’interruption logicielle. Drivers (Pilotes): Sous linux un device driver (pilote de périphérique) est le module logicielle qui dialogue directement avec le matérielle qu’il gère. ESME - Linux et programmation system - A.TALBI
Application utilisateur Architecture du noyau linux: les drivers Application utilisateur read file write file ioctl Les drivers ainsi que les différents gestionnaires d’interfaces sous linux offrent une vue en fichier et homogène de tous le matériel. Ceci facilite grandement la programmation au niveau utilisateur, car ce dernier se concentre seulement sur son algorithme sans se soucier des détails du matériel/interface à utiliser. Ainsi l’utilisateur pourra faire tourner le même programme sur différentes interfaces sans beaucoup de peine (en général il suffit de changer le nom du fichier désignant le port souhaité). Les drivers sont développés par les fabricants des devices (et de leurs contrôleurs matériels) ou par des développeurs qui ont une connaissance de ce contrôleur. L’étude et la maitrise de certains aspects du noyau linux est indispensable afin de réaliser un bon driver. Noyau (Kernel) Appel system (System calls) Gestionnaire de fichiers read Write ioctl Gestionnaire d’Interface de type Caractère: read Write ioctl Gestionnaire d’Interface de type block: read Write ioctl Gestionnaire d’Interface de type net: read Write ioctl Driver port série read_char write_char ioctl Driver I2C read_char write_char ioctl Driver hard disk write_block read_block ioctl Driver lecteur CD write_block read_block ioctl Driver USB read_block write_block ioctl Driver carte réseau send_frame receive_frame ioctl Matérielle Port série Port i2c Disque dur Lecteur CD Adaptateur réseau sur USB Carte réseau ESME - Linux et programmation system - A.TALBI
Architecture du noyau linux: les appels system Ex: l'appel system read (lecture depuis un fichier/port) espace utilisateur espace kernel (noyau) Microprocesseur en mode utilisateur Microprocesseur en mode superviseur Programme utilisateur Bibliothèque libc Vecteur des appels system Main () { /* identifient du fichier ou du port à lire*/ int fd; /* tableau de stockage des données à lire */ char *buf[100]; /* nombre d'octets à lire */ int size = 100 ; …. ret = read(fd, buf, size) ; } 2 1 Gestionnaire d’interruptions INT 0x80 : system_call { - récupération du numéro de l'appel system ainsi que ces paramètres - récupération de l'adresse de la routine (fonction) de traitement de l'appel system read depuis le vecteur - exécution de l'appel system ; - retour à l'espace utilisateur } 1 @ Appel Sys 1 2 @ Appel Sys 2 …. n @ Appel sys_read … read(fd, buf, size) { - stockage des param fd, buf, size à un endroit précis - stockage du numéro de l'appel system read - Levé de l'interruption logicielle INT 0x80 - code retour de l'appel System } 3 sys_read(fd, buf, size) { Appel de le fonction read du driver qui contrôle le périphérique sur lequel se trouve le fichier/port à lire } 4 5 7 6 Intérêt de l'utilisation des appels system: Empêcher un programme utilisateur contre l'accès direct aux données du noyau (protection contre la corruption des données du noyau et des autres programmes), contre l'accès direct au matériel (manipulation des registres des contrôleurs) et contre l'exécution de certaines instructions/fonctions sensibles (ex: le masquage/démasquage des interruptions ne peut se faire que si le microprocesseur est en mode superviseur) tout ceci a pour but de rendre le système stable est sécurisé ESME - Linux et programmation system - A.TALBI