Noyau d'un système d'exploitation INF2610 Chapitre 7 : Gestion de la mémoire (annexe 2)



Documents pareils
Logiciel de base. Première année ENSIMAG

Programmation assembleur : aperçu

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Structure d un programme

Architecture des ordinateurs : Programmation des processeurs avec l'environnement «y86» (INF155)

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Programmation système de commandes en C

Les structures de données. Rajae El Ouazzani

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Architecture des ordinateurs

Cours Programmation Système

Cours de Programmation Impérative: Zones de mémoires et pointeurs

Architecture des ordinateurs

Le prototype de la fonction main()

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Playing with ptrace() for fun and profit

3IS - Système d'exploitation linux - Programmation système

Le système de gestion des fichiers, les entrées/sorties.

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Les vulnérabilités du noyau. LECORNET Olivier LEGROS Bruno VIGIER Nicolas Promo 2005

INF 104 (SELC) Introduction au langage C

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Chapitre 1 : La gestion dynamique de la mémoire

Gestion de la mémoire

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Compression de Données - Algorithme de Huffman Document de Conception

DNS Server RPC Interface buffer overflow. Céline COLLUMEAU Nicolas BODIN

Archivage Messagerie Evolution pour usage HTML en utilisant Hypermail

Cours 6 : Tubes anonymes et nommés

Algorithmique, Structures de données et langage C

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Algorithmique et Programmation, IMA

Cours d initiation à la programmation en C++ Johann Cuenin

Arguments d un programme

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

Programmation système I Les entrées/sorties

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Les processus. Système L3, /39

Rappels Entrées -Sorties

Les failles Format String

École Polytechnique de Montréal. Département de Génie Informatique et Génie Logiciel. Cours INF2610. Contrôle périodique.

Les attaques par corruption de mémoire Synopsis Mickael Deloison 22/10/2008

Le langage C. Séance n 4

Cours de C. Allocation dynamique. Sébastien Paumier

Programmation en langage C

Java Licence Professionnelle CISII,

Les structures. Chapitre 3

Résumé Génération de code Le code intermédiaire

Derrière toi Une machine virtuelle!

INITIATION A LA PROGRAMMATION

Une introduction à Java

COMPARAISONDESLANGAGESC, C++, JAVA ET

Conventions d écriture et outils de mise au point

Les techniques de protection du logiciel

Programmation Classique en langage C

Initiation à la sécurité

Cours de Système : Gestion de Fichiers

Programmation C. J.-F. Lalande. 15 novembre 2012

Programme Compte bancaire (code)

OS Réseaux et Programmation Système - C5

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmation en C. École Nationale Supérieure de Techniques Avancées. Pierre-Alain Fouque et David Pointcheval

Langages et Concepts de Programmation Introduction à la programmation en langage C

UE Programmation Impérative Licence 2ème Année

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Introduction au langage C

Contraintes, particularités. 1. Généralités Gestion de la mémoire a. Type des variables et constantes... 2

Débogage de code* Mardi 13 décembre Romaric DAVID Université de Strasbourg - Direction Informatique Pôle HPC. hpc.unistra.

Processus! programme. DIMA, Systèmes Centralisés (Ph. Mauran) " Processus = suite d'actions = suite d'états obtenus = trace

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

TD3: tableaux avancées, première classe et chaînes

Programmation système en C/C++

TP2 : tableaux dynamiques et listes chaînées

Compilation (INF 564)

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Bases de programmation. Cours 5. Structurer les données

Prentice Hall, 2011 (ISBN )

Introduction aux Systèmes et aux Réseaux

Plan du cours. Historique du langage Nouveautés de Java 7

Programmation impérative

LEs processus coopèrent souvent pour traiter un même problème. Ces

Le traitement du temps

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Systèmes d Exploitation & Machines Virtuelles. Format de l enseignement. Objectif du cours

SUPPORT DE COURS. Langage C

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Introduction au Langage de Programmation C

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Licence Sciences et Technologies Examen janvier 2010

Les débordements de tampons et les vulnérabilités de chaîne de format 1

Introduction aux buffer overflow, CS335

Programmer en JAVA. par Tama

Chaîne de production d un programme

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Transcription:

INF2610 Chapitre 7 : Gestion de la mémoire (annexe 2) Département de génie informatique et génie logiciel Hiver 2014

Exemple 1 : Espace virtuel d un processus Où seront stockées les données des variables déclarées (cas de C)? // http://ilay.org/yann/articles/mem/mem0.html (à lire avant le prochain lab) // memoirevirtuelle.cpp #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> static int i_stat = 4; /* Stocké dans le segment data */ int i_glob; /* Stocké dans le segment bss */ int *pi_pg; /* Stocké dans le segment bss */ int main(int nargs, char **args) { int *pi_loc; /* dans la frame 1 de la pile */ void *sbrk0 =(void *) sbrk(0); /*l'adresse de base avant le 1 er malloc */ if (!(pi_loc = (int *) malloc(sizeof(int) * 16))) return 1; if (!(pi_pg = (int *) malloc(sizeof(int) * 8))) { free(pi_loc); return 2; Ecole Polytechnique de Montréal Chapitre 7-2

