580 likes | 823 Views
Gestion mémoire. Présentation. 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. Architecture mémoire (1). Espace virtuel de 4 GB Séparation de la mémoire en deux espaces
E N D
Gestion mémoire Présentation Gestion mémoire : présentation
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 Gestion mémoire : présentation
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 Gestion mémoire : présentation
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 Architecture mémoire (2) Gestion mémoire : présentation
Adressage d’un process en mémoire Gestion mémoire : présentation
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 Gestion mémoire : présentation
0 à 32 MB 64 KB réservés Code Données ROM Données RAM Tas Pile Espace allouable Dll « dynamiques » Mémoire locale du process (1) Gestion mémoire : présentation
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 Gestion mémoire : présentation
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 Gestion mémoire : présentation
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 Gestion mémoire : présentation
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 Gestion mémoire : présentation
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 Gestion mémoire : présentation
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) Gestion mémoire : présentation
GetCallerProcess(void) HANDLE GetCallerProcess(void); Parameters None. Return Values A handle to the caller process indicates success. Gestion mémoire : présentation
MapPtrToProcess LPVOID MapPtrToProcess( LPVOID lpv, HANDLE hProc ); Parameters lpv [in] Long pointer to be mapped. hProc [in] Handle to the process into which the lpv pointer is to be mapped. Return Values If successful, returns a mapped version of the lpv pointer; otherwise, the return value is NULL. Gestion mémoire : présentation
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 Gestion mémoire : présentation
Driver (1) Gestion mémoire : présentation
Driver (2) Gestion mémoire : présentation
Driver (3) Gestion mémoire : présentation
Driver (3) Gestion mémoire : présentation
Driver : fichier .cpp fourni Gestion mémoire : présentation
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 Gestion mémoire : présentation
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) Gestion mémoire : présentation
PTR_DRV.def LIBRARY PTR_DRV EXPORTS PTR_Init PTR_Deinit PTR_Open PTR_Close PTR_IOControl Gestion mémoire : présentation
Structure du driver Gestion mémoire : présentation
Entête du driver //includes // TODO //définitions et réservations globales // TODO //entrée du driver BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } Gestion mémoire : présentation
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; } Gestion mémoire : présentation
PTR_Deinit BOOL PTR_Deinit(DWORD hDeviceContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PTR_DRV: PTR_Deinit\n"))); return bRet; } Gestion mémoire : présentation
PTR_Open DWORD PTR_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("PTR_DRV: PTR_Open\n"))); return dwRet; } Gestion mémoire : présentation
PTR_Close BOOL PTR_Close(DWORD hOpenContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PTR_DRV: PTR_Close\n"))); return bRet; } Gestion mémoire : présentation
IOCTL (1) BOOL PTR_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { Gestion mémoire : présentation
IOCTL (2) //Réservations // TODO switch(dwCode) { Gestion mémoire : présentation
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; Gestion mémoire : présentation
IOCTL (4) default:RETAILMSG(1,(TEXT("PTR_DRV: erreur IOCTL \n"))); bRet=FALSE; break; }//Fin du switch return bRet; } //Fin Ioctl Gestion mémoire : présentation
Génération du driver Gestion mémoire : présentation
Création de l’image noyau & driver Gestion mémoire : présentation
Application PTR_APP Préparation Gestion mémoire : présentation
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é Gestion mémoire : présentation
Application (1) Gestion mémoire : présentation
Application (2) Gestion mémoire : présentation
Application (3) Gestion mémoire : présentation
Application (4) Gestion mémoire : présentation
Application (5) Gestion mémoire : présentation
Application PTR_APP Code Gestion mémoire : présentation
Entête de l’application // TODO : Include et définitions int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { Gestion mémoire : présentation
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) Gestion mémoire : présentation
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; } Gestion mémoire : présentation
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; } Gestion mémoire : présentation
IOCTL // TODO: appel de l'IOCTL pour modifier le contenu du buffer // TODO: affichage du buffer de sortie modifié Gestion mémoire : présentation
Libération des ressources // TODO: libération des buffers // TODO: déchargement du driver et fermeture de tous les handles driver return 0; } Gestion mémoire : présentation