Liste générique dans Linux 2.6 Source : Understanding the Linux kernel Chap3 processes p.87.

Slides:



Advertisements
Présentations similaires
La boucle for : init7.c et init71.c
Advertisements

Programmation Orienté Objet en C++
Rappels C.
Grief de classification Classification Grievance.
Formation C débutant. Notion de compilation source.c executable Phase de compilation Fichier de texte brut, inexploitable directement par la machine Fichier.
GEF 243B Programmation informatique appliquée
1 UMLV 1. Introduction 2. Hachage ouvert 3. Hachage fermé 4. Implémentation des fonctions Méthodes de hachage.
C.
Structures et unions types énumérés Qu'est-ce qu'une structure
FLSI602 Génie Informatique et Réseaux
FLSI602 Génie Informatique et Réseaux
Points importants de la semaine Les pointeurs. Les chaînes de caractères.
Regrouper des éléments de même type et pouvoir y accéder à laide dun identificateur et dun indice. Objectif des tableaux.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Cours VHDL Chap 3: sémantique VHDL
Nous avons visité… Unité 3: Voyageons!.
La programmation objet Illustration de la POO en Pascal
8PRO100 Éléments de programmation Allocation dynamique de la mémoire.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que lon veut allouer. Le premier exemple: #include void main()
TRAITEMENT DE STRUCTURES
IFT-2000: Structures de Données Listes chaînées Dominic Genest, 2009.
Les Classes les structures en C (struct) regroupent des variables : structuration de l'analyse mais problèmes de cohérence problèmes de sécurité d'accès.
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
Les pointeurs Enormément utilisé en C/C++ ! Pourquoi? A quoi ça sert?
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
IFT-2000: Structures de données Les graphes Dominic Genest, 2009.
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem La librairie STL du C++ Département dinformatique et de génie logiciel Édition Septembre 2009.
Présentation Structures de Données et TDA
Sixième cours Les chaînes de caractères et le passage de paramètres par référence Passage de paramètres par référence String.h.
Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.
Points importants de la semaine Les allocations programmées de mémoire. Les enregistrements.
Un langage de programmation hybride
IFT 6800 Atelier en Technologies d’information
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
8PRO100 Éléments de programmation Les types composés.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Les pointeurs en C. valeur : main () { float valeur; void* pointeur; }
Introduction au Langage C
Standard Template Library
Méthode et Outils pour la Programmation
Tableaux Introduction aux tableaux à une dimension. Déclaration, stockage, initialisation et accès en lecture ou en écriture aux composantes d’un tableau.
Structures de données IFT-2000
Structures de données IFT-2000 Abder Alikacem Retour sur les listes ordonnées Département dinformatique et de génie logiciel Édition Septembre 2009.
Plan cours La notion de pointeur et d’adresse mémoire.
Le langage C Structures de données
2.1 - Historique Chapitre 2 : Introduction au langage C++
Les pointeurs L'opérateur &.
Le langage C Rappel Pointeurs & Allocation de mémoire.
Les collections. Gestion d’ensembles d’objets Tableaux Taille fixe Pas de manipulation aisée des objets dans le tableaux Base tab1[]= new Base[5]; for(int.
La notion de type revisitée en POO
et quelques rappels sur certains éléments du langage C
1 Structures des données. 2  Le tableau permettait de désigner sous un seul nom un ensemble de valeurs de même type, chacune d'entre elles étant repérée.
La fonction alloue un bloc de taille size. Il faut indiquer la taille du bloc que l’on veut allouer. Le premier exemple: #include void main()
Structures de données élémentaires dans le contexte du TP #1
ETNA – 1ème année Guillaume Belmas –
Les types composés Les enregistrements.
TABLEAUX des POINTEURS TRAITEMENT DE STRUCTURES
Cours LCS N°4 Présenté par Mr: LALLALI
Classe 1 CSI2572 Autres modificateurs de déclaration de variables: & volatile & register & static & auto & extern & const volatile Indique au compilateur.
Structures de données élémentaires
Pthread Ordonnancement. #define _MULTI_THREADED #include #ifndef _CHECK_H #define _CHECK_H /* headers used by a majority of the example program */ #include.
Liste Une liste est une séquence d’éléments. Concept important: Chaque élément possède une position dans la liste. Notation: De quelles opérations a-t-on.
Conception de Programmes - IUT de Paris - 1ère année Quelques éléments du langage C++ Les références La surcharge de fonctions Les fonctions «
PRO-1027 Programmation Scientifique en C
3ième Classe (Mardi, 23 Septembre) CSI2572. O jourd'8: E Allocation de mémoire E Déallocation de mémoire E Tableaux (n dimensions) E Arithmetique des.
Conception de Programmes - IUT de Paris - 1ère année Les classes Introduction Déclaration d’une classe Utilisation d’une classe Définition des.
C++ BY AURÉLIEN MODULO MARION. PLAN DES TROIS PRÉSENTATIONS C++ avancé C++ orienté objet Bases de C++
Informatique 2A Langage C 5ème séance. Déroulement de la séance 5 1 ère partie Étude des chaînes de caractères 2 ème partie Les structures 3.
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
Transcription de la présentation:

Liste générique dans Linux 2.6 Source : Understanding the Linux kernel Chap3 processes p.87

plan Pointeur Structure Chaînage Liste

Les pointeurs éé Gestion de lespace mémoire en cours dexécution éè Modifications de variables passées en paramètres de fonction éèé Représentation de tableaux: accès direct et indexé

int* a; Déclaration dun pointeur vers un entier et initialisation à NULL int* a = NULL; a Rappels sur les pointeurs

int* a = malloc(3*sizeof(int)); Allocation dynamique et assignement int* a = (int*)malloc(3*sizeof(int)); a *a

Désallocation dynamique free(a); a a = NULL; *a

Rappels #define NB_ELEMENTS 2 int *pk; pk = malloc(NB_ELEMENTS * sizeof(int)); //allocation pour 2 int *pk = 10; *(pk + 1) = 20; #define NB_ELEMENTS 2 int *pk; pk = malloc(NB_ELEMENTS * sizeof(int)); //allocation pour 2 int *pk = 10; *(pk + 1) = 20; Malloc.c pk=0x33c18 pk+1=0x33c1c

Rappels : les structures struct nomprenomage { char nom[1]; char prenom[4]; int age; }; Struct nomprenomage * ptr; ptr = &nomprenomage; ptr->age ~ (*ptr).nom struct nomprenomage { char nom[1]; char prenom[4]; int age; }; Struct nomprenomage * ptr; ptr = &nomprenomage; ptr->age ~ (*ptr).nom 0x2 nom0 0x3 prenom1 0x10 age8

Rappels struct nomprenomage { char nom[10]; char prenom[10]; int age; }; Struct nomprenomage groupe[n]; struct nomprenomage { char nom[10]; char prenom[10]; int age; }; Struct nomprenomage groupe[n]; groupe[i].nom référence le nom de la personne qui a lindex i.

Rappels struct adresse { char *rue; int num; } nomadresse; struct adresse { char *rue; int num; } nomadresse; Cette définition réserve en mémoire la place pour 2 variables : La variable nomadresse.num de type int La variable nomadresse.rue de type pointeur sur le type char Cette définition ne réserve pas de place pour stocker le nom de rue.

Rappels: structures et pointeurs struct adresse { char *rue; int num; } nomadresse; struct adresse nomadresse *ptr; ptr=&nomadresse; struct adresse { char *rue; int num; } nomadresse; struct adresse nomadresse *ptr; ptr=&nomadresse; On a donc *ptr== nomadresse nomadresse.Num ou (*ptr).num désigne une variable de type int Les parenthèses sont nécessaires car lopérateur point. Qui donne laccès aux champs dune structure est prioritaire sur * On désignera volontiers (*ptr).num par ptr->num

Rappel : erreur courante struct adresse { char *rue; int num; }; struct adresse nomadresse *ptr; … ptr->num=12 struct adresse { char *rue; int num; }; struct adresse nomadresse *ptr; … ptr->num=12 A lexécution tout peut arrivé ! struct adresse nomadresse *ptr; réserve la place pour stoquer une adresse mais ne garantie pas que la valeur de p est une adresse où lon puisse stocker la structure ; elle ne réserve pas la place dune structure à ladresse pointée par ptr. il faut soit : ptr=&nomadresse; ou ptr = malloc(sizeof(*ptr));

Rappel : liste struct list_head { struct list_head *next, *prev; }; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) include/linux/list.h

