58
jc/md/lp-01/05 Gestion mémoire : présentation 1 Gestion mémoire Présentation

Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

Embed Size (px)

Citation preview

Page 1: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 1

Gestion mémoire

Présentation

Page 2: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 2

Objectif du chapitre

• Organisation de la mémoire• Découpage en slots• Rôle du slot 0• Passage d’adresses entre le slot 0 et le slot de

l’application

Page 3: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 3

Architecture mémoire (1)

• Espace virtuel de 4 GB• Séparation de la mémoire en deux espaces

– De 0 à 2GB user mode (process)– De 2GB à 4GB kernel mode (system)

• Mémoire user mode– 33 slots de 32MB

32 slots pour les process (numéros 1 à 32) 1 slot pour le process en cours (numéro 0)

– le reste (1GB moins 32MB) est partagé entre tous les processus

Page 4: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 4

Architecture mémoire (2)

• Quand un process est créé le système lui attribue un slot disponible (« ouvert ») parmi les slots 1 à 32

• Maximum de 32 processus ouverts

• Quand un process s’exécute, il est cloné dans le slot 0

Page 5: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 5

Adressage d’un process en mémoire

Page 6: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 6

Gestion mémoire

• Mémoire gérée par pages de 4KB ou 1KB suivant les microprocesseurs

• Gestion par le mécanisme de page à la demande, mais on a aussi la possibilité de charger une application complète en mémoire

• Possibilité de réserver des régions• Possibilité d’accéder à de vastes espaces

mémoires dans une partie gérée comme des fichiers en RAM

Page 7: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 7

Mémoire locale du process (1)

0 à 32 MB• 64 KB réservés• Code• Données ROM• Données RAM• Tas• Pile• Espace allouable• Dll « dynamiques »

Page 8: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 8

Mémoire locale du process (2)

• Code et données RAM ou ROM suivant le programme

• Heap (tas) jusqu’à 192KB avec une granularité de 4 ou 8 bytes suivant les processeurs (LocalAlloc(), LocalFree(), etc.

• Possibilité de créer de nouveaux Heap si nécessaire (HeapCreate(), HeapAlloc(),…)

• Stack (pile), paramètre de l’édition de liens (link), 64KB par défaut

Page 9: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 9

Mémoire locale du process (3)

32 à 64 MB

• Extension CE 4.x par rapport à CE 3.0

• Dll systèmes

• Dll « statiques » en ROM avec les problèmes posés par l’interdiction du recouvrement des dll

Page 10: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 10

Mémoire locale du process (4)

• Extension d’allocation à la demande avec les fonctions VirtualAlloc, VirtualFree

• Sur des frontières de 64KB• Allocation suivant la taille

– Dans l’espace virtuel du process ou dans l’espace partagé si la taille atteint ou dépasse deux MB

– Problèmes de protection d’accès à prendre en considération

Page 11: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 11

Mémoire externe au process

• 1 Go moins l’espace du slot 32 (32 Mo)• Dans l’espace entre 1GB (+32MB) et 2GB• Allocation à la demande de zones privées ou

partageables– VirtualAlloc(), VirtualFree(),…– Fonctions fichiers

Page 12: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 12

Passage de pointeurs

• Il peut être intéressant pour une application de passer à un driver des pointeurs créés dynamiquement

• Les adresses de ces pointeurs sont créées en slot 0, pendant l’exécution et par conséquent l’application ne connaît que l’adresse locale

• Le driver doit donc établir la correspondance entre cette adresse en slot 0 et son image dans l’espace virtuel de l’application pour pouvoir les réutiliser

Page 13: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 13

Correspondance des pointeurs

• Le système propose deux fonctions pour résoudre le problème technique

• Le driver récupère le handle du process appelant par :

GetCallerProcess(void)• Puis le driver demande au système d’établir,

grâce à ce handle, la correspondance pour le même pointeur vu dans l’autre slot par :

MapPtrToProcess( LPVOID lpv, HANDLE hProc)

Page 14: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 14

GetCallerProcess(void)

HANDLE GetCallerProcess(void);

Parameters

None.

Return Values

A handle to the caller process indicates success.

Page 15: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 15

MapPtrToProcess

LPVOID MapPtrToProcess( LPVOID lpv, HANDLE hProc );

Parameterslpv

[in] Long pointer to be mapped. hProc

[in] Handle to the process into which the lpv pointer is to be mapped.

Return ValuesIf successful, returns a mapped version of the lpv pointer;

otherwise, the return value is NULL.

Page 16: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 16

Driver à réaliser

• Écrire un driver qui recevra dans un IOCTL, non pas un buffer avec des données, mais un buffer contenant deux adresses, l’une d’un buffer de texte unicode pour les entrées, l’autre d’un buffer de texte unicode pour les sorties (WCHAR) In et Out.

• L’IOCTL devra établir la correspondance pour ces pointeurs chez l’appelant

• L’IOCTL lira le buffer In, le modifiera (passage majuscule vers minuscule), et le réécrira dans la zone Out

Page 17: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 17

Driver (1)

Page 18: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 18

Driver (2)

Page 19: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 19

Driver (3)

Page 20: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 20

Driver (3)

Page 21: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 21

Driver : fichier .cpp fourni

Page 22: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 22

Insertion

• Créer et insérer dans le projet le fichier des entêtes PTR.h

• Créer et insérer dans le projet le fichier PTR_DRV.def

Page 23: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 23

PTR.h

#include <Windev.h>

typedef struct {

WCHAR *lpInBuffer;WCHAR *lpOutBuffer;

}MYPTRS,*PMYPTRS;

#define IOCTL_POINTEURS CTL_CODE( FILE_DEVICE_UNKNOWN, 2048,

METHOD_BUFFERED,FILE_ANY_ACCESS)