Exemple 1 : Espace virtuel d un processus Où seront stockées les données des variables déclarées? // afficher les adresses printf("adresse de i_stat = 0x%08x (zone programme, segment data)\n", &i_stat); printf("adresse de i_glob = 0x%08x (zone programme, segment bss)\n", &i_glob); printf("adresse de pi_pg = 0x%08x (zone programme, segment bss)\n", &pi_pg); printf("adresse de main = 0x%08x (zone programme, segment text)\n", main); printf("adresse de nargs = 0x%08x (pile frame 1)\n", &nargs); printf("adresse de args = 0x%08x (pile frame 1)\n", &args); printf("adresse de pi_loc = 0x%08x (pile frame 1)\n", &pi_loc); printf("sbrk(0) (heap) = 0x%08x (tas)\n", sbrk0); printf("pi_loc printf("pi_pg = 0x%08x (tas)\n", pi_loc); = 0x%08x (tas)\n", pi_pg); Ecole Polytechnique de Montréal Chapitre 7-3

Exemple 1 : Espace virtuel d un processus Où seront stockées les données des variables déclarées? // récupérer le contenu /proc/pid/maps du processus char buf[128]; printf("affichage du fichier /proc/%d/maps\n,getpid()); sprintf(buf,"/proc/%d/maps",getpid()); int fd1 = open(buf,o_rdonly); while (read(fd1,buf,128)>0) write(1, buf,128); write(1, "\n",2); close(fd1); free(pi_pg); free(pi_loc); return 0; Ecole Polytechnique de Montréal Chapitre 7-4

Exemple 1 : Espace virtuel d un processus Où seront stockées les données des variables déclarées? jupiter$ g++ memoirevirtuelle.cpp -o memoirevirtuelle jupiter$./memoirevirtuelle adresse de i_stat = 0x006012d4 (zone programme, segment data) adresse de i_glob = 0x006012e0 (zone programme, segment bss) adresse de pi_pg = 0x006012e8 (zone programme, segment bss) adresse de main = 0x0040096c (zone programme, segment text) adresse de nargs = 0xfd058cac (pile frame 1) adresse de args = 0xfd058ca0 (pile frame 1) adresse de pi_loc = 0xfd058d38 (pile frame 1) sbrk(0) (heap) = 0x00c24000 (tas) pi_loc pi_pg = 0x00c24010 (tas) = 0x00c24060 (tas) Ecole Polytechnique de Montréal Chapitre 7-5

Exemple 1 : Espace virtuel d un processus Où seront stockées les données des variables déclarées? Affichage du fichier /proc/2850/maps 00400000-00402000 r-xp 00000000 00:26 125178476 memoirevirtuelle 00601000-00602000 rw-p 00001000 00:26 125178476 memoirevirtuelle 00c24000-00c45000 rw-p 00000000 00:00 0 [heap]. Les champs sont : adresses (deb et fin), permissions (p pour privé et Copy-On-Write), offset, périph, i-nœud, chemin d accès (pour localiser le texte et les données initialisées) Lancez une seconde fois le programme. Est-ce que vous obtenez les mêmes adresses? Ecole Polytechnique de Montréal Chapitre 7-6

Exemple 2 : Exécution d un programme (évolution de la pile d exécution) (Livre sur les SE de Bort LAMIROY, Lourent NAJMAN,, Hugues TALBOT) Le code assembleur dépend de l architecture. La commande g++ -S prog.cpp produit le code dans prog.s. Trois paramètres suffisent pour caractériser l état d exécution d un programme. Ces paramètres sont mémorisés dans des registres. Par exemple, pour Intel x86, ces paramètres sont : %cs contient l'adresse de base(le premier mot mémoire) du programme. %eip est le compteur ordinal. ll pointe en permanence sur la prochaine instruction à exécuter. Il est initialisé à l'adresse de la fonction main. %esp est le pointeur de pile. Il évolue dynamiquement avec l'utilisation de la pile, au fur et à mesure des allocations de données intermédiaires (données locales, les paramètres d une fonction, etc.). On utilise souvent un autre registre %ebp (Extended Base Pointer) pour y stocker à chaque appel à une fonction, l adresse du sommet de la pile. À la fin de l exécution de la fonction, le contenu de %ebp est copié dans %esp. Ecole Polytechnique de Montréal Chapitre 7-7

