La pile la mémoire les bibliothèques » History » Version 1
iri, 01/29/2013 09:35 PM
1 | 1 | iri | h1. La pile la mémoire les bibliothèques |
---|---|---|---|
2 | |||
3 | Objectif : généralités |
||
4 | |||
5 | STATUT : PARTIEL |
||
6 | Version : 0.2 |
||
7 | Auteur : iri |
||
8 | Date : Novembre 2010 (initialement diffusé sur http://www.irizone.net) |
||
9 | Licence du tutoriel : GNU FDL v1.3 |
||
10 | Licence du code source : GNU/GPL v3 |
||
11 | |||
12 | h2. Codes sources |
||
13 | |||
14 | Le code source de Scol est disponible et accessible publiquement depuis le Scolring : |
||
15 | http://redmine.scolring.org. |
||
16 | Si vous souhaitez participer et publier vos travaux sur la plateforme communautaire |
||
17 | officiel, enregistrez-vous via l'interface prévue à cet effet (en haut à droite). |
||
18 | |||
19 | h3. Le noyau (kernel) |
||
20 | |||
21 | Outre un certain nombre de fonctions standards et communes et de la gestion réseaux |
||
22 | (gestion des canaux TCP et API réseau notamment), le noyau gère toutes les interfaces |
||
23 | entre Scol et le système d'exploitation sous-jacent, notamment mémoire et par conséquent, |
||
24 | toute la gestion de la pile. C'est ce dernier point qui nous intéressera ici. |
||
25 | |||
26 | h4. La pile et la mémoire |
||
27 | |||
28 | La pile utilisée par Scol est d'un fonctionnement tout à fait standard. Les |
||
29 | opérations habituelles de base sont possibles, comme le montre ce shema ci-dessous : |
||
30 | |||
31 | http://www.irizone.net/img/prog_pile.png (image 1) |
||
32 | |||
33 | * PUSH : pousse un élément dans la pile, i.e. l'ajoute à la dernière position. |
||
34 | Le nouvel élément prend alors l'index numéro 0, l'ancien élément (qui possédait |
||
35 | donc l'index 0 avant l'opération) prend l'index 1 et ainsi de suite. |
||
36 | |||
37 | * PULL : enlève le dernier élément de la pile, i.e. l'élément possédant l'index |
||
38 | 0. L'élément ayant l'index 1 avant l'opération se retrouve donc avec l'index 0 après. |
||
39 | |||
40 | * SET : modifie le contenu d'un élément, i.e. remplace le contenu de l'élément |
||
41 | d'index I par un nouveau contenu. Les éléments inférieurs ou supérieurs de la pile |
||
42 | sont inchangés et gardent leur index respectif. |
||
43 | |||
44 | * GET : récupère le contenu d'un élément d'index I de la pile. Les éléments gardent |
||
45 | leur index respectif. |
||
46 | |||
47 | * INVERT : non montré sur le shema, c'est une opération pratique qui peut se faire |
||
48 | via les opérations de base. Elle consiste à échanger deux éléments de la pile : |
||
49 | l'élément d'indice I1 est placé à l'index I2 et l'élément d'index I2 est placé à |
||
50 | l'index I1. |
||
51 | |||
52 | Il n'est généralement pas nécessaire d'allouer dynamiquement la mémoire sauf, |
||
53 | évidemment, pour la création des objets Scol eux-même (et encore cela se fait par |
||
54 | l'intermédiaire de macros). De même, leur libération est le plus souvent transparente |
||
55 | et automatiquement géré lors de la destruction de l'objet Scol. Bien évidemment, |
||
56 | il peut être nécessaire d'allouer dynamiquement (malloc) pour des objets non Scol |
||
57 | comme pour tout code C (new pour C++) classique, dès que ces objets ne sont pas intégrés |
||
58 | à la pile Scol (et de ne pas oublier de les libérer lorsqu'ils ne sont plus utiles ! |
||
59 | suivant la loi fondamentale : à toute allocation doit correspondre une libération !!). |
||
60 | |||
61 | Pour accéder à la pile, il est plus que recommandé d'utiliser les macros et |
||
62 | fonctions prédéfinies : |
||
63 | |||
64 | * Pour l'opération PUSH : MMpush. L'élément à ajouter devrait être un pointeur. |
||
65 | Son prototype est : int (*MMpush) (mmachine m, int val); |
||
66 | * Pour l'opération PULL : MMpull. |
||
67 | Son prototype est : int (*MMpull) (mmachine m); |
||
68 | * Pour l'opération GET : MMget. L'index de l'élément souhaité est passé en argument |
||
69 | Son prototype est : int (*MMget) (mmachine m, int i); |
||
70 | * Pour l'opération SET : MMset |
||
71 | Son prototype est : void (*MMset) (mmachine m, int i, int v); |
||
72 | |||
73 | Il en existe quelques autres que nous verrons plus tard. Retenez déjà ces 4 là ! |
||
74 | |||
75 | Deux structures sont également définies et nous intéressent au premier chef : |
||
76 | _mmachine_ et _cbmachine_. |
||
77 | La première définit les éléments de la pile auxquels nous pourront accéder depuis |
||
78 | une bibliothèque ; la seconde définit une API entre le noyau et les bibliothèques. |
||
79 | Il en existe une troisième, _packdir_, plus rarement utilisée mais néanmoins parfaitement |
||
80 | accessible. |
||
81 | |||
82 | h3. Les bibliothèques |
||
83 | |||
84 | Il en existe plusieurs, comme vous avez pu le constater en parcourant le répertoire |
||
85 | "plugins" d'une installation Scol. Suivez quelques règles de bases et tout devrait |
||
86 | bien se passer ;-) |
||
87 | L'interface avec le noyau sera définie avec un fichier d'en-tête (header) que vous |
||
88 | ne devriez pas modifier (à moins de modifier le noyau en conséquence). Ce header est |
||
89 | commun à toutes les bibliothèques. Selon le projet et vos préférences, la bibliothèque |
||
90 | sera codée en C ou en C++ indifféremment (en utilisant des directives de préprocesseur |
||
91 | si besoin est). |
||
92 | |||
93 | Enfin, le chargement d'une bibliothèque se fait bien sur par le noyau, selon les |
||
94 | indications écrites dans le fichier _usm.ini_. |
||
95 | |||
96 | Pour information, le code source du noyau s'occupant du chargement / déchargement |
||
97 | des bibliothèques se trouve : |
||
98 | |||
99 | * sous MS Windows, dans "kernel5/src/win/hardload.c". Chaque biliothèque définie |
||
100 | dans le usm.ini est enregistrée par la fonction _SCregistDLL_ : celle-ci |
||
101 | sauvegarde le nom du fichier, le nom interne à la bibliothèque de la fonction de |
||
102 | chargement et le nom interne à la bibliothèque de la fonction de libération. Dans un |
||
103 | second temps, elles seront effectivement chargées et ajoutées à l'environnement |
||
104 | via la fonction _SCloadDLLs_ grâce aux informations précédemment recueilies. |
||
105 | La libération se fait lors de l'extinction de Scol, via la fonction _SCfreeDLLs_ |
||
106 | définie dans ce même fichier. |
||
107 | |||
108 | * sous GNU/Linux, dans "kernel5/src/linux-nox/hardload.c". Le fonctionnement est |
||
109 | similaire à celui décrit pour MS Windows. Le chargement et la libération appellent |
||
110 | les fonctions _dlopen_, _dlsym_ et _dlclose_ qui sont compatibles POSIX-1. |
||
111 | Un "billet":http://www.irizone.net/index.php?article=18 à ce sujet. |
||
112 | |||
113 | |||
114 | Vous voilà à peu près prêt à développer une bibliothèque Scol :) |