Blocchi di spb Connessione ion
i blocchi di Connessione ion sono utili per consentire a due client di condividere l'accesso a un dispositivo periferico di destinazione in un semplice bus periferico (SPB). Entrambi i client possono aprire connessioni logiche allo stesso dispositivo di destinazione e usare il blocco di connessione quando uno dei due client richiede l'accesso esclusivo al dispositivo per eseguire una serie di operazioni di I/O. Quando un client mantiene il blocco di connessione, le richieste dal secondo client per accedere al dispositivo vengono posticipate automaticamente fino a quando il primo client rilascia il blocco.
Un client usa le richieste di IOCTL_SPB_LOCK_CONNECTION e IOCTL_SPB_UNLOCK_CONNECTION per acquisire e rilasciare il blocco di connessione in un dispositivo di destinazione in un SPB. Un client invia queste richieste di controllo I/O (IOCTL) all'oggetto file per il dispositivo.
Il driver per un dispositivo periferico connesso a SPB è in genere un driver UMDF (User-Mode Driver Framework) o un driver KMDF (Kernel-Mode Driver Framework). Per inviare una richiesta IOCTL a un dispositivo periferico connesso a SPB, un driver UMDF chiama un metodo come IWDFIoRequest::Send. Un driver KMDF chiama un metodo come WdfIoTargetSendIoctlSynchronously.
In genere, i blocchi di connessione non sono necessari. La maggior parte dei driver client ha sempre accesso esclusivo a un dispositivo di destinazione in un SPB. Un blocco di connessione è necessario solo nel caso relativamente raro in cui due client devono condividere l'accesso allo stesso dispositivo di destinazione e uno o entrambi i client devono talvolta avere accesso esclusivo al dispositivo per una serie di operazioni di I/O.
Per impostazione predefinita, se due client condividono un dispositivo di destinazione, l'estensione spb framework (SpbCx) serializza le richieste di I/O per il dispositivo in base all'ordine in cui arrivano nella coda delle richieste SpbCx. Il blocco di connessione esegue l'override dell'ordinamento predefinito delle richieste. Dopo che un client acquisisce il blocco di connessione, SpbCx mantiene le richieste di I/O ricevute dal secondo client fino a quando il primo client non rilascia il blocco.
Nell'implementazione corrente di SpbCx, l'uso principale dei blocchi di connessione consiste nell'consentire al driver client di un dispositivo di destinazione di condividere l'accesso al dispositivo con il driver ACPI, Acpi.sys. Acpi.sys è un driver fornito dal sistema che gestisce determinati dispositivi core-resource per conto del firmware ACPI per la piattaforma hardware. Ad esempio, una piattaforma che usa un sistema su un chip (SoC) potrebbe contenere anche un circuito di risparmio energia integrato (PMIC) a cui si accede sia Acpi.sys che un driver client.
Un driver client è responsabile di determinare se richiede un blocco di connessione per le operazioni di I/O che richiedono l'accesso esclusivo a un dispositivo di destinazione. Se un driver richiede blocchi di connessione in alcune piattaforme hardware o configurazioni della piattaforma, ma non in altri, lo sviluppatore di driver e la piattaforma devono accettare un meccanismo specifico del driver per determinare quando usare i blocchi di connessione. In genere, le informazioni sull'uso dei blocchi di connessione sono incluse nel firmware della piattaforma. Ad esempio, il blocco di informazioni definito dal fornitore nel descrittore di risorse ACPI per il dispositivo potrebbe contenere un bit di flag per indicare se il driver condivide il dispositivo con Acpi.sys.
Esempio di blocco Connessione ion
Un uso tipico di un blocco di connessione consiste nell'implementare un'operazione atomica read-modify-write. Se due client condividono l'accesso allo stesso dispositivo di destinazione in un semplice bus periferico (SPB), entrambi i client possono usare il blocco di connessione per unire un'operazione di lettura e un'operazione di scrittura in una singola operazione atomica read-modify-write. Il blocco di connessione impedisce all'altro client di accedere al dispositivo di destinazione tra le operazioni di lettura e scrittura.
L'elenco seguente descrive la serie di richieste di I/O che un client potrebbe inviare a un dispositivo di destinazione connesso a SPB per eseguire un'operazione di lettura-modifica/scrittura nel dispositivo:
- IOCTL_SPB_LOCK_CONNECTION: acquisire il blocco di connessione nel dispositivo di destinazione.
- IRP_MJ_READ: legge un blocco di dati dall'indirizzo del dispositivo in modo che il client possa interpretare e modificare i dati.
- IRP_MJ_WRITE: scrivere il blocco di dati modificato nell'indirizzo del dispositivo.
- IOCTL_SPB_UNLOCK_CONNECTION: rilasciare il blocco di connessione nel dispositivo di destinazione.
L'elenco precedente potrebbe essere appropriato per un dispositivo semplice che implementa una singola funzione del dispositivo.
Tuttavia, un dispositivo più complesso potrebbe implementare diverse funzioni del dispositivo. Questo dispositivo potrebbe contenere un registro degli indirizzi della funzione caricato dal client all'inizio di un trasferimento dei dati. Per questo dispositivo, una richiesta IOCTL_SPB_EXECUTE_edizione Standard QUENCE può combinare il caricamento del registro degli indirizzi della funzione e il trasferimento dei dati che segue in una singola operazione atomica del bus. Per altre informazioni, vedere la descrizione del dispositivo I2C di esempio in Operazioni del bus atomico.
Confronto con i blocchi del controller
Un client usa un blocco di connessione per ottenere l'accesso esclusivo a un dispositivo di destinazione, ma il blocco di connessione non impedisce i trasferimenti di dati da o verso altri dispositivi nel bus.
Per eseguire una serie di trasferimenti di dati come operazione atomica del bus, i client usano in genere una richiesta IOCTL_SPB_EXECUTE_edizione Standard QUENCE. Un modo meno comune per eseguire un'operazione atomica del bus consiste nell'usare un blocco controller. Un client invia IOCTL_SPB_LOCK_CONTROLLER e IOCTL_SPB_UNLOCK_CONTROLLER richieste di acquisizione e rilascio di un blocco del controller.
I blocchi del controller sono distinti dai blocchi di connessione. Un blocco controller consente l'esecuzione di una sequenza di trasferimenti di I/O da e verso un dispositivo di destinazione sul bus come singola operazione atomica del bus. Mentre il blocco del controller è attivo, i trasferimenti verso o da altri dispositivi sul bus vengono posticipati fino al rilascio del blocco del controller. Per altre informazioni, vedere Operazioni del bus atomico.
Nota
In alcune implementazioni, un blocco di connessione potrebbe, come effetto collaterale, impedire i trasferimenti ad altri dispositivi sul bus. Tuttavia, questo comportamento dipende dall'implementazione e i driver client non devono basarsi su di esso. Al contrario, un blocco controller impedisce a un altro client di accedere allo stesso dispositivo di destinazione del client che contiene il blocco del controller e i client possono dipendere in modo sicuro da questo comportamento.
Un client potrebbe dover acquisire sia un blocco di connessione che un blocco controller prima di eseguire un set di operazioni di I/O in un dispositivo di destinazione. Il blocco di connessione impedisce a un secondo client che condivide l'accesso allo stesso dispositivo di destinazione di eseguire operazioni di I/O nel dispositivo e il blocco del controller impedisce ai client di altri dispositivi sul bus di eseguire operazioni di I/O su questi altri dispositivi. Le operazioni di I/O che non si verificano mentre questi blocchi vengono mantenuti vengono semplicemente posticipate fino al rilascio dei blocchi.
Quando un client acquisisce sia un blocco di connessione che un blocco controller per un dispositivo di destinazione in un SPB, il client deve acquisire il blocco di connessione prima di acquisire il blocco del controller e deve rilasciare il blocco del controller prima di rilasciare il blocco di connessione. Dopo che un client acquisisce un blocco di connessione, il client può, se necessario, acquisire e rilasciare il blocco del controller tutte le volte necessario prima che il client rilasci il blocco di connessione.
Le acquisizioni annidate di un blocco di connessione non sono valide. Dopo che un client ha acquisito un blocco di connessione, il client non deve tentare di acquisire di nuovo il blocco fino a quando il client non rilascia per la prima volta il blocco. Analogamente, le acquisizioni annidate di un blocco controller non sono consentite.