Exemple 2 : Exécution d un programme (évolution de la pile d exécution) (Livre sur les SE de Bort LAMIROY, Lourent NAJMAN,, Hugues TALBOT) int addition(int a) {return a+5; static int arg1= 5; static int arg2= 1; int main() { int param= arg1 + arg2; arg2 = addition(param); Instructions ass. Fonction addition pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax addl $5 %eax popl %ebp ret Sauvegarder le contenu de %ebp (avant l exécution de la fonction) dans la pile. Mettre à jour %ebp Charger dans %eax la valeur du paramètre a (qui se trouve à 8 octets de de l adresse contenu dans %ebp). Ajouter de 5 à %eax Récupérer dans %ebp, le contenu de %ebp sauvegardé avant l exécution de la fonction. Retour à l appelant (dépiler %eip, ) Ecole Polytechnique de Montréal Chapitre 7-8

Exemple 2 : Exécution d un programme (évolution de la pile d exécution) (Livre sur les SE de Bort LAMIROY, Lourent NAJMAN,, Hugues TALBOT) int addition(int a) { return a+5; static int arg1= 5; static int arg2= 1; int main() { int param= arg1 + arg2; arg2 = addition(param); Instructions ass. pushl %ebp movl %esp, %ebp subl $4, %esp movl arg1, %edx movl arg2, %eax leal (%edx,%eax), %eax movl %eax, -4(%ebp) pushl -4(%ebp) call addition addl $4, %esp movl %eax, argv2 leave ret Fonction main Sauvegarder le contenu de %ebp (avant l exécution de la fonction) dans la pile. Mettre à jour %ebp Réserver 4 octets pour param. %esp contient l adresse de param ( (%ebp)-4) %edx = arg1 %eax = arg2 %eax= %edx + %eax param = %eax Empiler param comme argument Appeler la fonction addition (empiler %eip puis aller au début de la fonction) Mettre à jour %esp (dépiler l argument) arg2 = %eax Restorer %ebp et %esp. Retour à l appelant (dépiler %eip, ) Ecole Polytechnique de Montréal Chapitre 7-9

Exemple 3 : Alignement de la mémoire (Livre sur les SE de Bort LAMIROY, Lourent NAJMAN,, Hugues TALBOT) typedef struct { double valeur; short int index; char code; char id; S1; typedef struct {char id; short int index; double valeur; char code; S2; #include <stdio.h> #include <stdlib.h> int main() { S1* s1 = (S1*) malloc(sizeof(s1)); S2* s2 = (S2*) malloc(sizeof(s2)); char * a_s1 = (char*) s1; char* a_s2 = (char*) s2; printf("taille d un double = %lu\n", sizeof(double)); printf("taille d un entier court = %lu\n", sizeof(short int)); printf ("Taille d un caractère = %lu \n", sizeof(char)); printf("\n Taille de S1 (double,short,char,char)= %lu\n", sizeof(s1)); printf("champ \t Offset \t Taille \n"); printf("1 \t %ld \t %lu\n", ((char*)(&(s1->valeur))) - a_s1,sizeof(double)); printf("2 \t %ld \t %lu\n", ((char*)(&(s1->index))) - a_s1,sizeof(short int)); printf("3 \t %ld \t %lu\n", ((char*)(&(s1->code))) - a_s1,sizeof(char)); printf("4 \t %ld \t %lu\n", ((char*)(&(s1->id))) - a_s1,sizeof(char)); Ecole Polytechnique de Montréal Chapitre 7-10

Exemple 3 : Alignement de la mémoire (Livre sur les SE de Bort LAMIROY, Lourent NAJMAN,, Hugues TALBOT) printf("\n Taille de S2 (char,short,double,char)= %lu\n", sizeof(s2)); printf("champ \t Offset \t Taille \n"); printf("1 \t %ld \t %lu\n", ((char*)(&(s2->id))) - a_s2,sizeof(char)); printf("2 \t %ld \t %lu\n", ((char*)(&(s2->index))) - a_s2,sizeof(short int)); printf("3 \t %ld \t %lu\n", ((char*)(&(s2->valeur))) - a_s2,sizeof(double)); printf("4 \t %ld \t %lu\n", ((char*)(&(s2->code))) - a_s2,sizeof(char)); return 0; char aucun // cas Mac OS X 10.8.5 jupiter$./alignement short int adresse paire Taille d un double = 8 double Adresse multiple de 8 Taille d un entier court = 2 Taille d un caractère = 1 struct Adresse multiple de 8 Taille de S1 (double,short,char,char)= 16 Champ Offset Taille 1 0 8 2 8 2 3 10 1 4 11 1 Taille de S2 (char,short,double,char)= 24 Champ Offset Taille 1 0 1 2 2 2 3 8 8 4 16 1 Ecole Polytechnique de Montréal Chapitre 7-11

Exemple 4 : Parcours d un tableau multidimensionnel #include <stdio.h> #include <stdlib.h> int main() { char A[512][4096]; int i,j; for(i=0; i<512; i++) for(j=0; j<4096; j++) A[i][j] = 'A'; return 0; #include <stdio.h> #include <stdlib.h> int main() { char A[512][4096]; int i,j; for(j=0; j<4096; j++) for(i=0; i<512; i++) A[i][j] = 'A'; return 0; jupiter$ time./parcours_lig_lig real 0m0.017s user0m0.010s sys 0m0.003s jupiter$ time./parcours_col_col real 0m0.035s user0m0.030s sys 0m0.003s Ecole Polytechnique de Montréal Chapitre 7-12