My Project
Chargement...
Recherche...
Aucune correspondance
pagination.c
Aller à la documentation de ce fichier.
1/*----------------------------------------------------------------------------*/
2/* Implantation des opérations spécifiques au mécanisme de pagination. */
3/* */
4/* (C) Manu Chaput 2000 */
5/*----------------------------------------------------------------------------*/
6#include <manux/pagination.h>
7
8#include <manux/config.h> /* MANUX_TAILLE_PAGE */
9#include <manux/memoire.h>
10
11/*
12 * Répertoire de pagination global au système. Le but est d'avoir une
13 * première configuration de la pagination, qui donne une vision "flat"
14 * de la mémoire.
15 */
17
18void creerTablePaginationDirecte(PageDirectory * repertoirePagination,
19 int tailleMemoireEtendue)
20/*
21 * Initialisation d'une table de pagination "directe", c'est-à-dire
22 * qui conserve les adresses physiques dans l'espace virtuel.
23 */
24{
25 int nombrePages;
26 int i; /* Pour compter les pages initialisées */
27 Page * pageCourante; /* Pour parcourir les pages */
28 PTE PTECourante; /* PDE de la page courante */
29 PDE PDECourante; /* PTE de la page courante */
30 int indiceDirectory; /* ... de la page courante */
31 int indiceTable; /* ... de la page courante */
32 PageTable tableCourante;
33
34 /* WARNING, valable pour la table système uniquement, et encore ... */
35 * repertoirePagination = (PageDirectory) 0x60000;
36
37 /* La première table est stoquée derrière le répertoire */
38 /* Attention à l'arithmétique des pointeurs ! Pas de * sizeof(PDE) */
39 tableCourante = *repertoirePagination;
40
41 /* WARNING, il faudrait peut-être passer l'adresse de fin */
42 nombrePages = (tailleMemoireEtendue + 1024)/ 4;
43
44 /* Construction des tables */
45 pageCourante = (Page *)0;
46
47 for (i = 1; i < nombrePages; i++) {
48
49 /* Calcul des indices de la page courante */
50 indiceTable = ((uint32_t)pageCourante >> 12) & 1023;
51 indiceDirectory = ((uint32_t)pageCourante >> 22) & 1023;
52
53 /* Construction d'une nouvelle PageTable */
54 if (!indiceTable) {
55 /* On met les tables les unes derrière les autres */
56 /* Attention à l'arithmétique des pointeurs ! Pas de * sizeof(PDE) */
57 tableCourante += 1024;
58 PDECourante = ((uint32_t)tableCourante & 0xFFFFF000)
59 |0x003;
60 (*repertoirePagination)[indiceDirectory] = PDECourante;
61 }
62
63 /* Calcul et enregistrement de la PTE */
64 PTECourante = ((uint32_t)pageCourante & 0xFFFFF000)
65 |0x003;
66 tableCourante[indiceTable] = PTECourante;
67
68 /* On passe à la page suivante */
69 /* Attention à l'arithmétique des pointeurs ! */
70 pageCourante += MANUX_TAILLE_PAGE / sizeof(void *);
71 }
72}
73
74void creerTablePagination(PageDirectory * repertoirePagination)
75/*
76 * Initialisation d'une table de pagination pour une nouvelle tâche.
77 * elle est créée dans la zone pointée par repertoirePagination et
78 * englobe le nombre de pages réservées au système (avec un mapping
79 * direct).
80 */
81{
82 int numeroPage; /* Pour compter les pages initialisées */
83 Page * pageCourante; /* Pour parcourir les pages */
84 PTE PTECourante; /* PDE de la page courante */
85 PDE PDECourante; /* PTE de la page courante */
86 int indiceDirectory; /* ... de la page courante */
87 int indiceTable; /* ... de la page courante */
88 PageTable tableCourante = 0;
89 int i;
90
91 /* Le répertoire occupe une page */
92 *repertoirePagination = allouerPage();
93
94 /* On initialise le répertoire à zéro */
95 for (i = 0; i < 1024; i++) {
96 (*repertoirePagination)[i] = (PDE) 0;
97 }
98
99 /* Construction des tables */
100 pageCourante = (Page)0;
101
102 /* On insère les premières pages */
103 for (numeroPage = 1;
104 numeroPage < nombrePagesSysteme;
105 numeroPage++) {
106 /* Calcul des indices de la page courante */
107 indiceTable = ((uint32_t)pageCourante >> 12) & 1023;
108 indiceDirectory = ((uint32_t)pageCourante >> 22) & 1023;
109
110 /* Construction d'une nouvelle PageTable */
111 if (!indiceTable) {
112 /* On alloue une nouvelle page */
113 tableCourante = allouerPage();
114 for (i = 0; i < 1024; i++) {
115 tableCourante[i] = (PTE)0;
116 }
117 PDECourante = ((uint32_t)tableCourante & 0xFFFFF000)
118 |0x003;
119 (*repertoirePagination)[indiceDirectory] = PDECourante;
120 }
121
122 /* Calcul et enregistrement de la PTE */
123 PTECourante = ((uint32_t)pageCourante & 0xFFFFF000)
124 |0x003;
125 tableCourante[indiceTable] = PTECourante;
126
127 /* On passe à la page suivante */
128 /* Attention à l'arithmétique des pointeurs ! */
129 pageCourante += MANUX_TAILLE_PAGE / sizeof(void *);
130 }
131}
132
133int ajouterPage(PageDirectory * repertoirePagination,
134 Page adressePhysique,
135 void * adresseVirtuelle)
136/*
137 * Ajout d'une page dans l'espace d'adressage virtuel d'une
138 * tâche à l'adresse voulue.
139 */
140{
141 int indiceDirectory; /* ... de la page */
142 int indiceTable; /* ... de la page */
143 PageTable tableCourante;
144
145 /* Calcul des indices de la page courante */
146 indiceTable = ((uint32_t)adresseVirtuelle >> 12) & 1023;
147 indiceDirectory = ((uint32_t)adresseVirtuelle >> 22) & 1023;
148
149 /* Création d'une nouvelle table si nécessaire */
150 if ((*repertoirePagination)[indiceDirectory] == 0) {
151 (*repertoirePagination)[indiceDirectory] =
152 (((uint32_t)allouerPage()) & 0xFFFFF000)
153 | 0x003;
154 }
155
156 /* Récupération de la table concernée */
157 tableCourante = (PageTable)((*repertoirePagination)[indiceDirectory]
158 & 0xFFFFF000);
159
160 /* Placement de l'adresse dans la table */
161 tableCourante[indiceTable] = ((uint32_t)adressePhysique & 0xFFFFF000)
162 |0x003;
163
164 return 0 ;
165}
166
167int initialiserPagination(int tailleMemoireEtendue)
168{
169 /* Initialisation de la table système */
171 tailleMemoireEtendue);
172
173 /* Chargement en mémoire ... */
174 __asm__ __volatile__ ("movl %0, %%cr3"
175 ::"a" ((char *)repertoirePaginationSysteme));
176
177 /* ... puis validation du mode paginé */
178 __asm__ __volatile__ ("movl %%cr0, %%eax\n\t"
179 "orl $0x80000000, %%eax\n\t"
180 "movl %%eax, %%cr0\n\t"::);
181 return 0;
182}
183
#define MANUX_TAILLE_PAGE
int nombrePagesSysteme
Definition memoire.c:48
void * allouerPage(void)
Definition memoire.c:234
unsigned long uint32_t
Definition types.h:20
void * Page
Definition types.h:66
void creerTablePaginationDirecte(PageDirectory *repertoirePagination, int tailleMemoireEtendue)
Definition pagination.c:18
int initialiserPagination(int tailleMemoireEtendue)
Definition pagination.c:167
int ajouterPage(PageDirectory *repertoirePagination, Page adressePhysique, void *adresseVirtuelle)
Definition pagination.c:133
void creerTablePagination(PageDirectory *repertoirePagination)
Definition pagination.c:74
PageDirectory repertoirePaginationSysteme
Definition pagination.c:16
uint32_t PTE
Definition pagination.h:22
PTE * PageTable
Definition pagination.h:34
PDE * PageDirectory
Definition pagination.h:28
uint32_t PDE
Definition pagination.h:16