Char Device e Major comune

hamming_burst
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 :)

Risposte
Rggb1
Vorrei riproporre un quesito che ho posto su un altro forum specializzato ma che non mi è stata data risposta, e mi servirebbe devvero saperla
Come ho già detto altre volte, accidenti ai forum di Bubuntu-kids!

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 :-D

hamming_burst
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 :)

Rggb1
Praticamente registro due device, e passo il major con una funzione.

Ma così non è back-portable! :-D :-D

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.

hamming_burst
Ma così non è back-portable!


Scusa cosa intendi che non è portabile?

Rggb1
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!" ;)

hamming_burst
Mi fai spaventare :D

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. :)

Rggb1
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.

hamming_burst
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 :-D

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

Rggb1
"ham_burst":
Non so scrivere i problemi qua e dopo cercarli di risolvere, mi sembrano più semplici :-D

Questo forum evidentemente "ispira" ;)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.