Vous êtes sur la page 1sur 30

Cours de systme

Qu'est-ce qu'un systme d'exploitation ?


Introduction Linux
Sbastien Paumier

paumier@univ-mlv.fr

Illustrations provenant du site http://tux.crystalxp.net/

Objectifs du cours

savoir ce qu'est un systme d'exploitation


(OS)
connatre les grandes questions se
poser pour en concevoir un
connatre le modle de Linux
savoir programmer des applications
systme

paumier@univ-mlv.fr

Ressources

"Systmes d'exploitation", d'Andrew


Tanenbaum
poly du cours de systme de D. Revuz:

http://igm.univ-mlv.fr/~dr

exemples du cours et code du premier


noyau:

http://igm.univ-mlv.fr/~paumier/systeme/

paumier@univ-mlv.fr

Qu'est-ce qu'un OS ?

interface entre les applications et le


matriel physique
utilisateurs
applications
systme
matriel

paumier@univ-mlv.fr

Missions

permettre d'accder au matriel de faon


transparente

un programme n'a pas savoir s'il crit


sur un disque ext3 ou une cl USB fat32

grer les ressources (accs physiques,


mmoire, CPU)

optimiser l'usage de la machine (taux


d'occupation du CPU, minimisation des
mouvements des ttes de lecture des
disques, minimiser le swap, gestion de
l'nergie sur les systmes portables, etc)

paumier@univ-mlv.fr

Missions

veiller la scurit des applications et


des donnes
fournir une qualit de service

viter les famines, garantir un accs


prioritaire root, temps de rponse sur
un OS temps rel, etc

tre robuste

viter de planter !

tolrance l'erreur (blocs disques


dfectueux, reboot sauvage, etc)

paumier@univ-mlv.fr

Les types de systme

mono vs multi-utilisateurs

mono vs multi-tches

un OS de tlphone peut tre monoutilisateur


DOS tait monotche

mono vs multi-processeurs
temps rel: garantit un dlai maximal
d'excution quelles que soient les
conditions

paumier@univ-mlv.fr

Le multi-utilisateurs

suppose de pouvoir protger les donnes


de chacun sur les supports de stockage

ncessite la notion de droits d'accs

protge les utilisateurs entre eux

protge le systme:

impossible de dtruire le systme en


supprimant par accident une DLL :)

paumier@univ-mlv.fr

Le multi-tches

suppose de pouvoir protger les


processus les uns des autres
ncessite la notion de protection de la
mmoire
rendu possible par le mode protg et la
mmoire virtuelle pagine

seul le noyau peut accder tout

les processus ne peuvent physiquement


pas sortir de leurs pages mmoire

paumier@univ-mlv.fr

Le noyau

espace mmoire protg+ensemble de


programmes qui forment la base
minimale de l'OS
tout ce qui n'est pas un appel systme
fonctionnera dans l'espace utilisateur
exemple de choix de conception:
l'interface graphique

dans le systme sous Windows

programme utilisateur (serveur X) sous


Linux

paumier@univ-mlv.fr

10

Types de noyau

monolithique: tout est dans le noyau


(systme de fichiers, pilotes, etc)

Linux, FreeBSD

micro-noyau: seulement le strict


minimum (ordonnanceur+mmoire
virtuelle)

Minix, Mac OS X

hybride (Windows NT)

exo-noyau: rien n'est protg

paumier@univ-mlv.fr

11

Pourquoi tudier Linux ?

logiciel libre (ouvert et gratuit)


trs portable (PC, MacBook,
smartphones, Xbox, etc)
interface simple et lgante (les appels
systmes)
met en uvre beaucoup de notions
intressantes: processus, droits d'accs,
mmoire virtuelle, journalisation, temps
rel, modules dynamiques, etc
formidable mutualisation d'expertise

paumier@univ-mlv.fr

12

Un peu d'histoire

1969: UNIX (Thompson et Ritchie)

1987: Minix (Tanenbaum)

1991: premier noyau Linux (Torvalds)

1994: v1.0 qui donne le premier systme