Page 24: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 24

PTR_DRV.def

LIBRARY PTR_DRV

EXPORTS

PTR_Init

PTR_Deinit

PTR_Open

PTR_Close

PTR_IOControl

Page 25: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 25

Structure du driver

Page 26: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 26

Entête du driver

//includes// TODO

//définitions et réservations globales// TODO

//entrée du driverBOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){

return TRUE;}

Page 27: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 27

PTR_Init

DWORD PTR_Init(DWORD dwContext)

{

DWORD dwRet =1;

RETAILMSG(1,(TEXT("PTR_DRV: PTR_Init\n")));

//Initialisation du buffer de travail à zéro

// TODO

return dwRet;

}

Page 28: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 28

PTR_Deinit

BOOL PTR_Deinit(DWORD hDeviceContext)

{

BOOL bRet = TRUE;

RETAILMSG(1,(TEXT("PTR_DRV: PTR_Deinit\n")));

return bRet;

}

Page 29: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 29

PTR_Open

DWORD PTR_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)

{

DWORD dwRet = 1;

RETAILMSG(1,(TEXT("PTR_DRV: PTR_Open\n")));

return dwRet;

}

Page 30: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 30

PTR_Close

BOOL PTR_Close(DWORD hOpenContext)

{

BOOL bRet = TRUE;

RETAILMSG(1,(TEXT("PTR_DRV: PTR_Close\n")));

return bRet;

}

Page 31: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 31

IOCTL (1)

BOOL PTR_IOControl(DWORD hOpenContext,

DWORD dwCode,

PBYTE pBufIn,

DWORD dwLenIn,

PBYTE pBufOut,

DWORD dwLenOut,

PDWORD pdwActualOut)

{

Page 32: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 32

IOCTL (2)

//Réservations

// TODO

switch(dwCode)

{

Page 33: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 33

IOCTL (3)

case IOCTL_POINTEURS: // TODO

//Récupération du handle de l'appelant //Mappage des adresses des pointeurs //Impression des valeurs des pointeurs

remappés //(RETAILMSG)…

// TODO //Lecture du buffer In

//Modification dans le buffer //Écriture dans le buffer Out

bRet = TRUE; break;

Page 34: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 34

IOCTL (4)

default: RETAILMSG(1,(TEXT("PTR_DRV: erreur IOCTL \n")));

bRet=FALSE;

break;

}//Fin du switch

return bRet;

} //Fin Ioctl

Page 35: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 35

Génération du driver

Page 36: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 36

Création de l’image noyau & driver

Page 37: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 37

Application PTR_APP

Préparation

Page 38: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 38

Application à réaliser

• L’application créera 2 buffers prévus pour des textes codés en unicode : In et Out

• In contiendra un texte en majuscule• Out contiendra XXXXXXXXX• L’application passera au driver une structure

contenant l’adresse de ces 2 buffers• Un IOCTL modifiera le buffer OUT• L’application imprimera le buffer modifié

Page 39: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 39

Application (1)

Page 40: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 40

Application (2)

Page 41: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 41

Application (3)

Page 42: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 42

Application (4)

Page 43: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 43

Application (5)

Page 44: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 44

Application PTR_APP

Code

Page 45: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 45

Entête de l’application

// TODO : Include et définitions

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

Page 46: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 46

Création et initialisation des buffers

// TODO: définition du nom de la structure à passer

// TODO: allocation des buffers In et Out

// TODO: initialisation des 2 buffers (wcscpy)

// TODO: affichage du buffer Out (MessageBox)

// TODO: impression des adresses des buffers (RETAILMSG)

Page 47: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 47

Chargement du driver

// TODO: inscription du driver (RegisterDevice)

if(hDriver == 0)

{

MessageBox(NULL, _T("Pb au chargement de PTR_DRV.dll"),_T("PTR_APP"),MB_OK);

return 0;

}

Page 48: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 48

Ouverture du driver

// TODO: ouverture du driver en Read/Write

if (INVALID_HANDLE_VALUE == hPtr) {

MessageBox(NULL, _T("Pb Open driver"),

_T("PTR_APP"), MB_OK);

//TODO: déchargement du driver

return 0;

}

Page 49: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 49

IOCTL

// TODO: appel de l'IOCTL pour modifier le contenu du buffer

// TODO: affichage du buffer de sortie modifié

Page 50: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 50

Libération des ressources

// TODO: libération des buffers

// TODO: déchargement du driver et fermeture de tous les handles driver

return 0;

}

Page 51: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 51

Génération de l’application

Page 52: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 52

Exécution de l’application

• Télécharger dans la cible l’image du noyau avec le driver STR_DRV

• Lancer l’application

Target→Run Program→STR_APP

Page 53: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 53

Début de l’exécution

Page 54: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 54

Exécution

Page 55: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 55

Messages dans la fenêtre se sortie

Page 56: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 56

Adresses avant et après remapping

PTR_APP: InBuffer avant remapping:30050

PTR_APP: OutBuffer avant remapping:30260

PTR_DRV: InBuffer après remapping:12030050

PTR_DRV: OutBuffer après remapping:12030260

Page 57: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 57

Target→Ce Processes

Page 58: Jc/md/lp-01/05Gestion mémoire : présentation1 Gestion mémoire Présentation

jc/md/lp-01/05 Gestion mémoire : présentation 58

Conclusion

• Première approche de l’organisation mémoire• Exemple pratique de communication d’adresses

créées dynamiquement dans le slot 0 à un driver