|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
Comunicazione da kernel a userspace
ho montato un simpatico modulo basato su lsf. il problema ora è che devo comunicare un paio di cose al un demonuccio in userspace...
di usare proc non se ne parla, il povero demonuccio richierebbe di non riuscire a leggere tutto in tempo. af_unix? o ci sono altre alternative? ciao! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
uppete!
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
connector
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
su Windows è molto più facile
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
ed è anche molto versatile perché dal driver si può scegliere il tipo di I/O (direct, buffered, neither) senza che cambi nulla nel programma usermode |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
Quote:
un po` meno la documentazione in Documentation/connector , ma mi accontentero` :-D la parte client sembra molto semplice, ora giochero` un po` con l'esempio. grazie, ciao! |
|
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Il problema di NA01 può essere risolto in maniera più semplice, con il connector. Mi chiedevo se sotto windows esistesse qualcosa di simile
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
|
|
|
|
|
|
#10 | |||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
questo sistema però non è consigliato perché bypassa il sistema di sicurezza del PnP Manager: il driver che crea quei link simbolici deve poi gestirsi da se' la sicurezza di quella periferica associando ad essa un descrittore di sicurezza costruito manualmente. quando invece la periferica non ha nome ne' link simbolici (cosa consigliata) allora affinché sia accessibile da usermode deve essere stata registrata una device interface, sulle quali però non so quasi nulla ^^ penso che quando registri la device interface, semplicemente il PnP Manager crea un symlink alla periferica e costruisce automaticamente un descrittore di sicurezza che la protegga da accessi non autorizzati (di solito i nomi del PnP Manager sono composti da hash kilometrici, hai presente no? Quote:
![]() su Windows ha senso per tutte... per "tipo di IO" io intendo semplicemente (su Windows) il modo in cui il programma user mode comunica i suoi dati al driver, che è un modulo caricato nel processo del kernel (il processo System, che ha PID = 8); i tre funzionano così: bufferizzato - l'IO Manager prima di chiamare l'highest driver nello stack ricopia tutti i dati in un buffer bloccato in memoria di sistema (kernel space, non-paged pool) e quindi "sicuro"; ovviamente è la soluzione più dispendiosa e la si mette in atto solo per periferiche che devono trasferire pochi dati diretto - il driver deve mappare in memoria di sistema il buffer usermode (soliti trucchetti col paging); il buffer usermode non è considerato sicuro perché nel frattempo un altro thread potrebbe deallocarlo, quindi dopo che tale buffer è stato mappato in kernel space è comunque necessario accedervi dentro un try-catch per evitare schermata blu, o quantomeno chiamare prima la ProbeForRead e ProbeForWrite per vedere se si può ancora leggere/scrivere su quel buffer neither - uguale a diretto, solo che il kernel garantisce che il thread corrente al momento della chiamata al driver sia lo stesso che ha effettuato la richiesta in userland; di conseguenza non c'è bisogno di mappare il buffer in kernel space per accedervi perché da kernel mode si può tranquillamente accedere allo user space del thread corrente. è comunque bene circondare con try-catch su Linux sono IDENTICI? ![]() chi ha copiato? Quote:
![]() come può essere? sono ridotte all'osso...
Ultima modifica di 71104 : 15-06-2006 alle 15:32. |
|||
|
|
|
|
|
#11 | ||||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Quote:
Quote:
Quote:
Al programma userspace, un messaggio inviato da/al kernel tramite il connector è molto simile a un datagramma udp.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
||||
|
|
|
|
|
#12 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
ora capisco la "everything is a file" : ) Quote:
![]() comunque leggere e scrivere non è l'unico tipo di I/O che si può effettuare su una periferica su Windows: c'è anche l'API DeviceIoControl, e certe periferiche supportano anche altri tipi (sostanzialmente varianti di device I/O control, notifiche relative ad accendimento/spegnimento/standby, e poca altra roba). ne approfitto per chiederti una cosa che non sono mai riuscito a capire: che tipo di modello è il kernel di Linux? monolitico? microkernel? microkernel modificato (come Windows)? sapevo che fosse monolitico ma poi un amico che non conosce molto bene questa terminologia mi ha confuso le idee... ^^ |
||
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Quote:
Ad un programma la differenza tra char e block device non è molto evidente (un cat /dev/zero funziona come un cat /dev/hda), ma influenza profondamente come è strutturato il driver. Ci sono molti altri modi di comunicare con un driver; il connector che ho suggerito a NA01 è uno dei più recenti, ed è un derivato di una tecnica più datata chiamata "netlink". Quote:
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 Ultima modifica di ilsensine : 15-06-2006 alle 17:07. |
||
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4739
|
Quote:
apparentemente, il metro di paragone piu' comune per distinguere i microkernel dai "macrokernel" e' il range di funzionalita' che vengono fatte assolvere al kernel (task scheduling e basta, scheduling piu' paging e basta, scheduling piu' paging piu' filesystem piu' networking piu' device management e tutti i driver, ecc...), e il numero e livello delle "astrazioni" che il kernel implementa (microkernel puro <=> processi) mentre quello per distinguere quelli puramente monolitici dagli altri e' il modo in cui nuovi componenti software, per funzionalita' aggiuntive o supporto di corrispettivi nuovi componenti HW, possono essere aggiunti ad un sistema a runtime (se ricompilando il kernel dopo aver aggiunto una patch o marcato attivo un ramo del source tree o aggiungendo un modulo al kernel o cambiando una variabile di configurazione e/o (ri) avviando un proesso userland) altro metro di paragone e' a livello delle differenze tra le API, dell' invarianza o meno a livello di API e di ABI ... ma in effetti influenza le implementazioni e il behaviour nei casi di cui sopra tutto AFAIK
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
Ultima modifica di jappilas : 15-06-2006 alle 17:26. |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:47.





