GNU/Linux
depuis, de nombreuses distributions:

Debian, Ubuntu, Fedora, SuSE, Red Hat,


Mandriva, Slackware, ArchLinux,
Gentoo, etc

paumier@univ-mlv.fr

13

Architecture

noyau monolithique qui gre le matriel,


la mmoire, l'ordonnancement des tches
sparation en couches (noyau, libs,
applications)
sparation en deux espaces distincts:

espace utilisateur (user land)

espace noyau (kernel land)

base sur un contrle matriel: le mode


protg du processeur

paumier@univ-mlv.fr

14

Un modle en couches

la portabilit est assure par les couches


basses
possible grce un langage puissant
invent pour crire UNIX: le C
un binaire n'est pas portable, mais il
suffit de recompiler une application pour
la porter sur un OS compatible
pas besoin de toucher au code!
concept anctre de l'ide de machine
virtuelle

paumier@univ-mlv.fr

15

Un modle en couches

du trs bon gnie logiciel, car on a des


interfaces propres qui permettent de
faire abstraction des couches plus basses
polymorphisme qui facilite la portabilit
et l'extensibilit:

pour un nouveau processeur, il suffit de


changer les codes assembleur bas
niveau

pour un nouveau systme de fichier, il


suffit d'implmenter les variantes de
read, write, open...
fs/

paumier@univ-mlv.fr

16

Un modle en couches

on obtient des codes plus srs, car pour


court-circuiter une couche, il faudrait la
matriser parfaitement
exemple de bug d un mlange entre la
couche systme et la libc:
int main(int argc,char* argv[]) {
if (argc!=2) return 1;
int fd=open(argv[1],O_CREAT|O_TRUNC|O_WRONLY,0700);
FILE* f=fdopen(fd,"w");
close(fd);
fprintf(f,"Oooops\n");
bug_FILE.cpp
fclose(f);
return 0;
}

paumier@univ-mlv.fr

17

Modes rel et protg

mode rel (par dfaut au boot):

on peut excuter n'importe quelle


instruction

accs total la mmoire physique

mode protg bas sur un contrle


matriel (utilis dans les OS modernes):

protection de la mmoire, ce qui permet


la mmoire virtuelle et la pagination

commutation de contexte

4 niveaux de privilges

paumier@univ-mlv.fr

boot/boot.s
18

Protection de la mmoire

ide: interdire un programme


d'accder de la mmoire qui ne lui
appartient pas, s'il n'a pas le bon niveau
de privilge
en mode protg, tous les accs mmoire
sont contrls par le processeur par
rapport une zone autorise
en cas de violation, Linux tue le
programme fautif avec un signal
SIGSEGV: segmentation fault kernel/traps.c

paumier@univ-mlv.fr

19

Commutation de contexte

changement de contexte:

sauver l'tat du processus courant


(valeurs des registres)

restaurer l'tat d'un autre processus P

reprendre l'excution de P o elle s'tait


arrte

permet de donner l'illusion du multitches


opration critique si trop lente ou trop
kernel/sched.c
frquente
include/linux/sched.h

paumier@univ-mlv.fr

20

Bascule noyau/utilisateur

quand un processus utilisateur doit


accder au systme physique, pour des
raisons de protection, il doit demander
au noyau de le faire pour lui
d'o l'obligation de changer de contexte
en copiant des choses entre user land et
kernel land
trs coteux, donc on prfre bufferiser
autant que possible
exemple: copie d'un fichier

paumier@univ-mlv.fr

21

Bascule noyau/utilisateur

version basique, utilisant la bufferisation


par dfaut de la libc:
int main(int argc,char* argv[]) {
int c;
while ((c=fgetc(stdin))!=EOF) {
fputc(c,stdout);
}
return 0;
}

$>mangcc|time./io_buf>err
0.01user0.00system0:00.57elapsed2%CPU(0avgtext+0avgdata0maxresident)k
0inputs+1280outputs(0major+234minor)pagefaults0swaps

paumier@univ-mlv.fr

22

Bascule noyau/utilisateur

