Domanda

Come è noto, un programma in esecuzione sotto Windows a 32 bit del sistema operativo ha solo 2 GB di memoria virtuale disponibile. Inoltre è noto che l'altro da 2 GB sono riservati come lo spazio del kernel. Ma ciò che è in realtà in quello spazio del kernel?

riuscivo a capire di riserva necessario per il kernel in sé, ma lo spazio per questo kernel VAS del processo? Grazie.

È stato utile?

Soluzione

Prendi il libro di Windows Internals, descrive in dettaglio cruento. Per il breve riassunto, però, alcune cose che sono nel virtuale spazio del kernel indirizzo (KVA):

1) Il kernel e HAL

2) I driver di periferica

3) I cumuli in modalità kernel (chiamate le piscine esecutivi, che trovo sempre divertente)

4) Gli oggetti esportati modalità utente tramite maniglie (processo, thread, eventi, mutex, ecc oggetti)

5) Sistema PTE, che mappa ogni genere di cose interessanti dalle applicazioni in modalità utente sporca (ad esempio le pile di esecuzione che utilizzano fili durante l'esecuzione in modalità kernel)

6) La cache del file system

E l'elenco potrebbe continuare a lungo ... come ho detto, leggere Windows Internals.

-Scott

Altri suggerimenti

Il motivo per cui la memoria del kernel è mappato nello spazio degli indirizzi virtuale di ogni processo è così che un cambio di contesto in modalità kernel non deve modificare le tabelle di pagina di processo. Il livello di privilegio corrente viene semplicemente sollevato per 0, che rende immediatamente accessibili le pagine.

Le tabelle di pagina hanno solo essere attivato quando un processo diverso viene commutato. Poiché questa è un'operazione costosa (ad es. Richiede un filo TLB), minimizzando la frequenza di esso è una vittoria.

Inoltre, se si ha interruttore in speciali tabelle delle pagine del kernel è andato si è passati allo spazio del kernel, che avrebbe dovuto scegliere una parte dello spazio degli indirizzi userspace per sostituire. Ciò renderebbe quelli userspace gestire indirizzi inaccessibile al kernel, che richiederebbe tamponi rimbalzo o più spazio di indirizzi mucking circa quando i dati in tali settori doveva essere trasferiti o dal kernel.

A mio parere c'è un altro poco conosciuto fatto che riguarda il limite di 2GB. Molte applicazioni di solito lavoro con un sacco di aritmetica dei puntatori (in particolare le applicazioni scritte in C, C ++, ...). In queste applicazioni è abbastanza comune per aggiungere gli offset di puntatori, o anche per sottrarre i puntatori.

Se il vostro spazio di indirizzi virtuali disponibile è da 2 GB, si sono garantiti che sottrarre due puntatori è sempre compreso tra -2147483647 e 2.147.483,648 mila (questi sono i limiti per valori con segno a 32 bit).

Se il vostro spazio di indirizzi sarebbe 3GB, l'eventuale differenza sarebbe più grande di qualsiasi valore che può essere rappresentato in un valore di segno a 32 bit.

Se si sa che l'applicazione è sicura, e non sottraendo puntatori totalmente estranei (e gli array sono meno di 2 GB!), Si può dire di Windows che l'applicazione può lavorare con uno spazio di indirizzi più grandi di 2 GB, impostando il linker bandiera LARGEADDRESSAWARE (o impostare questo con l'utilità EDITBIN).

Con XP (non del tutto sicuro di Vista e W7) è possibile avviare in una modalità in cui lo 'spazio del kernel' è solo 1 GB, e 3GB di spazio di indirizzamento virtuale viene lasciato per l'applicazione. Se l'applicazione è LARGEADDRESSAWARE, si ottiene il pieno 3GB. In caso contrario, si ottiene solo 2 GB.

a 64 bit di Windows applicazioni, LARGEADDRESSAWARE a 32 bit anche ottenere 4GB, dal momento che Windows non ha bisogno di un notevole spazio di indirizzo nella zona di 32 bit (dopo tutto, è un sistema operativo a 64-bit).

programma scritto in linguaggio di alto livello, come il C ++, è finalmente tradotto in chiamate alle API del sistema operativo, in particolare, API di Windows per sistemi operativi Windows. Molte API di Windows, come CreateFile, sono in realtà parlare con i driver in modalità kernel. spazio del kernel nello spazio di indirizzi del processo viene utilizzato per l'assegnazione delle risorse del kernel per questo processo. Ad esempio, driver di chiamate ioctl contengono buffer di ingresso-uscita, passati tra modalità utente API e driver. Tali tamponi sono allocati nello spazio kernel processo.

In generale, lo spazio kernel contiene risorse allocate dai componenti in modalità kernel per conto di questo processo.

La tua domanda sembra essere "perché" non "che cosa", come proposto nel titolo.

Inoltre, la sua domanda presuppone a 32 bit. versioni a 64 bit di Windows sono molto diversi (ad esempio, la VAS è 8TB, o 7TB su un sistema Itanium).

Per quanto riguarda il "perché", come è possibile passare puntatori da una funzione del kernel (come un autista) che non sono contenuti nella VAS del processo? Un buon libro da leggere per capire questo sarebbe di Windows Internals.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top