Double liste chaînée ? La liste est doublement chaînée. Elle ne contient aucune donnée à lintérieur ? prev next list_head

Déclaration exemple de déclaration linux/kernel/timer.c dans static inline void __run_timers(tvec_base_t *base) struct list_head work_list = LIST_HEAD_INIT(work_list); struct list_head *head = &work_list;

Chaînage List_head est le premier élément vide qui joue un rôle particulier de placeholder pour la tête de la nouvelle liste prev next list_head prev next list_head prev next list_head

Chaînage prev next list_head prev next list_head prev next list_head prev next list_head new prevnext

Chaînage prev next list_head prev next list_head prev next list_head prev next list_head new prevnext next->prev = new; new->next = next; new->prev = prev; prev->next = new;

Chaînage prev next list_head prev next list_head prev next list_head prev next list_head new prevnext next->prev = new; new->next = next; new->prev = prev; prev->next = new;

Chaînage prev next list_head prev next list_head prev next list_head prev next list_head new prevnext next->prev = new; new->next = next; new->prev = prev; prev->next = new;

Chaînage prev next list_head prev next list_head prev next list_head prev next list_head new prevnext next->prev = new; new->next = next; new->prev = prev; prev->next = new;

Chaînage prev next list_head prev next list_head prev next list_head prev next list_head prevnext next->prev = new; new->next = next; new->prev = prev; prev->next = new;

