Virtual Machine
Manager
La
Virtual Machine Manager (VMM) e' il vero
sistema operativo dietro Windows 95. Essa erige e sostiene la struttura per
maneggiare le virtual machine. Fornisce inoltre molti altri servizi agli altri
VxD. Tre importanti servizi sono:
- Gestione della
memoria
- Gestion Interrupts
- Pianificazione dei
thread
Gestione Della
Memoria
La VMM
usa la capacita' di paging degli Intel 80386 e dei processori successivi per
creare un virtual address a 32-bit per la VM di sistema. Essa divide lo spazio
degli indirizzi in quattro aree distinte.
- Region
V86 estesa dall'indirizzo 0h a 10FFEFh. Questa regione appartiene
alla virtual machine che e' attualmente in esecuzione.
- Regione
privata per le applicazioni estesa dall'indirizzo 4MB a 2GB. Questa
e' l'area dove le applicazioni win32 vengono eseguite. Ogni processo win32
avra' le sue private 2GB (meno 4 MB).
- Regione
condivisa per le applicazioni estesa dall'indirizzo 2 GB a 3 GB.
Quest'area e' condivisa tra TUTTE le
applicazioni nella VM di sistema. Questa regione e' dove le DLL di sistema
(user32, kernel32, e gdi32) risiedono. Anche tutte le applicazioni Win16 sono
eseguite qui. I memory mapped files sono immagazzinati qui, come anche la
memoria allocata per le chiamate alla DPMI.
- Regione
condivisa di sistema si estende dagli indirizzi sopra i 3GB fino a
4GB. Qui e' dove la VMM e i VxD vivono.
La VMM fornisce tre tipi di servizi di
memoria ai VxD
- Page-based
memory services. Questo tipo di servizio alloca/gestisce la memoria
in pagine di 4 KB. Esso e' il servizio di gestione della memoria disponibile a
piu' basso livello . Tutti gli altri servizi di memoria usano il page-based
memory service come loro base.
- Heap
memory services. Gestisce blocchi di memoria piu' piccoli. Questo
e' un tipo di gestione di memoria a piu' alto livello costruito sul servizio
page-based.
- List
services. Gestisce blocchi di memoria di dimensione fissa
adattabili per l'implementazione di linked lists.
Interrupt
Handling
Gli
interrupt nel protected mode sono rediretti dalla Interrupt Descriptor Table
(IDT). La VMM supervisiona la IDT delle VM con l'aiuto dei VxD. Normalmente la
VMM gestisce quasi tutte le entry nella IDT. Essa fornisce interrupt handlers di
primo livello che salvano sullo stack lo stato del programma interrotto e
trasferiscono il controllo agli interrupt handler di secondo livello che possono
essere forniti dai vari VxD per l'elaborazione corrente. Quando l'handler di
secondo livello finisce il suo lavoro, esso trasferisce il controllo alla
funzione di redispatch che ripristinera' lo stato del programma interrotto per
riprendere l'esecuzione dal punto dell'interruzione.
Questa descrizione e' la piu' semplificata
possibile. L'operazione di redispatching puo' non essere immediata poiche' il
timeslice della VM interrotta puo' scadere. I VxD possono installare interrupt
handlers tramite i servizi della VMM come Set_PM_Int o Hook_V86_Int_Chain. I
generale i VxD non devono mai modificare direttamente le entry della IDT (ma
potete anche far cio' se siete sicuri di cio' che state facendo)
Pianificazione
Dei Thread
La
VMM usa due componenti di pianificazione per implementare il multitasking
preemptive tra i thread e le VM.
- primary
scheduler
- time-slicer o secondary
scheduler
Il compito del primary scheduler e' di scegliere il thread con la
maggiore priorita' da eseguire. Questa selezione avviene mentre la VMM sta
gestendo un interrupt (come gli interrupt del timer). Il risultato determina a
quale thread/VM sara' dato il controllo quando la VMM ritorna dalla
gestione dell'interrupt. Il primary scheduler lavora in base alla regola
o-tutto-o-niente. Un thread quindi verra' eseguito oppure no. Solo un thread
viene scelto. La VMM e gli altri VxD possono alzare/modificare la priorita' di
esecuzione dei thread tramite i servizi della VMM. Per esempio, se avviene un
interrupt hardware, la VMM alzera' la priorita' di esecuzione dell'interrupt
handler cosi' che esso possa avere la piu' alta possibilita' di completare
l'operazione nel minor tempo possibile.
Il secondary scheduler usa i servizi del
primary scheduler per allocare tempo di CPU tra i thread che condividono la piu'
alta priorita' di esecuzione dando ad ogni thread una time slice (quantum di
tempo macchina). Quando un thread viene eseguito, finche' la sua time slice
scade, il secondary scheduler aumenta la priorita' di esecuzione del thread
successivo cosi' che esso verra' scelto dal primary scheduler per essere
eseguito successivamente.
Potete ottenere maggiori dettagli
riguardo questi argomenti leggendo Walter Oney's Systems
Programming for Windows 95 e la Windows 95 DDK
documentation.
Traduzione italiana a cura di: fabio@privacy.nu
|
Torna alla
pagina principale |