Windows ConfidentialIl giusto equilibrio delle DLL conosciute

Raymond Chen

La funzionalità di Windows, denominata in modo informale "DLL conosciuta", fa riferimento a un elenco di DLL (Dynamic Link Libraries) a cui il caricatore di moduli del kernel dedica un trattamento speciale. Quando il caricatore individua un programma con un collegamento dinamico per la durata di caricamento a una DLL conosciuta, la copia nota viene utilizzata immediatamente ignorando l'algoritmo di ricerca che in genere si applica al caricamento del modulo. Alcuni potrebbero considerarla come una funzionalità di protezione (nonostante si tratti chiaramente di una funzionalità piuttosto debole), ma di fatto la protezione non ha mai rappresentato lo scopo di questa funzionalità. Le DLL conosciute hanno a che fare esclusivamente con le prestazioni.

I meccanismi della funzionalità relativa alle DLL conosciute sono cambiati nel tempo. In alcune versioni di Windows®, il kernel utilizza l'elenco di DLL conosciute come punto di partenza, poi prende in considerazione tutte le DLL a cui si collegano tali DLL conosciute, quindi tutte le DLL a cui si collegano queste ultime e così via. Questo processo sviluppa la chiusura transitiva di tutte le dipendenze e le considera tutte come conosciute. Nelle altre versioni di Windows, questa chiusura transitiva non viene sviluppata. Al contrario, vengono trattate come note solo le DLL elencate esplicitamente come conosciute. In alcune versioni di Windows, le DLL conosciute vengono precaricate dal kernel all'avvio del sistema. In altre versioni, non ha luogo nessuna operazione di precaricamento e il kernel utilizza semplicemente l'elenco per evitare di dover ricercare il percorso di una DLL.

Non è solo l'interpretazione dell'elenco di DLL conosciute che cambia da versione a versione. Anche i contenuti della chiave del Registro di sistema KnownDLL sono soggetti a modifiche. Il team addetto alla gestione delle prestazioni di Windows modifica sia l'elenco di DLL conosciute sia le regole tramite cui l'elenco viene convertito in una serie di DLL in base alla conoscenza delle modalità con cui le applicazioni utilizzano Windows. È un gioco di compromessi, tipico in ingegneria. Il precaricamento delle DLL conosciute all'avvio del sistema consente alle applicazioni che le utilizzano di essere avviate più rapidamente. Ma c'è un prezzo da pagare per questo. L'avvio del sistema dura di più e il consumo della memoria aumenta poiché tali DLL restano in memoria a prescindere se vengano utilizzate. È un gioco che prevede il miglioramento delle prestazioni di alcuni componenti a scapito di altri. Trovare il giusto equilibrio è difficile e, come si può vedere, è un'attività che viene costantemente ottimizzata man mano che viene sviluppato il modello di utilizzo.

Una conseguenza non proprio ovvia delle DLL conosciute è la precedenza che queste ultime hanno sulle DLL reindirizzate localmente. A tale proposito rimando all'edizione di gennaio 2007 di questa rubrica. Pensandoci su, è probabile che si tratti effettivamente del comportamento previsto piuttosto che di un capriccio. Dopotutto, lo scopo dell'elenco di DLL conosciute è ignorare il percorso di ricerca, velocizzando così il caricamento delle DLL. Se il kernel dovesse verificare le DLL reindirizzate localmente, si verificherebbe un rallentamento. Si potrebbe pensare che aggiungere una sola directory al percorso di ricerca non sia un grande affare, ma se quell'unica directory può essere un server di rete a metà strada tra una parte e l'altra del globo, l'aggiunta di una sola directory può causare un importante rallentamento delle prestazioni.

Che ci si creda o no, abbiamo visto programmi che si basano su DLL specifiche conosciute. La directory dell'applicazione conteneva un programma che aveva un file denominato Version.dll. In circostanze normali, questa copia privata di Version.dll avrebbe sostituito quella presente nella directory di sistema, ma in Windows XP, Version.dll viene elencata come DLL conosciuta. Ciò significa che la copia nella directory dell'applicazione viene ignorata e la versione nella directory di sistema ha la meglio.

In Windows Vista®, Version.dll non è più in elenco come una DLL conosciuta, probabilmente perché i responsabili delle prestazioni hanno stabilito che le applicazioni non la utilizzavano abbastanza da giustificare i costi. Di conseguenza, questo programma non funziona più in Windows Vista perché l'applicazione si basava di fatto sul kernel ignorando la DLL che il programma ha installato nella propria directory dell'applicazione. Il programma continuava ostinatamente a installare una DLL sul percorso di ricerca facendo affidamento su Windows affinché la ignorasse. Di certo se voleva che Windows ignorasse un file, sarebbe risultato molto più efficace non installare affatto il file. La società che ha scritto il programma ha segnalato un bug dichiarando di aver trovato un problema di protezione.

Raymond Chen, The Old New Thing, così come nel suo libro che porta lo stesso titolo (Addison-Wesley, 2007), vengono illustrate la storia di Windows e la programmazione in Win32. Non sa più come è fatta una T-shirt.

© 2008 Microsoft Corporation e CMP Media, LLC. Tutti i diritti riservati. È vietata la riproduzione completa o parziale senza autorizzazione.