Char Device e Major comune
Salve, vorrei chiedere un parere agli esperti del forum.
Vorrei riproporre un quesito che ho posto su un altro forum specializzato ma che non mi è stata data risposta, e mi servirebbe devvero saperla.
Allora sto implementando due virtual device driver per un progetto. (lo stesso di un altro post più vecchio)
I Device sono dei Char Device. Entrambi sono uguali per le strutture interne, cambia solo una singola funzione nella write. Quello che vorrei chidere, è se si può fare questo:
E' possibile allocare dinamicamente un char device, così da ottenere un Major, e utilizzare quest'ultimo per il secondo device, ma allocando invece un minor dinamico.
Spiego meglio
Device 1: allocco un Major Dinamico
Device 2: utilizzo il Major allocato precedentemente dall'altro device, allocando invece un Minor diverso ad entrambi
Es:
Device 1: Major allocato 47 Minor 52
Device 2: Major 47 Minor 56
All'inizio utlizzavo la struttura dei Misc Device così questi problemi non gli avevo (Major fisso a 10, e minor dinamico), ma ho duvuto cambiare, quindi vorrei simulare lo stesso principio dei misc.
Con alloc_chrdev_region() non capisco se allocca dinamicamente un major e un pool di minor, che collegano sempre allo stesso device, o se allo stesso major posso attaccare altri minor di device differenti,
Visto che mi siete stati di aiuto l'ultima volta, spero anche questa.
Ringrazio chi aiuta
Vorrei riproporre un quesito che ho posto su un altro forum specializzato ma che non mi è stata data risposta, e mi servirebbe devvero saperla.
Allora sto implementando due virtual device driver per un progetto. (lo stesso di un altro post più vecchio)
I Device sono dei Char Device. Entrambi sono uguali per le strutture interne, cambia solo una singola funzione nella write. Quello che vorrei chidere, è se si può fare questo:
E' possibile allocare dinamicamente un char device, così da ottenere un Major, e utilizzare quest'ultimo per il secondo device, ma allocando invece un minor dinamico.
Spiego meglio
Device 1: allocco un Major Dinamico
Device 2: utilizzo il Major allocato precedentemente dall'altro device, allocando invece un Minor diverso ad entrambi
Es:
Device 1: Major allocato 47 Minor 52
Device 2: Major 47 Minor 56
All'inizio utlizzavo la struttura dei Misc Device così questi problemi non gli avevo (Major fisso a 10, e minor dinamico), ma ho duvuto cambiare, quindi vorrei simulare lo stesso principio dei misc.
Con alloc_chrdev_region() non capisco se allocca dinamicamente un major e un pool di minor, che collegano sempre allo stesso device, o se allo stesso major posso attaccare altri minor di device differenti,
Visto che mi siete stati di aiuto l'ultima volta, spero anche questa.
Ringrazio chi aiuta

Risposte
Vorrei riproporre un quesito che ho posto su un altro forum specializzato ma che non mi è stata data risposta, e mi servirebbe devvero saperla
Tutto dipende da come hai implementato il (i?) driver. Se sono due driver separati o meno. Io credo tu possa tranquillamente usare un numero major singolo; ricorda che è una convenzione, e che ci sono interfacce apposta - che mi sembra tu conosca già.
Parti da qui
http://www.makelinux.net/ldd3/
la parte che ti interessa è nel capitolo 3. Ma già che ci sei leggi tutto, ché ti fa bene

PS. Quando cerchi informazioni tecniche da reperire in rete, soprattutto linux-related (o *nix), imposta zio google in inglese, sennò ci invecchi... e salta a piè pari forum di Ubuntu e simili

grazie della risposta.
Il libro che mi dici, lo conosco, è il minimo per scrivere device.
Spiego meglio il problema:
C'è un unico modulo che regitra e deregistra due device.
I device sono due entità a se, hanno l'inode registrato in aree di memoria separate, le strutture sono equivalenti (per ragioni di semplicità ho fatto tutto separato), la cosa che cambia è una funzione (cripta e decripta rispetto ad un altro post).
Voglio registrare dinamicamente i device e utilizzare lo stesso major allocato per entrambi.
Ho pensato ad alcune possibilità ma sono un po' "sporche", tipo passare con un funzione interna il dev_t (major) allocato, ma penso ci siano metodi migliori, come uno script che legge "proc/devices".
Cmq penso che modifico le strutture interne per farle confluire in un modulo quasi univoco.
Intanto grazie.
SP (solo per):
Non dico il nome del forum, ma è di per se è molto ben organizzato e qualificato per l'ambiente Linux, solo che sta volta non hanno dato risposta. Infatto evito come la peste i forum "*nix-bimbi"
EDIT:
Risolto il problema, era piuttosto banale.
Praticamente registro due device, e passo il major con una funzione.
La versione on-line del libro che mi hai linkato è davvero comoda, non so perchè ma mi erano sfuggite delle parti nella versione PDF che mi hanno fatto capire qualcosa di sbagliato. Quindi grazie
Il libro che mi dici, lo conosco, è il minimo per scrivere device.
Spiego meglio il problema:
C'è un unico modulo che regitra e deregistra due device.
I device sono due entità a se, hanno l'inode registrato in aree di memoria separate, le strutture sono equivalenti (per ragioni di semplicità ho fatto tutto separato), la cosa che cambia è una funzione (cripta e decripta rispetto ad un altro post).
Voglio registrare dinamicamente i device e utilizzare lo stesso major allocato per entrambi.
Ho pensato ad alcune possibilità ma sono un po' "sporche", tipo passare con un funzione interna il dev_t (major) allocato, ma penso ci siano metodi migliori, come uno script che legge "proc/devices".
Cmq penso che modifico le strutture interne per farle confluire in un modulo quasi univoco.
Intanto grazie.

