1.79k likes | 2.06k Views
Windows internals. http:// www.microsoft.com/italy/msdn/studenti scoriani@microsoft.com. Benvenuti. Un giorno di full immersion nel kernel di Windows Architettura del kernel Come funziona Come sfruttarlo al meglio Come analizzare i problemi. Agenda. Architettura kernel di Windows
E N D
Windows internals http://www.microsoft.com/italy/msdn/studenti scoriani@microsoft.com
Benvenuti • Un giorno di full immersion nel kernel di Windows • Architettura del kernel • Come funziona • Come sfruttarlo al meglio • Come analizzare i problemi
Agenda • Architettura kernel di Windows • Gestione della memoria • Processi • Thread • Thread pool • Jobs • Interprocess communication • Overlapped I/O • Domande & Risposte
MS Windows NT: obiettivi del progetto • Compatibilità • applicazioni Win32, Win16, MS-DOS, OS/2, POSIX • Portabilità • Ieri: piattaforma Intel, RISC • Oggi: IA-32 (Pentium), IA-64 (Itanium) • A breve: AMD-64 (Opteron) • Robustezza • Estendibilità • Performance • Compatibilità • binaria, sorgente, file system
Symmetric Multiprocessors Server Personal Computer Laptop Computer Portabilità
Applications and Subsystems (User-Mode Instruction Set) Software I/O Manager Process Manager Security Monitor Local IPC Object Manager Virtual Memory Manager GDI USER Kernel Device Drivers HAL Hardware CPU Privileged Architecture I/O Devices DMA/Bus Controller Caches, Interrupts Timers Architettura di MS Windows NT
System Memory (2 GB) Non-paged Paged Physical Addressing Range Per-Process Memory (2 GB) Paged Robustezza:Spazi di indirizzamento separati
Robustezza: User Mode ePrivileged-Processor Mode • User Mode • applicazioni in esecuzione • Accesso esclusivamente allo spazio di indirizzamento dei processi • Divieto di accesso diretto all’hardware • Privileged-Processor Mode • Contiene il codice di sistema: executive, drivers, kernel e HAL • “Trusted” • Può eseguire qualsiasi istruzione • Accesso all’intero spazio di indirizzamento
Robustezza: Security • Per-User Permissions • Access Control List (ACL) • Auditing Access • Quotas (sempre presente, non implementato fino a Windows 2000)
Send Reply Robustezza: i sottosistemi User Mode Win32-Based Application POSIX OS/2 Subsystem Win32 Subsystem Local Procedure Call Executive Privileged-Processor Mode
Applications and Subsystems (User-Mode Instruction Set) Software NTFS-5 I/O Manager Process Manager Security Monitor Local IPC Object Manager Virtual Memory Manager NTFS Jobs GDI USER Kernel FAT TimerQueue Device Drivers Encryption HAL Hardware CPU Privileged Architecture I/O Devices DMA/Bus Controller Caches, Interrupts Timers Estendibilità
Process Access Token Mutex Thread Event Semaphore Section File Registry Gli oggetti di NT (kernel objects)
Object model • L’object model consente di: • monitorare le risorse • implementare la sicurezza • condividere le risorse
Object Attributes Object Name Object Directory Security Descriptor Quota Charges Open Handle Counter Open Handle Database Permanent/Temporary Kernel/User Mode Type Object Pointer Object Header Type Object Object Body Object: struttura interna
Object: interfaccia esterna • Funzioni Parametri comuni • Createxxx Security attributes, inheritance, name • Openxxx Security attributes, inheritance, name • BOOL CloseHandle(hObject) • BOOL DuplicateHandle(hSourceProcess, hSource, hTargetProcess, lphTarget, fdwAccess, fInherit, fdwOptions) • Lo scope di un Object Handle è relativo a ogni singolo processo • Durata di un oggetto
Struttura SECURITY_ATTRIBUTES typedef struct _SECURITY_ATTRIBUTES { DWORD nLength; LPVOID lpSecurityDescriptor; BOOL bInheritHandle; } SECURITY_ATTRIBUTES;
Access Token Security ID: LEES Group IDs: TEAM1 TEAM2 LOCAL INTERACTIVE WORLD Privileges: None . . . Event Object Access Control List . . Security Descriptor Allow LEES Synchronize Modify State Allow TEAM1 Synchronize Allow TEAM2 Synchronize Modify State . . Security Detail
Architettura Windows NT/2000 • Radici nel passato (VMS) • Disegno modulare ed estendibile • Pochi cambiamenti e molte ottimizzazioni dal kernel di Windows NT 3.1 a quello di Windows 2000 • Modello ad oggetti, ma non object-oriented
Gestione della memoria • I processori iAPX86 • Indirizzamenti real-mode e protected-mode • Funzioni API • Condivisione della memoria • VLM – Very Large Memory • AWE – Address Windowing Extension
I Processori Intel iAPX86 • Tutti eseguono il boot in Real Mode • Su 8088/8086 è l’unica possibilità • Su 286 e successivi è necessario per compatibilità • Dopo il boot 286 e successivi possono passare al protected mode • Tutti hanno un’architettura segmentata
Indirizzamento in real-mode 15 0 15 0 : segment offset (shift leftby 4 bits) 19 4 3 0 19 16 15 0 segment’s base address 0 0 0 0 0 0 0 0 effective address + 1 MB RAM 19 0 linear address 220 = 1MB 0
Real-mode • Nessun meccanismo di protezione della memoria • Diverse combinazioni segment:offset indirizzano la stessa locazione di memoria fisica • Nessun supporto hardware nativo per una efficacie implementazione del multitasking • Microsoft ha inventato una implementazione software del multitasking per Windows 1.x
x 8192 x 8192 BASE BASE ACC. ACC. LIMIT LIMIT ACCESS ACCESS BASE BASE BASE BASE LIMIT LIMIT Protected-mode (32 bit) 15 2 1 0 31 0 : selector TI RPL offset GDT 15 0 16GB/ 64TB 0 BA+SS ? 63 48 BA LDT SEGMENT 15 0 1 TI = Table Index RPL = Requestor Privilege Level GDT = Global Descriptors Table (64KB) LDT = Local Descriptors Table (64KB) BASE = BA = Base Address (32 bit) LIMIT = Limit (20 bit) = 1 MB ACC. = ACCESS = Access Byte (12 bit) SS = Segment Size 0 RAM 63 48 G D 0 AVL P DPL S TYPE Struttura Interna Access Byte G = 0 SS = Limit x 1 Byte = 1 MB G = 1 SS = Limit x 1 Page = Limit x 4KB = 4GB (G = Granularity Bit)
Protected-mode (32 bit) • Se la granularità è una pagina (4KB), ciascun segmento è da 4GB e lo spazio di indirizzamento virtuale è di 64TB! • Il descriptor è comunque compatibile con 16 bit PM • L’architettura è comunque segmentata e limita la portabilità • Tipicamente le piattaforme RISC non hanno architettura segmentata…
Eliminare la Segmentazione • In Win95 e WinNT, il sistema operativo utilizza un solo segmento da 4GB • In pratica, l’indirizzamento in Win32 è basato esclusivamente sull’offset (32 bit) • L’indirizzamento appare lineare (o flat) • Questo assicura la portabilità ad architetture non segmentate (es. RISC) • Win32 indirizza fino a 4GB RAM fisica • Tuttavia la strategia di implementazione è basata sulle Pagine • La quantità minima di memoria allocabile è la pagina = 4KB
Perchè Paginare la Memoria • Se l’offset fosse usato come un riferimento diretto alla locazione di memoria, lo spazio di indirizzamento virtuale coinciderebbe con la RAM fisica installata • Per indirizzare 4GB virtuali, sarebbe necessario disporre di 4GB di RAM fisica in ogni sistema! • La paginazione consente di simulare uno spazio di indirizzamento fisico da 4GB anche se la RAM fisica installata è <4GB • Remapping della memoria fisica sulla memoria virtuale • Paginazione su disco • Exceptions generate dal processore e gestite dal sistema operativo
32 bit Offset in Win32 31 22 21 12 11 0 PDE (10 bit) PTE (10 bit) OFFSET (12 bit) 20 bits 12 bits 20 bits 12 bits 4GB 1023 1023 PAGE 4KB 0 0 Page Directory Page Table Win32 Process Context CR#3 0 i386 RAM PDE = Page Directory Entry PTE = Page Table Entry CR#3 = Control Register #3
System Memory (2 GB) Non-paged Paged Physical Addressing Range Per-Process Memory (2 GB) Paged Spazio di indirizzamento
Process Address Space Physical Memory 2 GB Page Tables Committed Pages R e s e r v e d Invalid Invalid Committed Pages 0 Memoria virtuale
Virtual Address Space Physical Memory 2 GB Directory 1024 Entries Table 1024 Entries 4K 12 MB Frame Invalid Invalid 8 MB 4 MB 4K 4K Valid Paged 0 Paging File 10 Bits 10 Bits 12 Bits Directory Index Table Index Byte Within Page Page Directory, Page Table,Page Frame
Paging File • Contiene Pagine scambiate dalla Memoria RAM al Disco • Dimensione pagina: 4K o 8K • Paging Policy
Process Address Space 2 GB Committed Pages R e s e r v e d Committed Pages Page Commitment
Committed Memory Process 1 Virtual Memory Page 1 Page 2 Page 1 Section Page 2 Page 1 Page 2 Copy Page 2 Copy (Read-Write) Process 2 Virtual Memory Copy-on-Write e Guard Pages
Funzioni API: VirtualAlloc • Manipolazione pagine virtuali o spazi di indirizzamento • Lettura stato pagine virtuali o spazi di indirizzamento • LPVOID VirtualAlloc(lpvAddress,cbSize, fdwAllocationType,fdwProtect) • BOOL VirtualFree(lpAddress,cbSize,fdwFreeType) • BOOL VirtualProtect(lpvAddress,cbSize, fdwNewProtect, pfdwOldProtect) • DWORD VirtualQuery(lpAddress,pmbiBuffer,cbLength) • BOOL VirtualLock(lpvAddress,cbSize) • BOOL VirtualUnlock(lpvAddress,cbSize)
Esempio: Uso di Funzioni VirtualXXX ... lpBase = VirtualAlloc (NULL, my_size, MEM_RESERVE, PAGE_NOACCESS); ... __try{ // an EXCEPTION_ACCESS_VIOLATION here // will be fixed by MyFilter if possible } __except (MyFilter (GetExceptionInformation())) { } ... VirtualFree (lpBase, 0, MEM_RELEASE); ...
Gestione Heap • Lo Heap è ottimizzato per allocare blocchi di memoria più piccoli senza l’overhead di pagina (4k o 8k) • Ogni processo ha uno Heap di default • E’ possibile allocare Heap privati • La memoria allocata in uno heap può portare a fenomeni di frammentazione • Sono Thread-Safe per default
Funzioni API: HeapAlloc • Allocazione di un Heap privato • HANDLE HeapCreate(flOptions,dwInitialSize,dwMaximumSize) • BOOL HeapDestroy(hHeap) • LPVOID HeapAlloc(hHeap,dwFlags,dwBytes) • BOOL HeapFree(hHeap,dwFlags,lpMem) • DWORD HeapSize(hHeap,dwFlags,lpMem) • LPVOID HeapReAlloc(hHeap,dwFlags,lpMem,dwBytes) • Sono Thread-Safe per default
Funzioni API: LocalAlloc/GlobalAlloc • Tutti i puntatori sono valori a 32 bit • LocalAlloc e GlobalAlloc allocano memoria dallo stesso Heap • GlobalAlloc garantisce allocazioni con allineamento a 16 bit • HGLOBAL GlobalAlloc(fuFlags,cbBytes) • HLOCAL LocalAlloc(fuFlags,cbBytes) • Presenti solo per ragioni di compatibilità: richiamano HeapAlloc
Funzioni API: C Run-Time Library • Le funzioni delle Standard C Run-Time Libraries possono essere usate (malloc, calloc, free, realloc, ...) • Bilanciare chiamate malloc() con free(), senza mischiare con GlobalFree(), HeapFree() o altro
Memory-Mapped File • I Memory-Mapped Files consentono di condividere la memoria tra processi diversi • Sono l’equivalente Win32 dell’oggetto kernel Section
Physical Memory PG.SYS Sections Views File Viste di Memory-Mapped File
FileMapping: le cose ovvie • Il file è mappato in memoria come se fosse effettivamente caricato • Gli indirizzi di memoria necessari ad effettuare il mapping devono essere riservati • Solo le pagine effettivamente utilizzate (a cui si accede in lettura o in scrittura attraverso puntatori di memoria) vengono effettivamente lette/scritte su disco • Il Paging File usato come Memory Mapped File non rende persistenti le operazioni effettuate in memoria
File Mapping: le cose meno ovvie • Tutte le operazioni di I/O su file avvengono come operazioni di file-mapping • La cache dell’I/O Manager è integrata con il Memory Manager • Tutte le volte che si apre un eseguibile (.EXE, .DLL, .OCX), il codice e le risorse non vengono caricate in memoria fino a che non sono realmente utilizzate (anche queste sono operazioni di file-mapping) • Caricando più volte la stesso file EXE/DLL da processi diversi, la memoria fisica impegnata è sempre la stessa
CreateFileMapping e OpenFileMapping • Crea un oggetto Section • HANDLE CreateFileMapping(hFile, lpsa, fdwProtect, dwMaximumSizeHigh, dwMaximumSizeLow, lpszMapName) • Apre un oggetto Section • HANDLE OpenFileMapping(dwDesiredAccess, bInheritHandle, lpszMapName) • Assegnando a hFile il valore –1 si usa il PagingFile
MapViewOfFile e UnmapViewOfFile • LPVOID MapViewOfFile(hMapObject,fdwAccess,dwOffsetHigh,dwOffsetLow,cbMap) • BOOL UnmapViewOfFile(lpBaseAddress) • BOOL FlushViewOfFile(lpvBase, cbFlush) • UnmapViewOfFile scrive tutti i cambiamenti su disco • Lazy Writes su disco delle scritture in memoria • E’ garantita la coerenza di viste differenti di un singolo oggetto Section
Process 1 Virtual Memory Committed Memory View Section Process 2 Virtual Memory View Usare Memory-Mapped File come Shared Memory
Gestione della memoria • Superare il muro dei 4Gb con Win32 • Solo per i dati, non per il codice • VLM – Very Large Memory • Solo su Windows 2000 Advanced Server • Solo per processori a 64 bit, ad oggi solo Alpha, che non supporta più Windows 2000 • AWE – Address Windowing Extension • Su tutte le versioni di Windows 2000 • Per tutti i processori a 32 e 64 bit (Win64) • Meno comodo da usare...
AWE – Address Windowing Extension • Per tutti i processori e per tutte le versioni di Windows 2000 • Memoria mappata nello spazio virtuale disponibile al processo (2Gb/3Gb) • Non funziona con funzioni grafiche/video • Granularità 4K/8K • Il processo deve essere abilitato (diritto Lock Pages in Memory) • Una zona allocata con AWE non può essere condivisa con altri processi