Condividi tramite


Gestore di processi e thread in modalità kernel di Windows

Il processo in modalità kernel e il gestore thread di Windows forniti dal sistema controllano il modo in cui i processi e i thread vengono eseguiti nel sistema operativo Windows. Comprendere questo manager è essenziale per gli sviluppatori di driver in modalità kernel che devono creare thread, monitorare la creazione dei processi o sincronizzare l'accesso alle risorse condivise.

L'esempio di driver ObCallback illustra come usare routine di notifica dei processi e dei thread in un driver in modalità kernel.

Panoramica di processi e thread

Un processo è un programma software attualmente in esecuzione in Windows e identificato da un ID processo univoco (PID). All'interno di ogni processo, uno o più thread rappresentano le unità di esecuzione effettive che eseguono il codice del programma. Ogni thread ha anche un ID thread univoco (TID) all'interno del processo.

I thread consentono il multitasking condividendo il tempo del processore. In un computer a processore singolo è possibile allocare più thread, ma ne viene eseguito solo uno alla volta. Il processore passa rapidamente tra thread, creando l'illusione dell'esecuzione simultanea. Nei sistemi multiprocessore, l'esecuzione parallela vera si verifica quando i thread vengono eseguiti simultaneamente in processori diversi.

Il processo in modalità kernel di Windows e gestione thread gestisce l'esecuzione di tutti i thread in un processo. Sia che si disponga di un processore o più, è necessario prestare molta attenzione nella programmazione dei driver per assicurarsi che tutti i thread del processo siano progettati in modo che, indipendentemente dall'ordine in cui vengono gestiti i thread, il driver funziona correttamente.

Se i thread di processi diversi tentano di usare contemporaneamente la stessa risorsa, possono verificarsi problemi. Windows offre diverse tecniche per evitare questo problema. La tecnica di assicurarsi che i thread di processi diversi non tocchino la stessa risorsa sia detta sincronizzazione. Per altre informazioni sulla sincronizzazione, vedere Tecniche di sincronizzazione.

Le routine che forniscono un'interfaccia diretta al processo e alla gestione thread sono in genere precedute dalle lettere "Ps"; Ad esempio, PsCreateSystemThread. Per un elenco delle DDI del kernel, vedere Kernel di Windows.

Questo set di linee guida si applica a queste routine di callback:

Usare queste procedure consigliate:

  • Mantieni le routine brevi e semplici.
  • Non effettuare chiamate a un servizio in modalità utente per convalidare il processo, il thread o l'immagine.
  • Non effettuare chiamate al Registro di sistema.
  • Non effettuare chiamate di funzioni di blocco e/o di comunicazione interprocesso (IPC).
  • Non eseguire la sincronizzazione con altri thread perché può causare stalli rientranti.
  • Utilizzare i thread di lavoro di sistema per mettere in coda il lavoro, soprattutto quello che coinvolge:
    • API lente o API che effettuano chiamate ad altri processi.
    • Qualsiasi comportamento di blocco che potrebbe interrompere i thread nei servizi principali.
  • Se si usano i System Worker Threads, non attendete il completamento del lavoro. In questo modo si vanifica lo scopo di accodare il lavoro da completare in modo asincrono.
  • Considerare le procedure consigliate per l'utilizzo dello stack in modalità kernel. Per esempi, vedere Come posso evitare che il mio driver esaurisca lo stack in modalità kernel? e Concetti Chiave e Suggerimenti per i Driver.

Processi del sottosistema

A partire da Windows 10, il sottosistema Windows per Linux (WSL) consente a un utente di eseguire file binari Linux ELF64 nativi in Windows, insieme ad altre applicazioni Windows. Per informazioni sull'architettura WSL e sui componenti in modalità utente e in modalità kernel necessari per eseguire i file binari, vedere i post sul blog sottosistema Windows per Linux .

Uno dei componenti è un processo del sottosistema che ospita il file binario Linux in modalità utente non modificato, ad esempio /bin/bash. I processi del sottosistema non contengono strutture di dati associate ai processi Win32, ad esempio blocco PEB (Process Environment Block) e Thread Environment Block (TEB). Per un processo del sottosistema, le chiamate di sistema e le eccezioni in modalità utente vengono inviate a un driver associato.

Ecco le modifiche apportate alle routine di gestione dei processi e dei thread per supportare i processi del sottosistema:

  • Il tipo WSL è indicato dal valore SubsystemInformationTypeWSL nell'enumerazione SUBSYSTEM_INFORMATION_TYPE . I driver possono chiamare NtQueryInformationProcess e NtQueryInformationThread per determinare il sottosistema sottostante. Queste chiamate restituiscono SubsystemInformationTypeWSL per WSL.

  • Altri driver in modalità kernel possono ricevere notifiche sulla creazione/eliminazione del processo del sottosistema registrando la routine di callback tramite la chiamata PsSetCreateProcessNotifyRoutineEx2 . Per ricevere notifiche sulla creazione/eliminazione del thread, i driver possono chiamare PsSetCreateThreadNotifyRoutineEx e specificare PsCreateThreadNotifySubsystems come tipo di notifica.

  • La struttura PS_CREATE_NOTIFY_INFO è stata estesa per includere un membro IsSubsystemProcess che indica un sottosistema diverso da Win32. Altri membri, ad esempio FileObject, ImageFileName, CommandLine , indicano informazioni aggiuntive sul processo del sottosistema. Per informazioni sul comportamento di tali membri, vedere SUBSYSTEM_INFORMATION_TYPE.