Condividi tramite


Gestione dei metodi di accesso al buffer nei driver UMDF

Se si scrive un driver UMDF, è possibile specificare le preferenze per il metodo di accesso al buffer usato dal framework per le richieste di lettura e scrittura, nonché per le richieste di controllo I/O del dispositivo. I valori forniti da un driver UMDF sono solo preferenze e non sono garantiti che vengano usati dal framework.

Specifica di un metodo di accesso al buffer preferito

A partire dalla versione 2.0 di UMDF, un driver UMDF chiama WdfDeviceInitSetIoTypeEx per registrare metodi di accesso preferiti per le richieste di lettura/scrittura e per le richieste di controllo I/O del dispositivo.

Se il driver non chiama WdfDeviceInitSetIoTypeEx, UMDF usa il metodo memorizzato nel buffer per le richieste di I/O a questo dispositivo.

Il framework usa le regole seguenti per determinare quale metodo di accesso usare:

  • Tutti i driver UMDF in uno stack di driver devono usare lo stesso metodo per accedere ai buffer di un dispositivo e il framework offre la preferenza per l'I/O con buffer.

    Se UMDF determina che alcuni driver preferiscono l'I/O con buffer o I/O diretto per un dispositivo mentre altri driver preferiscono solo l'I/O con buffer per il dispositivo, UMDF usa l'I/O con buffer per tutti i driver. Se uno o più driver di uno stack preferiscono solo l'I/O con buffer mentre altri preferiscono solo i/O diretti, UMDF registra un evento nel registro eventi di sistema e non avvia lo stack di driver.

    Il driver può chiamare WdfDeviceGetDeviceStackIoType per determinare i metodi di accesso al buffer assegnati alle richieste di lettura/scrittura di un dispositivo e alle richieste di controllo I/O.

  • In alcuni casi, UMDF assegna l'I/O diretto a un dispositivo, ma per prestazioni ottimali, usa l'I/O memorizzato nel buffer per una o più richieste del dispositivo. Ad esempio, UMDF usa i buffer di I/O per i buffer di piccole dimensioni se può copiare i dati nel buffer del driver più velocemente di quanto possa eseguire il mapping dei buffer per l'accesso diretto.

    Facoltativamente, il driver può fornire un valore DirectTransferThreshold quando chiama WdfDeviceInitSetIoTypeEx. Il framework usa questo valore per determinare le dimensioni del buffer più piccole per cui il framework userà l'I/O diretto. In genere, non è necessario fornire questo valore perché il framework usa le impostazioni che forniscono le migliori prestazioni.

  • UMDF usa solo I/O diretto per lo spazio buffer che inizia e termina su un limite di pagina di memoria. Se l'inizio o la fine di un buffer non si trova in un limite di pagina, UMDF usa l'I/O memorizzato nel buffer per tale parte del buffer. In altre parole, UMDF può usare sia I/O con buffer sia I/O diretto per un trasferimento di dati di grandi dimensioni costituito da diverse richieste di I/O.

  • Per le richieste di controllo I/O del dispositivo, UMDF usa l'I/O diretto solo se il codice di controllo I/O (IOCTL) specifica l'I/O diretto e solo se tutti i driver UMDF per tale dispositivo hanno chiamato WdfDeviceInitSetIoTypeEx per specificare il metodo di accesso diretto.

Recupero del metodo di accesso per una richiesta di I/O

I driver usano lo stesso set di metodi di oggetto richiesta per accedere ai buffer dei dati, indipendentemente dal metodo di accesso al buffer. Pertanto, la maggior parte dei driver in genere non deve sapere se UMDF usa I/O con buffer o I/O diretto per una richiesta di I/O.

In alcuni casi, è possibile migliorare le prestazioni di un driver se si conosce il metodo di accesso per una richiesta di I/O. Si consideri ad esempio un dispositivo con velocità effettiva elevata che in genere usa I/O diretto. Quando il driver riceve una richiesta di I/O, copia i dati dallo spazio del buffer condiviso nella memoria del driver locale per la convalida.

Tuttavia, il driver potrebbe ricevere occasionalmente un buffer che usa l'I/O memorizzato nel buffer. Poiché gestione I/O ha già copiato questi dati in un buffer intermedio, il driver non deve copiare i parametri in locale. Evitando l'operazione di copia, il driver migliora le prestazioni.

Un driver UMDF chiama WdfRequestGetEffectiveIoType per ottenere un metodo di accesso al buffer della richiesta di I/O. Come descritto in precedenza, il tipo di I/O per una richiesta specifica può essere diverso dalle impostazioni del tipo I/O assegnate dal framework per un dispositivo.

Conversione da né I/O con buffer né I/O diretto

Un driver UMDF non può usare il metodo "nessuno".

Tuttavia, le definizioni di alcuni codici di controllo I/O del dispositivo (IOCTLs) specificano che le richieste usano il metodo "nessuno". Facoltativamente, un driver UMDF può convertire il metodo di accesso al buffer di tali richieste di controllo I/O del dispositivo in I/O con buffer o I/O diretto. Eseguire la procedura descritta di seguito:

  1. Includere la direttiva UmdfMethodNeitherAction in una sezione INF DDInstall del file INF del driver. È possibile impostare il valore della direttiva per indicare che UMDF deve passare le richieste di controllo I/O del dispositivo che usano il metodo di accesso "nessuno" al driver. In caso contrario, UMDF completa queste richieste di I/O con un valore di stato di errore.

  2. Accedere ai buffer della richiesta di I/O usando i metodi dell'oggetto forniti da UMDF per l'I/O memorizzato nel buffer o i/O diretti.

È consigliabile abilitare il supporto delle richieste IOCTL che usano il metodo "nessuno" solo se si è certi che UMDF possa convertire il metodo di accesso in I/O con buffer o I/O diretto. Ad esempio, se IOCTL specifica una richiesta personalizzata che non segue le regole di specifica del buffer descritte in Descrizioni buffer per i codici di controllo I/O, UMDF non può convertire i buffer.