Fin dinsertion connaissant Prev et Next prev next list_head prev next list_head prev next list_head prev next list_head prev next list_head prev next list_head prev next list_head Avant Après

Insertion en tête prev next list_head prev next list_head prev next list_head prev next list_head new

Insertion en queue prev next list_head prev next list_head prev next list_head prev next list_head new

Autres fonctions List_empty List_delete

Macros /** * list_for_each-iterate over a list &struct list_head to use as a loop counter. head for your list. */ #define list_for_each(pos, head) \ for (pos = (head)->next; prefetch(pos->next), pos != (head); \ pos = pos->next)

plan Pointeur Structure Chaînage Liste

Manipulation des listes prev next list_head prev next list_head prev next list_head prev next list_head Struc1Struc2Struc3

Et pas un pointage sur la tête de la structure prev next list_head prev next list_head prev next list_head prev next list_head Struc1Struc2Struc3

Manipulation des listes prev next list_head prev next list_head prev next listétudiants prev next list_head Struc1Struc2Struc3 prev next list_head prev next list_head prev next listalternants

Manipulation des listes prev next list_head prev next list_head prev next list_head prev next list_head Struc1Struc2Struc3 Mais comment récupérer ces pointeurs ?

Rappels struct humain { char nom[1]; char prenom[4]; int age; }; 0x2 nom 0x3 prenom 0x10 age Containerof.c

Offsetof : offsetof(struct nomprenomage,age))= &((struct nomprenomage *)0)->age Or (struct nomprenomage *)0 définit un pointeur de valeur 0 offsetof(struct nomprenomage,age)= (struct nomprenomage *)0 – &((struct nomprenomage *)0)->age Linux/stdef.h

Rappels struct humain { char nom[1]; char prenom[4]; int age; }; 0x2 nom0 0x3 prenom1 0x10 age8 Containerof.c offsetof

Comment obtenir la valeur du pointeur sur la struct struct humain { char nom[1]; char prenom[4]; int age; }; 0x2 nom 0x3 prenom 0x10 age Connu Containerof.c ?

Container_of #define container_of(ptr, type, member) ({\ const typeof( ((type *)0)->member ) *__mptr = (ptr);\ (type *)( (char *)__mptr - offsetof(type,member) );}) Pour avoir ladresse du début de la structure connaissant ladresse dun des membres : ptr = container_of(ptrhumain ->age,struct humain,age); Include/linux/kernel.h

List_entry(p,t,m) #define list_entry(ptr, type, member) container_of(ptr, type, member) /** * container_of - cast a member of a structure out to the containing structure pointer to the member. type of the container struct this is embedded in. name of the member within the struct. * */ #define container_of(ptr, type, member) ({\ const typeof( ((type *)0)->member ) *__mptr = (ptr);\ (type *)( (char *)__mptr - offsetof(type,member) );})

Pourquoi une liste générique Le noyau a besoin de conserver beaucoup dinformations La liste de tous les processus La liste des processus actifs La liste des processus actifs suspendus A compléter Pour éviter dimplémenter pour chaque type de liste les primitives de bases et pour un gain de mémoire, il est intéressant de définir une structure de liste générique.

Exemple avec les processus Include/linux/sched.h struct task_struct { … struct list_head run_list; … struct list_head tasks; … struct list_head ptrace_children; struct list_head ptrace_list; … struct list_head children;/* list of my children */ struct list_head sibling;/* linkage in my parent's children list */ … struct list_head cpu_timers[3]; };

Macro list_for_each_entry /** * list_for_each_entry-iterate over list of given type type * to use as a loop counter. head for your list. name of the list_struct within the struct. */ #define list_for_each_entry(pos, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member); \ prefetch(pos->member.next), &pos->member != (head); \ pos = list_entry(pos->member.next, typeof(*pos), member)) Permet de pointer sur chaque éléments de la liste :

Manipulation des listes prev next list _head prev next list _head prev next étudiants prev next list_head Struc1Struc2Struc3 prev next list_head prev next list_head prev next alternants 0x33c0 offset=0 0x33c8 offset=8 0x33cf offset=f

Rappels struct humain { char nom[1]; char prenom[4]; int age; }; offsetof(struct humain,age)); = 8 0xff2 nom0 0xff3 prenom1 0xffA age8 adresse offsetof