SP (solo per):
Non dico il nome del forum, ma è di per se è molto ben organizzato e qualificato per l'ambiente Linux, solo che sta volta non hanno dato risposta. Infatto evito come la peste i forum "*nix-bimbi"

EDIT:
Risolto il problema, era piuttosto banale.
Praticamente registro due device, e passo il major con una funzione.
La versione on-line del libro che mi hai linkato è davvero comoda, non so perchè ma mi erano sfuggite delle parti nella versione PDF che mi hanno fatto capire qualcosa di sbagliato. Quindi grazie

Praticamente registro due device, e passo il major con una funzione.
Ma così non è back-portable!


Lieto di essere stato (poco) utile.
PPS. La maggior parte dei forum Linux-related sono per l'uso (anche evoluto, amministrativo et al), non per la programmazione kernel, che ha forum specifici.
Ma così non è back-portable!
Scusa cosa intendi che non è portabile?
Rilassati. Era solo una battuta "non funziona con kernel precedenti" - in genere però si dice di una cosa nuova se è fatta bene, della serie "si sei stato bravo... ma se la metti sul kernel 2.2.x non funziona!"

Mi fai spaventare
Cmq non portrebbe funzionare anche per altri motivi in versioni precedenti della 2.6, per mutex ecc
Vorrei però chiedere un altro parere, sempre sullo stesso argomento, senz aprire altri post.
Visto che i device sono equivalenti, tranne che per una funzione. Volevo far confluire il codice in un unico file (e far usare con un flag oppurtuno o una o l'altra funzione)
E chiamando dal modulo la funzione per creare i device, dar loro due nuove istanze con minor diverso.
Ma facendo così il segmento codice, il segmento variabili globali statiche punteranno alla stessa istanza, perdendo la prima allocazione del device, avendo una sola funzione di creazione.
Volevo sapere se è possibile a livello di compilazione avere un unico file di codice ma dar loro indirizzamenti diversi.
O se no, cercare di non far sovrascrivere le istanze create dal device1 con quelle del device2, perchè i nomi delle varibili statiche essendo uguali puntano allo stesso segmento codice.
La soluzione banale è copiare in due file diversi e cambiar loro nome alle variabili (come ho fatto fin'ora).
compilando con nomi diversi ed unendoli in un unico modulo il make dice che ci sono (ovviamente) nomi di funzioni che si ripetono, come risolvo?
grazie a chi risponde.

Cmq non portrebbe funzionare anche per altri motivi in versioni precedenti della 2.6, per mutex ecc
Vorrei però chiedere un altro parere, sempre sullo stesso argomento, senz aprire altri post.
Visto che i device sono equivalenti, tranne che per una funzione. Volevo far confluire il codice in un unico file (e far usare con un flag oppurtuno o una o l'altra funzione)
E chiamando dal modulo la funzione per creare i device, dar loro due nuove istanze con minor diverso.
Ma facendo così il segmento codice, il segmento variabili globali statiche punteranno alla stessa istanza, perdendo la prima allocazione del device, avendo una sola funzione di creazione.
Volevo sapere se è possibile a livello di compilazione avere un unico file di codice ma dar loro indirizzamenti diversi.
O se no, cercare di non far sovrascrivere le istanze create dal device1 con quelle del device2, perchè i nomi delle varibili statiche essendo uguali puntano allo stesso segmento codice.
La soluzione banale è copiare in due file diversi e cambiar loro nome alle variabili (come ho fatto fin'ora).
compilando con nomi diversi ed unendoli in un unico modulo il make dice che ci sono (ovviamente) nomi di funzioni che si ripetono, come risolvo?
grazie a chi risponde.

Potresti semplicemente (sic) creare un modulo "core" e due moduli per le funzioni, e sarebbe tutto snello. Ma probabilmente devi riscrivere un po' di codice ex-novo.
Si dai ho fatto una cosa del genere.
Ho lasciato il codice così com'è, senza usare nomi specifici, e creato una piccola interface che si diversifica per ogni device, 10 righe di codice e tutto funzia.
Non so scrivere i problemi qua e dopo cercarli di risolvere, mi sembrano più semplici
Grazie davvero di tutto, sia per questo problema che per l'altro post
Ho lasciato il codice così com'è, senza usare nomi specifici, e creato una piccola interface che si diversifica per ogni device, 10 righe di codice e tutto funzia.
Non so scrivere i problemi qua e dopo cercarli di risolvere, mi sembrano più semplici

Grazie davvero di tutto, sia per questo problema che per l'altro post

"ham_burst":
Non so scrivere i problemi qua e dopo cercarli di risolvere, mi sembrano più semplici
Questo forum evidentemente "ispira"
