Delphi o FreePascal.
Citazione da: "cdimauro"Delphi o FreePascal.E sono dei linguaggi talmente usati nello sviluppo di driver da obbligare a complicare l'interfaccia per poterli supportare?Oppure solo una minoranza di driver è programmata così, e si potrebbe usare un wrapper, qualcosa come questo ?
Poi è da vedere dove il driver deve essere eseguito. Se il modulo sta in user mode, uno può usare il linguaggio che vuole perchè ci saranno le apposite API, che penso saranno quasi sicuramente in stile C.Attualmente sto implementando dei "driver" che stanno in kernel mode, quindi è plausibile che siano scritti nello stesso linguaggio del kernel.
Cerca di dare una sistemata anche ai commenti appena puoi: un misto di italiano e inglese non è proprio il massimo. :oops:
Per il momento il problema degli ID delle mailbox rimandalo. Assumi che a ogni eseguibile / applicazione sia associato un ID univoco, e sei a posto per ora.
Riguardo al message passing, non lo userei sempre. Francamente mi affiderei ai registri della CPU, riservandone un po' alla scopo quando c'è da effettuare una syscall. Messaggi più complessi useranno il classico paradigma ID messaggio + lunghezza + dati. In pratica l'ID del messaggio ti indica se è semplice o complesso; ad esempio usando il bit più significativo.
questa soluzione e' usata con successo anche dal vecchio VxWorks v5 che ho sulla 2x68060 board di Eltec.
Per quelli asincroni ho pensato a una soluzione a doppio buffer per i risultati. Il processo / thread utente si smazza un buffer (coda) tutto in user-space, senza interferenze da parte del kernel; si tratta di una lista di messaggi che ha già caricato il kernel tempo fa, e che il processo può smazzarsi direttamente senza usare lock, semafori, ecc. Nel frattempo il kernel riempie il secondo buffer con le nuove richieste, in maniera del tutto indipendente. Quando il processo finisce tutti i messaggi del primo buffer, invoca una syscall; a questo punto il kernel scambia i due buffer (scambia i puntatori alle due aree) e restituisce al processo il puntatore al nuovo buffer che deve processare. E così via.
Qualcosa di simile si potrebbe realizzare anche per le chiamate asincrone, dove il processo le deposita in un buffer, e quando questo si riempie invoca una syscall per dare in pasto al kernel l'intero bundle da processare. La syscall provvede, al solito, a scambiare i due buffer e restituire al processo il puntatore al nuovo buffer da riempire.
Si può pensare a diversi buffer allocati in base alla diverse priorità / esigenze. E magari ad API che devono essere processate con urgenza, e non passano da nessun meccanismo di buffering.
Ricorda, comunque, che col doppio buffer non devi azzerare alcunché: basta spostare il puntatore indietro, all'inizio del buffer, per ricominciare a scrivere messaggi man mano.
Questo kernel possiamo anche anche provarlo sulla 68060 board con 8Mbyte di ram, o sulla Atlas MIPSR32-r2 con 128Mbyte di ram,
oppure con a una versione mignon (in puro C) sulla 68HC11, uno schedino che volendo potrei produrre con almeno 40Kbyte di ram.