version non bufferise, qui cote trs


cher:
int main(int argc,char* argv[]) {
setvbuf(stdin,NULL,_IONBF,0);
setvbuf(stdout,NULL,_IONBF,0);
int c;
while ((c=fgetc(stdin))!=EOF) {
fputc(c,stdout);
}
return 0;
}

$>mangcc|time./io_buf>err
0.01user0.00system0:00.57elapsed2%CPU(0avgtext+0avgdata0maxresident)k
0inputs+1280outputs(0major+234minor)pagefaults0swaps
$>mangcc|time./io_unbuf>err
0.34user1.62system0:02.09elapsed93%CPU(0avgtext+0avgdata0maxresident)k
0inputs+1280outputs(0major+228minor)pagefaults0swaps
paumier@univ-mlv.fr

23

Mode noyau/utilisateur

grce au mode protg, les programmes


utilisateur n'ont physiquement pas accs
l'espace du noyau
mais en mode noyau, on a tous les
droits !
le code du noyau tant critique, on met
un maximum de choses en dehors

exemple: on peut redmarrer un serveur


graphique plant sans devoir rebooter

paumier@univ-mlv.fr

24

Problme de maintenance

si on ne peut pas toucher au noyau, on


doit le changer ou le recompiler chaque
mise jour de n'importe quel morceau!

il ft un temps o il fallait recompiler


chaque update d'un driver...

pour simplifier cela, introduction de


codes noyau chargeables
dynamiquement: les modules

paumier@univ-mlv.fr

25

Problme de maintenance

mme philosophie avec les bibliothques


partages et l'dition de liens
dynamiques
on peut changer un morceau de code
sans devoir tout rinstaller ou
recompiler, et bien souvent, sans
rebooter

proprit vitale pour certains systmes


critiques (banques, hopitaux, etc)

paumier@univ-mlv.fr

26

Les appels systme

interface simple et lgante pour


communiquer de faon homogne
les diamants:

ssize_tread(intfd,void*buf,size_tn);
ssize_twrite(intfd,constvoid*buf,size_tn);

lire ou crire des octets vers on ne sait pas


quoi (et on ne veut surtout pas savoir!):

fichier ordinaire, fichier spcial, terminal,


socket, tube, priphrique, etc

paumier@univ-mlv.fr

27

Les appels systme

peuvent (presque tous) tre appels


comme des fonctions
peuvent tre invoqus par syscall, en
utilisant les constantes dfinies dans
sys/syscall.h de la forme SYS_read
attention: certains appels sont wrapps
par la libc

ne pas mlanger les appels wrapps et


les appels directs avec syscall !

paumier@univ-mlv.fr

28

Bug

un processus qui a le mme pid que son


pre ?
int main(void) {
getpid();
int i=syscall(SYS_fork);
if (0==i)
/* Big problem: the son prints the same value
* for getpid() and getppid() */
printf("__son : %d
father : %d__\n", getpid(), getppid());
else
printf("<<father : %d
son : %d>>\n", getpid(), i);
return 0;
}

paumier@univ-mlv.fr

29

Violation du modle en couches

explication dans la page man de getpid:

NOTES
Depuis la glibc version 2.3.4, la fonction enveloppe de la glibc pour
getpid() faisait un cache des PID, de faon viter des appels systme
supplmentaires quand un processus appelle getpid() de faon rpte.
Normalement, ce cache n'est pas visible, mais son fonctionnement cor
rect repose sur la gestion du cache dans les fonctions enveloppes pour
fork(2), vfork(2) et clone(2) : si une application se passe des
enveloppes de la glibc pour ces appels systme en appelant syscall(2),
alors un appel getpid() dans le fils renverra la mauvaise valeur
(pour tre prcis : il renverra le PID du processus pre). Consultez
galement clone(2) pour une discussion sur un cas ou getpid() peut ren
voyer une mauvaise valeur quand clone(2) est appel via la fonction
enveloppe de la glibc.

toujours lire les docs en entier!!!

paumier@univ-mlv.fr

30