In un moderno sistema operativo, i driver di dispositivo hanno due scopi:
- Sono un livello di astrazione
- Sposta le operazioni potenzialmente pericolose dal codice utente e nei servizi di sistema attendibili
È importante ricordare questi due scopi quando si considera ciò che è e non è necessario o consigliabile quando si considera l'utilizzo dei driver di periferica. Ora, analizzando la tua domanda in dettagli:
if your application wants to communicate with some device, it cannot communicate directly with the port that your device is connected to
destro. Questo è dovuto alla parte "Operazioni potenzialmente pericolose". Comunicare con una porta seriale, a seconda dell'hardware esatto su cui stai lavorando, richiede:
- inviando o richiedendo dati sui segnali "IO" del processore o scrivendo o leggendo da specifiche posizioni di memoria associate alla porta
- intercettare i segnali di interruzione dalla porta per farti sapere quando i dati sono disponibili, quando il buffer interno è vuoto, ecc.
In genere, queste risorse sono condivise tra più porte, quindi se il tuo processo potrebbe eseguire una di queste operazioni direttamente, sarebbe in grado di interferire con qualsiasi altro processo che potrebbe utilizzare altre porte. Pertanto, è richiesto un intermediario che si accerti che esegua solo azioni che non causino problemi con altre parti del sistema. Il driver del dispositivo è un tale intermediario.
But rather, you should create a device driver that is allowed to communicate with the serial port, and then your application will communicate with the device driver.
Di solito non è necessario. I sistemi operativi sono forniti con driver per porta seriale, quindi non è necessario crearne uno da soli. In generale, le applicazioni utente non dovrebbero mai avere bisogno di fornire driver di periferica: i driver di periferica sono una funzione di sistema associata all'hardware su cui eseguono, non alle applicazioni che vogliono usarlo. Questo si riferisce allo scopo del "livello di astrazione": esistono diversi tipi di porta seriale e il driver del dispositivo sa in dettaglio come parlare al tipo effettivo installato sul computer. La tua applicazione ha solo bisogno di sapere come parlare con il driver del dispositivo, e il tuo sistema operativo fornisce un'interfaccia standard che lo consente senza dover sapere quale driver esatto è in uso.
Now my question is: when the device driver is sending data to the serial port, does it send the data directly to the serial port, or does the serial port itself have a device driver, and to send data to the serial port, your device driver have to send data to the device driver for the serial port.
Di solito non è necessario. Hai solo bisogno di un driver di dispositivo per raggiungere entrambi gli obiettivi:
- Il driver di periferica è installato con il sistema in modo che possa variare a seconda dell'hardware disponibile, fornendo l'astrazione
- Il driver di periferica fa parte del sistema operativo ed è considerato affidabile dal kernel che non consente alle applicazioni di interferire con le operazioni reciproche
Detto questo, c'è un caso che è simile alla situazione che descrivi, dove potresti voler avere un driver di dispositivo specifico dell'applicazione che invia dati al driver di dispositivo specifico dell'hardware. Cioè se hai un dispositivo che ti colleghi al computer tramite una porta seriale, ma quale vuoi che l'applicazione consideri logicamente come separato dalla porta seriale - forse perché potresti voler essere in grado per produrre una gamma di dispositivi che hanno lo stesso comportamento, ma forse c'è una versione di porta seriale, una versione USB, una versione di porta parallela, ecc. In tal caso, potrebbe essere utile creare un secondo driver che fornisca un secondo livello di astrazione ( in questo caso astrarre i dettagli di come il dispositivo esterno è collegato piuttosto che il modo in cui la porta a cui è connesso funziona). Un esempio di questo (ora un po 'relegato alla storia, per fortuna) è il modo in cui si è stati in grado di ottenere mouse collegati tramite porte seriali. Avrebbero un driver che implementava i protocolli standard del mouse e che comunicava con il driver della porta seriale per comunicare effettivamente.